Сбой при обработке удаленного уведомления, когда приложение не запущено

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

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

Но когда приложение закрыто и получает удаленное уведомление, оно падает, как только открывается. Я ошибаюсь в том, как настраиваю 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];
}

person Prasanna    schedule 28.11.2010    source источник


Ответы (3)


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

Проблема заключалась в следующих строках. Я отправлял 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];
person Prasanna    schedule 28.11.2010

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

person damithH    schedule 08.06.2012
comment
Это решило мою проблему на данный момент, но почему это?! Не имеет смысла для меня - person Evils; 26.02.2014
comment
Как вы сказали, для меня тоже нет смысла. но я думаю, что здесь есть какая-то связь с устройством и Mac. - person damithH; 03.03.2014

Вы неправильно инициализируете приложение при получении уведомления. Измените метод application: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;
}
person vakio    schedule 28.11.2010
comment
Спасибо за ответ, Вакио. Хотя вопрос в другом. Пожалуйста, посмотрите, как я решил это. - person Prasanna; 29.11.2010
comment
Да, я подумал, что это странно, но я не понял этого. Прости. - person vakio; 03.12.2010