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

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

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

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

Ответ 1

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

Проблема была в следующих строках. Я отправил в 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];

Ответ 2

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

Ответ 3

Вы не правильно инициализируете свое приложение при получении уведомления. Измените приложение: 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;
}