【问题标题】:iOS Silent Push Notification not delivered after device reboot设备重启后未发送 iOS 静默推送通知
【发布时间】:2020-02-19 20:28:51
【问题描述】:

在测试向我的应用程序发送静默通知(在负载中具有“内容可用”:1 的通知)时,我注意到,在设备重新启动后,通知不会发送。如果应用程序在后台或前台运行,则发送相同的有效负载有效,但是在设备重新启动后,我没有收到 AppDelegate 中的 didReceiveRemoteNotification: 回调。

这在 iOS 13 和 iOS 12 上都会发生

【问题讨论】:

  • 我在静默推送通知中遇到了同样的问题,它在设备重启后没有到达,但是,我能够接收带有通知部分的正常推送通知。

标签: ios apple-push-notifications ios13 silent-notification


【解决方案1】:

简而言之:

您的通知可能被系统延迟了,几分钟后就会送达。您可以使用 Console.app 过滤系统日志并尝试找出幕后发生的事情。

更多细节:

经过几次尝试,我对操作系统的传递机制有了一些了解,这有助于理解场景下发生的事情。

通过在 macOS 上使用 Console.app,选择您连接的设备并过滤名为 "dasd" 的进程的日志,其中包含您的包标识符(输入 @ 987654323@ ) 我发现系统实际上收到了远程静默通知,但取消了唤醒我的应用程序的尝试。

default    15:37:29.955974+0200    dasd    Submitted Activity: com.apple.pushLaunch.YOUR_BUNDLE_ID:7BAB0E at priority 5 <private>
default    15:37:29.958436+0200    dasd    Adding a launch request (<private>) for application <private> by activity <private>
default    15:37:29.958611+0200    dasd    Launch requests for <private>: (null)
default    15:37:29.972714+0200    dasd    com.apple.pushLaunch.YOUR_BUNDLE_ID:7BAB0E:[
    {name: ThunderingHerdPolicy, policyWeight: 1.000, response: {Decision: Must Not Proceed, Score: 0.00, Rationale: [{timeSinceThunderingHerdTriggerEvent < 300}]}}
 ], FinalDecision: Must Not Proceed}
default    15:37:33.505325+0200    dasd    Submitted Activity: com.apple.pushLaunch.YOUR_BUNDLE_ID:B3D6C8 at priority 5 <private>
default    15:37:33.509388+0200    dasd    Adding a launch request (<private>) for application <private> by activity <private>
default    15:37:33.509515+0200    dasd    Launch requests for <private>: <private>
default    15:37:33.509778+0200    dasd    Daemon Canceling Activities: {(
    com.apple.pushLaunch.YOUR_BUNDLE_ID:7BAB0E
)}
default    15:37:33.510334+0200    dasd    CANCELED: com.apple.pushLaunch.YOUR_BUNDLE_ID:7BAB0E at priority 5 <private>!
default    15:37:33.510514+0200    dasd    Removing a launch request for application <private> by activity <private>
default    15:37:33.510693+0200    dasd    Don't have <private> for type 0
default    15:37:33.510865+0200    dasd    Don't have <private> for type 1
error    15:37:33.511162+0200    dasd    Activity <private> not tracked as being started, ignoring it

更准确地说,我发现操作系统执行了两个策略

  • BootTimePolicy 在启动后至少需要 120 秒才能发送通知
{name: BootTimePolicy, policyWeight: 0.010, response: {Decision: Must Not Proceed, Score: 0.00, Rationale: [{[Minimum seconds after boot]: Required:120.00, Observed:103.62},]}}
  • ThunderingHerdPolicy,在这种情况下,在发生神秘的“ThunderingHerd”事件后至少需要 300 秒
    {name: ThunderingHerdPolicy, policyWeight: 1.000, response: {Decision: Must Not Proceed, Score: 0.00, Rationale: [{timeSinceThunderingHerdTriggerEvent < 300}]}}], FinalDecision: Must Not Proceed}

之后,按照日志流,我注意到系统不断评估此ThunderingHerdPolicy 多次,300 秒后,静默通知有效地传递到我的应用程序! ?✌?

因此,如果您正在测试静默通知的传递,请记住在某些情况下它可能会被系统延迟(正如 Apple 在 docs 中所说的那样)。 设备重启后发生这种情况。

请注意,此行为并未正式记录在案,并且可能会在未来的 iOS 版本中发生变化。您不应依赖它,而应仅将其用于调试目的。

【讨论】:

  • 请注意,如果用户强制关闭应用程序,静默通知将被完全忽略。但是,如果您在 300 秒后收到通知,则重新启动设备与强制关闭应用程序不同。
猜你喜欢
  • 2018-02-17
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
相关资源
最近更新 更多