iOS推送通知和AppDelegate方法行为

时间:2017-02-24 15:49:22

标签: ios push-notification apple-push-notifications appdelegate

我对大量的stackoverflow问题和网站进行了一些研究,试图弄清楚iOS推送通知如何影响AppDelegate生命周期方法以及何时触发哪种方法(而不是)。该研究的主要焦点是“标准”iOS推送通知(包含alert字段)和静默通知(仅content-available设置为1)和AppDelegate的application:didReceiveRemoteNotificationapplication:didFinishLaunchingWithOptions方法。

我不想针对不同的场景提出很多问题,而是宁愿写下我试过的不同测试用例的陈述,然后问你:

Is there any statement that is wrong and if yes, which one and why?

场景1:通过点击主页按钮,已使用应用程序并将其置于后台。

  1. 如果发送标准推送通知,则在推送通知到达时,没有任何方法被触发,应用程序在后台保持非活动状态。一旦点击推送通知并且应用程序被打开,就会调用application:didReceiveRemoteNotification方法并且不会调用application:didFinishLaunchingWithOptions。我在将应用程序放到后台以及应用程序在后台运行超过一个小时之后立即测试了这种情况 - 相同的行为。我想如果由于某些原因iOS决定在后台使用我的应用程序时,这个测试用例就像Scenario 2,声明1来自下面,对吧?

  2. 如果发送无声推送通知,则在推送通知到达时,调用application:didReceiveRemoteNotification方法并且不会调用application:didFinishLaunchingWithOptions

  3. 场景2:通过从正在运行的应用列表中滑动来使用和杀死应用。

    1. 如果发送标准推送通知,则在推送通知到达时,没有任何方法被触发,应用程序仍然被杀死。一旦点击了推送通知并且应用程序被打开,就会调用application:didReceiveRemoteNotification方法并且不会调用application:didFinishLaunchingWithOptions

    2. 如果发送静默推送通知,则无法触发任何方法,因为静默推送通知无法发送到被杀死的应用程序。在发送通知后打开应用程序后,application:didFinishLaunchingWithOptions将作为正常流程的一部分进行调用,并且没有任何推送通知信息。 application:didReceiveRemoteNotification不会被调用。

    3. 如果您可以想到其他一些我可能忘记提及的现实生活场景,我会非常感激地了解它们以及在这些情况下会发生什么。

      干杯

      更新#1

      感谢Sandeep Bhandari的更新和其他方案。我忘记在原来的问题中提到我正在探索应用程序到达当前not的应用程序的场景,无论出于何种原因。

      将Sandeep的场景添加到列表中:

      场景3:正在使用应用程序并且推送通知到达。

      1. 如果发送标准推送通知,则会调用application:didReceiveRemoteNotification方法。 application:didFinishLaunchingWithOptions不会被调用。

      2. 如果发送静默推送通知application:didReceiveRemoteNotification方法将被调用。 application:didFinishLaunchingWithOptions不会被调用。

      3. 场景4:应用程序在后台运行。

        1. 如果发送标准推送通知,则会调用application:didReceiveRemoteNotification方法。 application:didFinishLaunchingWithOptions不会被调用。

        2. 如果发送静默推送通知application:didReceiveRemoteNotification方法将被调用。 application:didFinishLaunchingWithOptions不会被调用。

2 个答案:

答案 0 :(得分:7)

  

从iOS推送通知的经验和挖掘。应用   在前景中或在背景中活着。两种情况都会触发   相同的代表方法。只有didReceiveRemoteNotification

无声推送通知有不同的处理程序:( content-available 1表示无提示通知)

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    }

当应用程序死了。 didReceiveRemoteNotification从未要求定期推送通知。它必须在didFinishLaunchingWithOptions中处理如下:

// handle notification when app is closed.
let notification = launchOptions?[.remoteNotification]
if notification != nil {
    self.application(application, didReceiveRemoteNotification: notification as! [AnyHashable : Any])
}

其他信息:

在应用被杀时测试接收推送通知。从双击主页按钮时出现的列表中删除?

查看日志记录并进行调试的正确方法是编辑运行方案并选择等待可执行文件启动

enter image description here

从xcode运行应用程序。然后从服务器发送推送通知,然后点击通知中心的通知。

答案 1 :(得分:1)

我在你的声明中没有看到任何问题,但我相信你错过了我能想到的两个以上的场景。

  1. 应用程序位于前台并收到推送通知: didReceiveRemoteNotification会在APNS被发送到iOS后立即被调用,您可以通过检查{{中的应用程序状态来处理它1}}方法。

  2. 应用程序在后台运行:我相信您了解iOS的后台模式。如果应用程序正在使用到期处理程序,即使您通过点击主页按钮将其置于后台,应用程序也将处于活动状态。应用程序在后台运行的持续时间取决于各种因素(一些教程称应用程序保持活动状态3分钟,我无法保证)即使在这种情况下,只要APNS被提交到iOS,didRecieveRemoteNotification就会被调用。只有这一次应用程序不会在前景但它还活着!!!