XCode:为什么didFinishLaunchingWithOptions中的launchOptions总是为零?

我希望我的应用程序在通过点击通知启动应用程序时执行特定的操作。 当应用程序已经运行到后台时,我想要做这些特定的事情,但是当通过点击通知启动应用程序从SCRATCH(不运行到后台)。

当通过点击通知从后台启动应用程序时,我通过以下方式获取通知:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 

=>没有问题!

当通过点击通知从头开始的应用程序,我想通过以下方式获得通知:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; } 

但launchOptions总是零! 当应用程序从头开始通过点击应用程序图标(正常),而且当通过点击通知(非正常)从头开始时,该应用程序为零。

任何人都知道如何解决这个问题?

谢谢 !!!

编辑1

这是我的通知如何创build(乔问题):

  NSDictionary *userInfo = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects:notifText,latitudeString,longitudeString,nil] forKeys:[NSArray arrayWithObjects:@"notifText",@"latitude",@"longitude", nil]]; UILocalNotification *localNotif = [[UILocalNotification alloc] init]; localNotif.fireDate = itemDate; localNotif.timeZone = [NSTimeZone defaultTimeZone]; localNotif.alertBody =msg; localNotif.alertAction = @"Ok"; localNotif.soundName = UILocalNotificationDefaultSoundName; localNotif.applicationIconBadgeNumber = 1; localNotif.userInfo = userInfo; [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; [localNotif release]; 

编辑2(回答我的问题:))

这里是我用来debugging我的应用程序,但是…这个程序是错误的!

  1. 我在“Edit Scheme”菜单中设置了我的debugging器,其中包含“等待MyApp.app启动”选项
  2. 我第一次使用XCode启动我的应用程序(从头开始)XCode显示“等待MyApp启动”=>我点击我的应用程序图标启动应用程序
  3. 该应用程序启动=>我点击主页button=>通知显示
  4. 我点击XCode中的停止button来closures应用程序,我用XCode重新启动它=> XCode再次显示“等待我的MyApp启动”消息=>我点击状态栏中的通知来启动应用程序
  5. => launchOptions是零!

launchOptions等于零,是因为重新启动应用程序与XCode(在这种情况下,“等待我的MyApp启动”选项)即使它仍然显示在状态栏中删除通知…

为了能够在通过点击通知从头开始重新启动应用程序之后检查launchOptions的内容是什么,似乎唯一的方法就是像在Tammo Freese的回答中提到的那样,在UIAlert中显示这个内容。 所以,在这个特定的情况下使用以下来debugging:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"options" message:[launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; return YES; } 

感谢你的帮助 !!!!

我在你分享的代码中找不到错误。 通常这应该在模拟器和设备上都可以工作。 下面是一个适用于我的例子:首先生成一个新的Single View iPhone应用程序(ARC和Storyboards)。 然后更改AppDelegate两个方法,如下所示:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"options" message:[launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; return YES; } - (void)applicationDidEnterBackground:(UIApplication *)application { [[UIApplication sharedApplication] cancelAllLocalNotifications]; UILocalNotification *localNotif = [[UILocalNotification alloc] init]; localNotif.fireDate = [NSDate dateWithTimeInterval:10.0 sinceDate:[NSDate date]]; localNotif.timeZone = [NSTimeZone defaultTimeZone]; localNotif.alertBody = @"Just some text"; localNotif.alertAction = @"OK"; localNotif.soundName = UILocalNotificationDefaultSoundName; localNotif.applicationIconBadgeNumber = 1; localNotif.userInfo = @{@"test": @YES}; [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; } 

然后启动这个应用程序,按主页button,然后停止应用程序。 如果您点击主页button后10秒内出现的本地通知,您应该看到类似这样的内容,这表明本地通知已经传递给了-application:didFinishLaunchingWithOptions: ::

iPhone模拟器的屏幕截图显示了一个显示本地通知的警报视图

我的build议是:首先得到我上面发布的例子,以确保你的设置没有任何错误,然后检查你在代码中做了什么不同。

编辑

这适用于问题的编辑2:在等待应用程序启动(在模拟器中,而不是在设备上)时,本地通知似乎也适用于我。 尝试这个:

  1. 安装上述示例应用程序,并启动“等待MyApp.app启动”禁用。
  2. 点击主页button,然后通过Xcode或通过任务栏停止应用程序。
  3. 启用“等待MyApp.app启动”。
  4. 如果您现在点击通知中心的通知,则会显示在警报视图中。

不知道这是你要找的东西,但是你是否错过了“返回YES”? 因为我用这个从通知中执行一个新的视图,它工作正常

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UINavigationController *navigation = (UINavigationController *) self.window.rootViewController; [navigation.visibleViewController performSegueWithIdentifier:@"Ident" sender:nil]; return YES; } 

我的结论和build议是否可以帮助任何人,请参阅下文

每当你有新的构buildtesting你的应用程序,你必须testing通知点击操作与最新的应用程序生成的通知。 如果您继续使用旧版本生成的旧通知对点击操作进行testing,那么它会performanceexception(意味着它可以启动应用程序,但不会返回任何有效的信息在didFinishLaunchingWithOptions 🙂

请原谅我,对于苹果的推送通知服务,我还是个新手,但是我通过他们的文档进行了一些阅读,我的猜测是在创build本地通知时可能会导致问题。

我将仔细检查如何使用Apple的示例创build本地通知,如清单2-1所示,只是为了排除这种可能性。 由于用于创build本地通知的一些代码在此线程中未显示给我们,因此难以评估本地通知的实例是否确实正确。 它可能最终会像启动date或通知中的其他内容不正确设置那样简单。