【问题标题】:Why is didReceiveRemoteNotification not called but didReceiveRemoteNotification:fetchCompletionHandler called when my app is in the foreground?为什么在我的应用程序处于前台时没有调用 didReceiveRemoteNotification 但调用了 didReceiveRemoteNotification:fetchCompletionHandler?
【发布时间】:2015-07-07 21:29:02
【问题描述】:

如果我覆盖

override func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    println("hey)
}

当我发送推送通知时,我成功地在前台调用了应用程序的方法。

如果我覆盖

override func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    println("hey")
}

在前台使用应用程序发送通知时,我没有收到对该方法的任何调用。为什么第一个有效,而第二个在应用程序处于前台时无效?

请注意,我一次只实现其中一个。不能同时进行。

【问题讨论】:

    标签: ios swift apple-push-notifications appdelegate


    【解决方案1】:

    你应该使用回调版本,除非你需要支持 ios

    较旧的方法可以追溯到 ios3 并且除了名称之外的所有方法都已弃用:

    尽可能实现application:didReceiveRemoteNotification:fetchCompletionHandler: 方法而不是这个方法。如果您的委托实现了这两种方法,则应用对象将调用application:didReceiveRemoteNotification:fetchCompletionHandler: 方法。

    旧版本还会根据应用是处于活动状态(前台还是后台)还是从冷启动启动而给出不同的结果。在后一种情况下,它不会被调用,您需要拦截 didFinishLaunchingWithOptions 上的 launchOptions dict 以获取 infoDict:

    如果远程通知到达时应用程序未运行,该方法将启动应用程序并在启动选项字典中提供适当的信息。应用程序不会调用此方法来处理该远程通知。

    使用回调版本。它适用于所有情况。 你不必使用完成处理程序/块,在这种情况下效果是一样的(嗯,更符合新的方法)。

    更新

    抱歉,Apple 说您确实必须“尽快”调用完成块 - 在操作系统放弃您之前,您有 30 秒的时间这样做。这可能是您警告的来源。

    完成通知处理后,您必须在处理程序参数中调用该块,否则您的应用将被终止。您的应用程序有最多 30 秒的挂钟时间来处理通知并调用指定的完成处理程序块。在实践中,您应该在处理完通知后立即调用处理程序块。

    所以调用完成块:

            completionHandler(UIBackgroundFetchResult.NoData)
    

    我一直在使用此方法没有调用该完成块并且没有遇到任何问题,但为了安全起见,我现在将添加一个。 Apple 建议,如果您不这样做,您的应用将不会被前景化,但我在实践中没有看到。

    【讨论】:

    • 我在不使用完成处理程序时收到警告。我应该忽略它吗?
    • @AdamJohns - 你得到什么警告?什么版本的 XCode/Swift?
    【解决方案2】:

    您是否向UIApplication:registerUserNotificationSettings: 注册了至少一个UIUserNotificationType

    如果您没有注册徽章、声音或警报,那么您只能接收静默通知,这些通知仅通过 FetchCompletionHandler 传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多