хотел воспроизвести мой звуковой файл при возникновении события уведомления, а затем остановить

#iphone #objective-c #uidatepicker #uilocalnotification

#iPhone #objective-c #uidatepicker #uilocalnotification

Вопрос:

Я создаю будильник, в котором я хочу, чтобы при наступлении выбранного времени через Datepicker вместо появления только уведомлений и значков я хотел воспроизвести свой пользовательский звуковой файл, то есть jet.wav (он длится менее 30 секунд и в формате .wav).я хочу, чтобы, как только произойдет мое уведомление, он должен воспроизводить звук, и когда я нажимаю на приложение или вид оповещения, он должен остановиться. Итак, кто-нибудь может мне помочь. вот что я пытаюсь :-

Код:-

 @class The420DudeViewController;

@interface The420DudeAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    The420DudeViewController *viewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet The420DudeViewController *viewController;

extern NSString *kRemindMeNotificationDataKey;






@implementation The420DudeAppDelegate

@synthesize window;
@synthesize viewController;

NSString *kRemindMeNotificationDataKey = @"kRemindMeNotificationDataKey";

#pragma mark -
#pragma mark === Application Delegate Methods ===
#pragma mark -



- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    Class cls = NSClassFromString(@"UILocalNotification");
    if (cls) {
        UILocalNotification *notification = [launchOptions objectForKey:
                                             UIApplicationLaunchOptionsLocalNotificationKey];

        if (notification) {
            NSString *reminderText = [notification.userInfo 
                                      objectForKey:kRemindMeNotificationDataKey];
            [viewController showReminder:reminderText];
        }
    }

    application.applicationIconBadgeNumber = 0;

    [window addSubview:viewController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    application.applicationIconBadgeNumber = 0;
}

- (void)application:(UIApplication *)application 
didReceiveLocalNotification:(UILocalNotification *)notification {

    application.applicationIconBadgeNumber = 0;
    NSString *reminderText = [notification.userInfo
                              objectForKey:kRemindMeNotificationDataKey];
    [viewController showReminder:reminderText];
}

- (void)dealloc {
    [viewController release];
    [window release];
    [super dealloc];
}


@end




@interface The420DudeViewController : UIViewController {

    IBOutlet UINavigationBar *titleBar;
    IBOutlet UIButton *setAlarmButton;
    IBOutlet UIDatePicker *selectTimePicker;
    AVAudioPlayer *player;

}

@property(nonatomic, retain) IBOutlet UINavigationBar *titleBar;
@property(nonatomic, retain) IBOutlet UIButton *setAlarmButton;
@property(nonatomic, retain) IBOutlet UIDatePicker *selectTimePicker;

-(IBAction)onTapSetAlarm;
- (void)showReminder:(NSString *)text;

@end




@implementation The420DudeViewController

@synthesize titleBar,setAlarmButton,selectTimePicker;


#pragma mark -
#pragma mark === Initialization and shutdown ===
#pragma mark -

- (void)viewDidLoad {
    [super viewDidLoad];
    selectTimePicker.minimumDate = [NSDate date];
}

- (void)viewDidUnload {

    [super viewDidUnload];
    self.setAlarmButton = nil;
    self.selectTimePicker = nil;
}
/*
-(void)viewWillAppear:(BOOL)animated
{
    NSString *path = [[NSBundle mainBundle]pathForResource:@"Song1" ofType:@"mp3"];
    NSURL *url = [NSURL fileURLWithPath:path];

    player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
//  [player play];
}
 */
-(IBAction)onTapSetAlarm
{
    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    Class cls = NSClassFromString(@"UILocalNotification");
    if (cls != nil) {

        UILocalNotification *notif = [[cls alloc] init];
        notif.fireDate = [selectTimePicker date];
        notif.timeZone = [NSTimeZone defaultTimeZone];

        notif.alertBody = @"Did you forget something?";
        notif.alertAction = @"Show me";
        notif.repeatInterval = NSDayCalendarUnit;
    //  notif.soundName = UILocalNotificationDefaultSoundName;
        notif.soundName = [[NSBundle mainBundle]pathForResource:@"jet" ofType:@"wav"];
        notif.applicationIconBadgeNumber = 1;

        NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"Mayank"
                                                             forKey:kRemindMeNotificationDataKey];
        notif.userInfo = userDict;

        [[UIApplication sharedApplication] scheduleLocalNotification:notif];
        [notif release];
    }

/*
NSDateFormatter *timeFormat = [[NSDateFormatter alloc] init];
[timeFormat setDateFormat:@"HH:mm a"];

NSDate *selectedDate = [[NSDate alloc] init];
selectedDate = [selectTimePicker date];

NSString *theTime = [timeFormat stringFromDate:selectedDate];

UIAlertView *alert = [[UIAlertView alloc]
                      initWithTitle:@"Time selected" message:theTime delegate:nil cancelButtonTitle:@"YES" otherButtonTitles:nil];

[alert show];
[alert release];
//  [timeFormat release];
//  [selectedDate release];

 */
}


#pragma mark -
#pragma mark === Public Methods ===
#pragma mark -

- (void)showReminder:(NSString *)text {

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Reminder" 
                                                        message:@" TEXT " delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
    [alertView show];
    [alertView release];
}

- (void)dealloc {
    [super dealloc];
    [titleBar release];
    [setAlarmButton release];
    [selectTimePicker release];
}

@end
  

Ответ №1:

Согласно документации для soundName , вы должны

укажите имя файла (включая расширение) звукового ресурса в основном пакете приложения

Таким образом, я предлагаю вам изменить эту строку -[The420DudeViewController onTapSetAlarm] :

     notif.soundName = [[NSBundle mainBundle]pathForResource:@"jet" ofType:@"wav"];
  

к следующему:

     notif.soundName = @"jet.wav";
  

Комментарии:

1. Большое спасибо, на самом деле я такой дурак. Знаете ли вы еще одну вещь, на самом деле сигнал тревоги не появляется в нужное время.. иногда задержка составляет 15 секунд, а иногда и 50 секунд… (случайное время не определено), есть ли у вас какое-либо решение. это будет высоко оценено .. 🙂