我收到远程通知,并根据通知类型更改导航控制器的视图控制器。
当应用程序位于前台或应用程序位于后台但未完全关闭(来自多任务栏)时,一切正常。
但是,当应用关闭并收到远程通知时,它会在打开后立即崩溃。我在设置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];
}
答案 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;
}