应用程序didReceiveLocalNotification未触发iOS7

Ase*_*mov 10 iphone xcode uilocalnotification ios7

问题:

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
Run Code Online (Sandbox Code Playgroud)

有时用iOS7不会调用.它不会影响我们如何安排通知:

alarm.fireDate = [[NSDate date] dateByAddingTimeInterval:0.1];
[app scheduleLocalNotification:alarm];
Run Code Online (Sandbox Code Playgroud)

要么:

[app presentLocalNotificationNow:alarm];
Run Code Online (Sandbox Code Playgroud)

我的想法:当用户在通知警报动画完成之前滑动时会发生这种情况.如果他在滑动之前等待半秒钟 - 通知被解雇,应用程序按预期进行.问题可能是应用程序在收到通知之前进入前台.

有没有人见过这个?这是一个错误吗?有解决方案吗 谢谢!

Enr*_*tyo 14

您的应用程序是在后台还是前台?如果它在前台,我很确定该方法被调用.如果不是,也许您没有将该方法放在您的应用程序委托中.

如果是在后台,这里有几种可能的情况:

  1. 您的应用已被用户或操作系统杀死.在这种情况下,当用户通过点击通知中心上的通知(或在锁定屏幕中滑动)唤醒您的应用程序时,您的应用程序委托将具有application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions所谓的方法.您可以通过以下方式获取此方法的通知:

    [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

  2. 您的应用程序位于后台,用户点击通知中心或锁定屏幕中的通知.在这种情况下,不会调用任何委托方法.文档特别说明didReceiveLocalNotification:了应用程序在前台的时间:

如果应用程序在前台运行,则没有警报,徽章或声音; 相反,如果委托实现它,则调用application:didReceiveLocalNotification:方法.

因此,希望您能够在收到通知时做出明智的决定.我个人觉得当用户通过点击图标(而不是通知)启动应用程序时,我们没有获得通知对象,这有点奇怪.但我现在只是围绕它编写我的逻辑.


ali*_*-hk 8

Apple在其文档(本地和远程通知编程指南)中明确提到,根据应用程序处于什么状态以及用户采取的操作(如Enrico所述),可以调用不同的方法.

摘要:

  • 用户点击iOS 8通知中的自定义操作按钮. 在这种情况下,iOS调用application:handleActionWithIdentifier:forRemoteNotification:completionHandler:或application:handleActionWithIdentifier:forLocalNotification:completionHandler:.在这两种方法中,您都会获得操作的标识符,以便您可以确定用户点击的按钮.您还可以获得远程或本地通知对象,以便您可以检索处理该操作所需的任何信息.
  • 用户点击警报中的默认按钮或点击(或点击)应用图标....系统启动应用程序,应用程序调用其委托的应用程序:didFinishLaunchingWithOptions:方法,传入通知有效负载(用于远程通知)或本地通知对象(用于本地通知)....
  • 当应用程序在前台运行时,将传递通知.该应用程序调用UIApplicationDelegate方法应用程序:didReceiveLocalNotification:或application:didReceiveRemoteNotification:fetchCompletionHandler:.

所以didReceiveLocalNotification仅在应用程序已经运行且位于前台时触发.您还应该处理未运行的第二个场景,其中apple具有以下代码示例:

Objective-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;
}
Run Code Online (Sandbox Code Playgroud)

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
            }
    }
    .
    .
    .
}
Run Code Online (Sandbox Code Playgroud)