静默推送消息,如果应用程序处于后台并拔下电源,则无法做出反应

Posted

技术标签:

【中文标题】静默推送消息,如果应用程序处于后台并拔下电源,则无法做出反应【英文标题】:Silent push message, can´t react if app is in background and unplugged 【发布时间】:2015-02-02 13:58:31 【问题描述】:

我正在尝试对静默推送消息做出反应。我在我的 plist 文件中为我的应用注册了两种背景模式。

我将以下 json 发送到我的应用程序:


"aps": 
     "content-available": 1
,
"Bla": "Blub"

如果我的应用程序在前台,一切正常。当我收到推送时,我在我的代码中执行了一个函数。如果我的应用程序在后台并插入我的 Mac 或 ac,一切都很好......但是如果我拔掉我的设备,设备将无法获取,或者至少我的函数不再被调用......为什么会这样?

【问题讨论】:

【参考方案1】:

我理解静默通知的工作方式是它们可以发送,系统可能会收到它们,但可能不会根据不同的因素对它们采取行动。

静默通知用于给人一种在节能设备上执行多任务的错觉。我的理解是,系统使用一些因素来确定是否应该将静默通知传递给应用程序,其中包括:

当前网络状况 当前功率水平 应用程序使用情况。 用户选择 可能耗电。

在您的情况下,静默通知在前台工作,因为您是最重要的应用程序。用户可能正在执行不立即涉及内容的任务。但内容更新可能很有用。例如,使用 Facebook,我可能会在朋友墙上写一篇文章,我的提要中有新故事。很高兴在我做其他事情的时候更新它。

对于连接到计算机的情况 - 设备正在充电,执行后台任务不会消耗设备电池。

要详细说明因素:

网络状况

如果设备使用 wi-fi,则更有可能允许网络通话,因为这不像使用蜂窝数据那样耗电。

当前功率水平

这也与网络状况有关。 是否在相关无线电已开启时收到通知? 这也可能与基于设备历史记录的当前位置相关联。如果该位置被确定为“家”,则可以假定该设备靠近电源。 时间也可能是其中的一个因素。例如“设备开始充电的平均时间是多少,是否关闭等。” 设备是否已连接到电源?

应用程序使用情况

用户使用您的应用程序的频率如何?使用模式是什么? 是否在允许应用更新其内容的时间收到通知?一个可能的例子是,用户可能会在接下来的 10 分钟到 1 小时内使用该应用程序。更新内容可能是有意义的。但如果用户有可能在接下来的 2 分钟或 2 小时内使用该应用程序。它可能会推迟此操作,因为它可能很快由用户启动或不会很快使用,这会浪费资源。

用户选择

用户可以随时选择停止后台数据刷新。 用户可以选择不允许您的应用使用蜂窝数据。 虽然超出了您的问题的范围,但我认为应该注意的是,不应假定静默通知总是通过,也不应成为您的应用程序的关键部分。

可能的电力消耗

与其他因素相比,我认为这不存在,但需要牢记。 您在执行此后台任务时,过去的耗电量如何? 如果您是一个好公民,尽可能提高能源效率等,您可能更有可能被要求更新。 但是,如果您在执行此任务时在系统视图中没有尽可能节能,您可能不会收到太多通知。

据我所知,这些因素不是确定的、证明的或陈述的。我根据 WWDC 会谈、之前的背景任务限制和我自己的假设将它们作为可能的原因提出。但我希望它们能帮助您了解为什么您的静默通知在某些情况下有效,而在其他情况下无效。

【讨论】:

感谢您提供的信息...这听起来很可靠...我也进行了一些研究,并确定在 ios 7 中并非如此。我想知道为什么 Apple 从 iOS8 开始这样做。 .@Naughty_Ottsel @Naughty_Ottsel 由于静默通知取决于很多因素,这是否表明我们不应该使用它?我正在测试静默通知,它在后台运行良好。但是,第二天,该应用程序停止接收它。发现当设备连接xcode时,没有问题。但是,一旦设备断开连接,它就无法工作。是否有任何可能的破解方法来解决这个问题?我正在使用 ios 11.4

以上是关于静默推送消息,如果应用程序处于后台并拔下电源,则无法做出反应的主要内容,如果未能解决你的问题,请参考以下文章

iOS 静默推送通知失败并显示消息

静默通知上的 iOS 后台发布请求

在 iOS 中处理静默推送通知的最佳方法是啥

应用程序处于非活动状态时无法接收静默通知 iOS

推送静默远程通知:当应用程序在后台运行时取消警报

如果应用程序被杀死,则使用 firebase 发送静默推送通知以唤醒应用程序