【问题标题】:iOS push notifications and AppDelegate methods behaviouriOS 推送通知和 AppDelegate 方法行为
【发布时间】:2017-07-15 12:47:36
【问题描述】:

我对许多 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 决定在后台杀死我的应用程序,这个测试用例就会变成场景 2,下面的语句 1,对吧?

  2. 如果发送静默推送通知,在推送通知到达的那一刻,application:didReceiveRemoteNotification 方法被调用,application:didFinishLaunchingWithOptions 不被调用。


场景 2:应用已被使用并通过从正在运行的应用列表中滑出而终止。

  1. 如果发送标准推送通知,在推送通知到达的那一刻,没有任何方法被触发,应用程序保持被杀死。一旦点击推送通知并因此打开应用程序,application:didReceiveRemoteNotification 方法就会被调用,application:didFinishLaunchingWithOptions 不会被调用。

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


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

干杯


更新 #1

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

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


场景3:应用正在使用,推送通知到达。

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

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


场景 4:应用在后台运行。

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

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


【问题讨论】:

  • 我想发表一点评论......你说“通过将其从正在运行的应用程序列表中滑出而被杀死”,这不太准确。该列表不仅显示正在运行的应用程序。这是一个最近使用的列表。即使应用已被终止,它们仍然可以在此列表中。

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


【解决方案1】:

来自对 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)我已经在生产中使用应用程序对其进行了测试,如果其中一些方法被触发并简单地杀死应用程序并向我的设备发送推送通知到生产中的应用程序,它应该以不同的方式触发后端服务器。 2)我已经按照您在此屏幕截图中描述的完全相同的方式测试了应用程序的调试版本:我已经安装了应用程序,通过滑动将其杀死,然后我从 Xcode 运行等待可执行文件启动并在等待时发送通知。
  • 先生。 @hasan83 但不适合我。我的意思是,如果我点击应用程序图标,launchOptions?[.remoteNotification] 将不起作用,因为 launchOptions 将为 nil。只有在通过点击通知中心的通知打开应用程序时,您的答案才有效。当应用程序终止时,我收到通知并点击应用程序图标而不是点击通知时,有什么方法可以处理这种情况?
  • 所以你是说当收到通知时你通过点击应用程序图标自行打开应用程序?
  • @rafaelbpa 这不是 iOS 的行为方式。手动打开应用程序将不允许您访问通知。无法访问它。该应用程序从来不知道它。唯一的方法是通过您调用的api来检查是否有。但这不是通常应用的用户体验!
【解决方案2】:

我认为您在那里所做的声明中没有任何问题,但我相信您错过了重复我能想到的另外两个场景。

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

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

【讨论】:

  • 啊,是的。抱歉,我实际上忘了提到我的重点是在应用程序不在前台时传递的通知。将更新我的问题。谢谢你的第二种情况,我忘了。我也会用它来更新我的问题,以便更好地了解我们已经详细说明的场景。非常感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 2011-08-07
相关资源
最近更新 更多