当前位置: 首页 > 知识库问答 >
问题:

静默推送通知仅在设备正在充电和/或应用程序处于前台状态时提供

汪玮
2023-03-14

我已经实现了无声推送通知,但我注意到了一些奇怪的行为。静默推送通知通过以下方式处理:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

只有当设备正在充电(即连接电缆)和/或我的应用程序处于前台时,才会收到静默推送消息。

如果我断开设备与充电器(或Mac)的连接,则不再收到静默推送通知,除非应用程序处于前台。

在这两种情况下,我通常都会收到非静默推送通知。

如果我再次插入USB电缆,那么无论应用程序是前台还是后台,都会收到预期的行为和静默推送通知。

我正在使用UILocalNotification,以便知道收到了什么。

事实上,它与连接的设备一起工作正常,这表明我的静默推送通知配置正确,并且应用程序在plist中设置了正确的后台模式等。

这种行为在运行IOS 8或8.1的iPhone 5s、6和iPad 2上都可以重复。

还有其他人经历过吗?它应该很容易复制。为什么将设备插入充电器的简单操作会改变接收静默推送通知的能力?

共有3个答案

阎建中
2023-03-14

我也遇到过同样的问题,在应用程序未充电时未收到推送通知的原因是当从设置启用低功耗模式时

这防止设备接收消息推送。

此链接可能有用。Apple文档

谭宜
2023-03-14

随着iOS8的出现,应用程序的后台推送已发生变化。后台推送现在只会在特定情况下发送到应用程序。苹果没有明确说明这些情况到底是什么,但从我的大量实验来看,基本上可以归结为手机是否充电。还有一些其他变量(如网络类型、设备类型、启用wifi)在起作用,但主要因素是推送到达时设备是否正在充电。

如果手机通过直接电源充电,或者通过USB连接到电脑间接充电,那么绝大多数情况下,后台推送都会传送到应用程序。但是,断开手机与电源或USB的连接,后台推送几乎永远不会传送到应用程序,即使手机的电池是100%充电的。

你可以很容易地测试这一点,只需在手机充电时发送一些推力,而不是在不充电时。但您必须考虑到,开发构建和使用沙盒环境的后台推送与生产构建和生产环境的后台推送的行为不同,后台推送实际上更有可能被交付到正在开发的应用程序中,而不是在生产中,因此使用生产版本和苹果的生产环境进行测试以查看实际结果至关重要。

请注意,推送有两个步骤,第一步是它需要被传送到手机本身,第二步是一旦手机拥有了它,它就需要通过操作系统传送到应用程序。在iOS7中,Wifi上的图灵等功能增加了推送手机的机会。然而,对于iOS8,即使推送成功地传送到手机,如果手机没有充电,操作系统也不会将推送转发到后台应用。这意味着,如果手机没有充电,手机会收到通知并保持它,有时会保持几个小时,然后再将其转发到应用程序。

於宏大
2023-03-14

我们经历了同样的行为,并一直试图理解为什么iOS决定提供一些通知而不是其他通知。

到目前为止,我们得出的结论是:

>

  • 在wifi上比在蜂窝数据上更可靠地在后台接收消息。事实上,在蜂窝网络(3g/4g)上,如果您的信号强度不够强,iOS会收到推送消息,但不会唤醒您的应用程序。我们在苹果论坛上发布了关于它的信息:https://devforums.apple.com/message/1069814#1069814.我们还打开了一张支持票,支持团队告诉我们将其作为错误报告提交,我们几周前就这样做了,目前仍在等待回复。

    当收到推送消息时,需要尽快调用fetchCompletionHandler。从技术上讲,你有30秒的时间来执行后台处理,但iOS有一个公式,根据你发送推送消息的频率,以及你在将应用程序返回暂停状态之前处理这些消息的时间,iOS可以减少你的应用程序在未来被唤醒的次数。

    请参见Apple DidReceiveEmotentification:fetchCompletionHandler:文档:

    处理完通知后,必须调用handler参数中的块,否则应用程序将被终止。你的应用程序最多有30秒的挂钟时间来处理通知并调用指定的完成处理程序块。实际上,您应该在处理完通知后立即调用处理程序块。系统会跟踪应用程序后台下载的运行时间、用电量和数据成本。在处理推送通知时使用大量电量的应用程序可能并不总是在处理未来的通知时提前唤醒。

    在我们的测试中,我们经常向应用程序发送静默推送通知(每10-30秒一次)。在我们让它重新进入睡眠状态之前,该应用程序处于唤醒状态大约3秒钟。我们肯定已经注意到,随着时间的推移,我们的应用程序被唤醒的频率会下降,以至于iOS只会每隔15-30分钟唤醒一次应用程序。因此,似乎有某种衰变/节流公式,但我们找不到任何关于其具体工作原理的文档。我们要求苹果提供这个公式和变量作为支持请求,但他们说“你要求的信息不公开”,并再次要求我们提交错误报告。

    所以,希望这能有所帮助?我们仍在努力学习更多,这就是为什么我发现了这个问题:)

  •  类似资料: