应用程序未运行时处理远程通知时崩溃

时间:2010-11-28 03:07:22

标签: iphone objective-c push-notification apple-push-notifications

我收到远程通知,并根据通知类型更改导航控制器的视图控制器。

当应用程序位于前台或应用程序位于后台但未完全关闭(来自多任务栏)时,一切正常。

但是,当应用关闭并收到远程通知时,它会在打开后立即崩溃。我在设置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 个答案:

答案 0 :(得分:15)

我解决了这个问题,并且它与视图控制器无关,正如我想的那样。

问题在于以下几行。我发送的是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];

答案 1 :(得分:7)

如果您关闭从xcode调试模式开始的应用程序,并且当应用程序以推送通知(已关闭的应用程序)启动时,如果您的手机连接到mac(仍然是您的手机处于调试模式下使用xcode),它将会崩溃。用拔掉的电话测试这个senario。

答案 2 :(得分:2)

您在收到通知时未正确初始化您的应用程序。 将应用程序: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;
}