有时我的应用的本地通知会被触发(显示)两次。我不使用模拟器,而是使用真实设备。我一直试图让一个repro步骤,但我无法做到。每次我使用断点/ nslog执行该过程时,我总是会收到1个通知。有了这个,我假设我只会显示/触发1个通知。但是,有时我会收到两个通知。 我在互联网上搜索了答案,但我得不到多少信息。这里有没有人经历过同样的事情?你是怎么解决这个问题的?
- (void)scheduleAllNotifications
{
if (_isEnabled && [[NSUserDefaults standardUserDefaults] boolForKey:NotificationsUserDefaultsKey]) {
[self updateFireDates];
for (NSDate *fireDate in fireDates) {
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = fireDate;
notification.alertBody = @"Message";
notification.alertAction = @"View";
notification.soundName = @"notificationsound.mp3";
[notifications addObject:notification];
[[UIApplication sharedApplication]scheduleLocalNotification:notification];
}
}
}
- (void)cancelAllNotifications
{
[[UIApplication sharedApplication] cancelAllLocalNotifications];
[notifications removeAllObjects];
}
- (void)updateFireDates
{
[fireDates removeAllObjects];
NSDate *now = [NSDate date];
NSDate *fireDate = [NSDate dateWithTimeInterval:THREEDAYS sinceDate:now];
if (fireDate){[fireDates addObject:fireDate];}
}
每次应用变为活动状态时都会调用cancelAllNotifications 每次应用程序重新启动活动时都会调用shceduleAllNotifications
答案 0 :(得分:4)
Bart Doe是对的,这些都是之前测试运行中的偏离通知。
要解决此问题,请在[[UIApplication sharedApplication] cancelAllLocalNotifications];
内的AppDelegate中调用- (void)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
,以清除之前的所有预定通知。
答案 1 :(得分:2)
由于您似乎处于项目的构建/调试阶段,如果这些双重通知实际上是旧的,那么我不会感到惊讶。碰巧我认为该设备创建了奇怪的,流浪的通知,实际上在开发/测试期间我自己创建了错误的。
您可以做的是在userInfo字段中添加一些额外的调试信息。您可以将构建号放在那里,或创建日期/时间,那种东西。然后在通知触发时记录这些。
但您可能确实遇到过一个错误: local notification "didReceiveLocalNotification" calls twice