应用程序didReceiveLocalNotification未触发iOS7

时间:2013-10-08 09:34:38

标签: iphone xcode ios7 uilocalnotification

问题:

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
iOS7有时不会调用

。 它并不会影响我们安排通知的方式:

alarm.fireDate = [[NSDate date] dateByAddingTimeInterval:0.1];
[app scheduleLocalNotification:alarm];

或:

[app presentLocalNotificationNow:alarm];

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

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

2 个答案:

答案 0 :(得分:14)

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

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

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

    [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

  2. 您的应用程序位于后台,用户点击通知中心或锁定屏幕中的通知。在这种情况下,没有delegate methods will be called。该文档明确指出didReceiveLocalNotification:适用于应用程序位于前台的时间:

  3.   

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

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

答案 1 :(得分:8)

Apple在他们的文档中明确提到(Local and Remote Notification Programming Guide),根据应用程序的状态和用户采取的操作(如Enrico所提到的那样)调用不同的方法。

要点:

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

所以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
            }
    }
    .
    .
    .
}