问题:
- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
iOS7有时不会调用。 它并不会影响我们安排通知的方式:
alarm.fireDate = [[NSDate date] dateByAddingTimeInterval:0.1];
[app scheduleLocalNotification:alarm];
或:
[app presentLocalNotificationNow:alarm];
我的想法: 在用户在通知警报动画完成之前滑动的情况下会发生这种情况。 如果他在滑动之前等待半秒钟 - 通知被解雇,应用程序按预期进行。 问题可能是应用程序在收到通知之前进入前台。
有没有人见过这个?这是一个错误吗?有解决方案吗谢谢!
答案 0 :(得分:14)
您的应用程序是在后台还是前台?如果它在前台,我很确定该方法被调用。如果不是,也许您没有将该方法放在您的应用程序委托中。
如果是在后台,这里有几种可能的情况:
您的应用已被用户或操作系统杀死。在这种情况下,当用户通过点击通知中心上的通知(或在锁定屏幕中滑动)唤醒您的应用程序时,您的应用程序代表将调用application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法。您可以通过以下方式获取此方法的通知:
[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
您的应用程序位于后台,用户点击通知中心或锁定屏幕中的通知。在这种情况下,没有delegate methods will be called。该文档明确指出didReceiveLocalNotification:
适用于应用程序位于前台的时间:
如果应用程序在前台运行,则没有警报,徽章, 或声音;相反,应用程序:didReceiveLocalNotification:方法 如果委托实现它,则调用它。
因此,希望您能够在收到通知时做出明智的决定。我个人觉得当用户通过点击图标(而不是通知)启动应用程序时,我们没有获得通知对象有点奇怪。但我现在只是写下我的逻辑。
答案 1 :(得分:8)
Apple在他们的文档中明确提到(Local and Remote Notification Programming Guide),根据应用程序的状态和用户采取的操作(如Enrico所提到的那样)调用不同的方法。
要点:
所以didReceiveLocalNotification只在应用程序已经运行且位于前台时触发。您还应该处理第二个没有运行的场景,其中apple有以下代码示例:
目标C:
- (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotif) {
NSString *itemName = [localNotif.userInfo objectForKey:ToDoItemKey];
[viewController displayItem:itemName]; // custom method
app.applicationIconBadgeNumber = localNotif.applicationIconBadgeNumber-1;
}
[window addSubview:viewController.view];
[window makeKeyAndVisible];
return YES;
}
Swift(由我自己提供的近似值):
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if let localNotification = launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification {
if let itemName = localNotification.userInfo?[ToDoItemKey] as? String {
handleNotification(localNotification)
application.applicationIconBadgeNumber = localNotification.applicationIconBadgeNumber - 1
}
}
.
.
.
}