如果两个本地通知具有相同的开火时间且应用程序位于后台,那么didReceiveLocalNotification仅被调用一次

这很容易重现 – 看起来像iOS的错误? 如果它是一个function,那么如何判断是否已接受第二个通知?


更新:此范围不限于具有相同开火日期的两个或多个通知,它们可以具有任何开火日期,但如果它们都在应用程序处于后台时到期,那么它仍然是相同的结果 – didReceiveLocalNotification仅被调用一次。


如果使用相同的触发日期安排两个本地通知,并且应用程序位于后台(applicationDidEnterBackground:是最后一个要调用的方法),那么这是通知触发时发生的一系列步骤:

1)向用户显示两个通知

2)用户点击第一个通知

3)applicationWillEnterForeground:作为步骤2的结果被调用

4)didReceiveLocalNotification:被调用

5)applicationDidBecomeActive:未被调用,直到第6步才会进一步发生

6)用户点击第二个通知

7)现在,作为步骤6的结果,调用applicationDidBecomeActive

8)在步骤6之后第二次不调用didReceiveLocalNotification

这样做的结果是应用程序不会收到用户接受多个本地通知的任何指示。

这很容易重现 – 创建一个新项目,添加以下代码,运行然后在通知触发之前退出应用程序。

(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSLog(@"didFinishLaunchingWithOptions"); self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; NSDate* date = [[NSDate alloc] initWithTimeIntervalSinceNow:20]; UILocalNotification *notif1 = [[UILocalNotification alloc] init]; notif1.fireDate = date; notif1.timeZone = [NSTimeZone defaultTimeZone]; notif1.alertBody = @"Notif1"; UILocalNotification *notif2 = [[UILocalNotification alloc] init]; notif2.fireDate = date; notif2.timeZone = [NSTimeZone defaultTimeZone]; notif2.alertBody = @"Notif2"; [[UIApplication sharedApplication] scheduleLocalNotification:notif1]; [[UIApplication sharedApplication] scheduleLocalNotification:notif2]; NSLog(@"Notifications scheduled"); return YES; } - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { NSLog(@"didReceiveLocalNotification: %@", notification.alertBody); } 

这是控制台输出:

2012-02-01 21:32:12.832 NotificationsTest [13223:f803] didFinishLaunchingWithOptions 2012-02-01 21:32:15.755 NotificationsTest [13223:f803]通知安排2012-02-01 21:32:15.756 NotificationsTest [13223:f803 ] applicationDidBecomeActive:2012-02-01 21:32:22.838 NotificationsTest [13223:f803] applicationWillResignActive:2012-02-01 21:32:22.840 NotificationsTest [13223:f803] applicationDidEnterBackground:

[显示两个通知,Notif2位于Notif1之上]

[用户观点Notif2]

2012-02-01 21:33:34.177 NotificationsTest [13223:f803] applicationWillEnterForeground:2012-02-01 21:33:34.179 NotificationsTest [13223:f803] didReceiveLocalNotification:Notif2

[用户观点Notif1]

2012-02-01 21:33:58.278 NotificationsTest [13223:f803] applicationDidBecomeActive:

应用程序如何获取第二个通知已过期的信息及其内容?