我对大量的stackoverflow问题和网站进行了一些研究,试图弄清楚iOS推送通知如何影响AppDelegate
生命周期方法以及何时触发哪种方法(而不是)。该研究的主要焦点是“标准”iOS推送通知(包含alert
字段)和静默通知(仅content-available
设置为1
)和AppDelegate的application:didReceiveRemoteNotification
和application:didFinishLaunchingWithOptions
方法。
我不想针对不同的场景提出很多问题,而是宁愿写下我试过的不同测试用例的陈述,然后问你:
Is there any statement that is wrong and if yes, which one and why?
如果发送标准推送通知,则在推送通知到达时,没有任何方法被触发,应用程序在后台保持非活动状态。一旦点击推送通知并且应用程序被打开,就会调用application:didReceiveRemoteNotification
方法并且不会调用application:didFinishLaunchingWithOptions
。我在将应用程序放到后台以及应用程序在后台运行超过一个小时之后立即测试了这种情况 - 相同的行为。我想如果由于某些原因iOS决定在后台使用我的应用程序时,这个测试用例就像Scenario 2,声明1来自下面,对吧?
如果发送无声推送通知,则在推送通知到达时,调用application:didReceiveRemoteNotification
方法并且不会调用application:didFinishLaunchingWithOptions
。
如果发送标准推送通知,则在推送通知到达时,没有任何方法被触发,应用程序仍然被杀死。一旦点击了推送通知并且应用程序被打开,就会调用application:didReceiveRemoteNotification
方法并且不会调用application:didFinishLaunchingWithOptions
。
如果发送静默推送通知,则无法触发任何方法,因为静默推送通知无法发送到被杀死的应用程序。在发送通知后打开应用程序后,application:didFinishLaunchingWithOptions
将作为正常流程的一部分进行调用,并且没有任何推送通知信息。 application:didReceiveRemoteNotification
不会被调用。
如果您可以想到其他一些我可能忘记提及的现实生活场景,我会非常感激地了解它们以及在这些情况下会发生什么。
干杯
感谢Sandeep Bhandari的更新和其他方案。我忘记在原来的问题中提到我正在探索应用程序到达当前not
的应用程序的场景,无论出于何种原因。
将Sandeep的场景添加到列表中:
如果发送标准推送通知,则会调用application:didReceiveRemoteNotification
方法。 application:didFinishLaunchingWithOptions
不会被调用。
如果发送静默推送通知application:didReceiveRemoteNotification
方法将被调用。 application:didFinishLaunchingWithOptions
不会被调用。
如果发送标准推送通知,则会调用application:didReceiveRemoteNotification
方法。 application:didFinishLaunchingWithOptions
不会被调用。
如果发送静默推送通知application:didReceiveRemoteNotification
方法将被调用。 application:didFinishLaunchingWithOptions
不会被调用。
答案 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])
}
其他信息:
在应用被杀时测试接收推送通知。从双击主页按钮时出现的列表中删除?
查看日志记录并进行调试的正确方法是编辑运行方案并选择等待可执行文件启动:
从xcode运行应用程序。然后从服务器发送推送通知,然后点击通知中心的通知。
答案 1 :(得分:1)
我在你的声明中没有看到任何问题,但我相信你错过了我能想到的两个以上的场景。
应用程序位于前台并收到推送通知: didReceiveRemoteNotification
会在APNS被发送到iOS后立即被调用,您可以通过检查{{中的应用程序状态来处理它1}}方法。
应用程序在后台运行:我相信您了解iOS的后台模式。如果应用程序正在使用到期处理程序,即使您通过点击主页按钮将其置于后台,应用程序也将处于活动状态。应用程序在后台运行的持续时间取决于各种因素(一些教程称应用程序保持活动状态3分钟,我无法保证)即使在这种情况下,只要APNS被提交到iOS,didRecieveRemoteNotification
就会被调用。只有这一次应用程序不会在前景但它还活着!!!