Сбой при обработке удаленного уведомления, когда приложение не запущено - PullRequest
8 голосов
/ 28 ноября 2010

Я получаю удаленное уведомление и в зависимости от типа уведомления меняю контроллеры вида контроллера навигации.

Все это прекрасно работает, когда приложение находится на переднем плане или когда приложение находится в фоновом режиме, но не полностью закрыто (из панели многозадачности).

Но, когда приложение закрыто и получает удаленное уведомление, оно вылетает, как только оно открывается.Я делаю неправильно с настройкой ViewControllers?

Вот код.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions {
   // Push required screens into navigation controller

         UILocalNotification *remoteNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];

    //Accept push notification when app is not open
    if (remoteNotif) {      
        [self handleRemoteNotification:application userInfo:remoteNotif.userInfo];
        return YES;
    }

    [window addSubview:navigationController.view];
    [window makeKeyAndVisible];

    return YES;
}

-(void) handleRemoteNotification:(UIApplication *)application userInfo:(NSDictionary *)userInfo {
    application.applicationIconBadgeNumber = 0;

NSMutableArray *viewControllers = [NSMutableArray array];
    [viewControllers addObject:driverWaitViewController];
    [viewControllers addObject:newJobsViewController];

    [navigationController setViewControllers:viewControllers];
}

Ответы [ 3 ]

15 голосов
/ 29 ноября 2010

Я решил это, и это не имеет ничего общего с контроллерами представления, как я думал.

Проблема была в следующих строках.Я отправлял в remoteNotif.userInfo, а не сам remoteNotif.Кроме того, remoteNotif явно не относится к типу UILocalNotification.Это объект NSDictionary.

До

UILocalNotification *remoteNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];

[self handleRemoteNotification:application userInfo:remoteNotif.userInfo];

Должно быть

NSDictionary *remoteNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];

[self handleRemoteNotification:application userInfo:remoteNotif];
7 голосов
/ 08 июня 2012

если вы закроете приложение, которое запускается из режима отладки xcode, и когда приложение запустится с push-уведомлением (закрытое приложение), если ваш телефон подключен к mac (все еще ваш телефон находится в режиме отладки с xcode), произойдет сбой. протестируйте этот senario с отключенным телефоном.

2 голосов
/ 28 ноября 2010

Вы неправильно инициализируете свое приложение при получении уведомления. Измените приложение: didFinishLaunchingWithOptions: метод на это:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions (NSDictionary *)launchOptions {
   // Push required screens into navigation controller

   NSDictionary *notif= [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];

   [window addSubview:navigationController.view];
   [window makeKeyAndVisible];

   //Accept push notification when app is not open
   if (notif) {      
       [self handleRemoteNotification:application userInfo:notif];
   }

   return YES;
}
...