推送通知需要很长时间才能到达

Push Notifications take too long to arrive

我在 iOS 和 Android 的 adobe air 应用程序中遇到推送通知的奇怪问题。

我正在使用 Milkman Games 的 Easy Push ANE 以及 One Signal 服务。

问题是通知确实会到达,但有时(随机)消息在发送后最多需要 15 分钟才能到达设备。

这对我的应用程序(出租车预订应用程序)至关重要,因为我依赖推送通知来实现出租车应用程序和用户应用程序之间的通信。因此,例如,如果用户请求出租车,出租车应用最多可能需要 15 分钟才能收到通知。

与 One Signal 支持人员交谈,根据他们的说法,他们这边一切正常,如果我查看 One Signal 仪表板,通知几乎总是立即发送。

延迟的原因可能是什么?我该怎么做才能让事情变得更好?

谢谢。

通常推送通知确实很快到达。但是在一些罕见的情况下,我们看到它们被延迟了:

Android 设备上的通知延迟:

  1. 一些家用和商用 wifi 路由器会导致设备与 Google 的 GCM 服务器的连接关闭。设备稍后重新打开连接并接收延迟的通知。 (此处讨论:https://groups.google.com/forum/#!topic/android-gcm/Y33c9ib54jY

  2. 某些自定义版本的 Android OS 具有节电设置,可能会导致通知延迟或被忽略。例如,Sony Xperia 设备有一个 "Stamina Mode"。 (此处讨论:https://talk.sonymobile.com/t5/Xperia-Z3-Compact/Notifications-not-Working-When-Phone-in-Sleep-Mode/td-p/879641

  3. 一些 Android 设备可以在电池电量不足时进入低电量模式,这可能会导致接收通知略有延迟。

iOS 设备上的通知延迟:

  1. 向使用开发配置文件构建的设备发送通知时,Apple 的 APNS 服务器有时可能速度较慢或不可靠。您可以比较使用 AdHoc 配置文件和生产推送证书构建的应用程序版本,看看它是否运行得更好。在不久的将来,Apple 将改变这个系统的工作方式,这样这个问题就会消失。

  2. 与 Android 一样,一些 wifi 路由器会导致 iOS 通知发送延迟。

  3. 如果为应用选中"Restrict background data"、在高级设置中打开 Wifi 优化或启用优先模式,通知可能会延迟。

WhatsApp 在其常见问题解答页面底部有一个很好的故障排除延迟 Android 和 iOS 通知说明列表:https://www.whatsapp.com/faq/en/android/20887936

总的来说,上述问题很少见,几乎所有用户都会及时收到通知。但是,对于您的特定用例,您可能会发现短信是更可靠的工具。

就我而言,在发送到 APNS 的有效负载中,我将“附件”属性 作为“”发送。当我将其更改为 null 时,问题就消失了。

替换

"attachment": ""

"attachment": null

我不知道为什么,但奇怪的是它导致通知延迟了 1.5 分钟左右。

我还在处理 phone 中大多数应用程序的延迟通知。最后,在互联网上搜索了很长时间,并尝试了一些常见的建议,如禁用电池优化、自适应通知和所有那些根本没有帮助的功能后,我找到了 XDA 开发者论坛,在那里我终于找到了这个问题的根源。

此问题是由称为“DOZE”的功能引起的,该功能自 Android 6.

起在 Android 核心中实现

https://developer.android.com/training/monitoring-device-state/doze-standby

基本上,它所做的是尝试以非常积极的方式保持 phone 电池寿命,基本上使所有应用程序和网络 activity 处于待机状态,直到维护 window发生。维护 window 是一个非常短的时间段,所有来自在队列中等待的应用程序的事件都会被立即处理,然后所有应用程序再次进入待机状态,直到下一次维护 window 发生。

问题在于,每次下一次维护 window 之间的间隔 windows 每次都会增加到某个长限制。因此,如果您很长时间没有触摸您的 phone,例如半小时并且事件发生,您将在下一次维护 window 中收到通知,这可能是从那一刻起的几十分钟.

不知道Google怎么办,这样就OK了。它不是!!对我来说,这导致我的外汇交易应用程序出现严重问题,事件发生时没有及时显示价格警报,而是在 5、15、30 分钟甚至将近 1 小时后显示价格警报!这对我没有用,因为交易的机会已经消失了...

因此解决方案是使用 ADB 命令手动禁用 phone 中的“DOZE”。我做到了并且有效,现在我收到即时通知。不幸的是,每次 phone 重新启动后都必须这样做,因为它会再次打开 DOZE。

这是包含更多详细信息的页面:

Android: completely disabling deviceidle ("Doze") in Android M?

基本上你只需发出这个 ADB 命令:dumpsys deviceidle disable

您也可以将该应用程序放入 Doze 白名单,但不确定它是否有效,当我显示该列表时,我发现我的交易应用程序已经存在,可能是因为我将其从电池节能政策中删除了,但是Doze 可能仍在暂停一切,因此它仅在那些维护 windows 中起作用。我猜它不会使用 DOZE 描述中描述的那些“高优先级 FCM 消息”来立即强制通知。

如果您不熟悉 ADB,这里有一些信息:

https://developer.android.com/studio/command-line/adb

我使用了一个付费应用程序,它允许直接从 phone 进行本地 ADB 连接,因此我可以在每次重启后禁用 DOZE。更多信息在这里:

https://forum.xda-developers.com/t/say-hello-to-ladb-a-local-adb-shell-without-needing-root-or-a-computer.4204855/

非常遗憾的是,作为即时通知的这一基本功能必须由用户通过开发人员调试界面修复,而不是 Google 可以在 OS 本身中修复它... Google 感到羞耻...

关于此主题的更多论坛:

https://forum.xda-developers.com/t/psa-how-to-fix-the-notification-delay-or-non-receipt-issue-truly-pathetic-of-google-and-samsung.4276505/

https://forum.xda-developers.com/t/delayed-notification-problems-s21-ultra.4243105/page-5

真心希望AndroidOS能够改善推送通知的延迟。如果您不触摸屏幕,有时一个小时内都不会收到通知。由于节省电池,这可能对某些用户有好处,但优化推送通知和电池优化对每个人来说都是双赢的。

无论如何,对于那些想要分析打瞌睡的人和那些还没有意识到这些的人,这里有一些小技巧:

  • 无线调试功能可用于通过computer/adb工具连接设备。因此,在连接进行测试时不需要 USB 数据线并为 phone 充电。我认为由于 Android 11 大多数设备在开发人员选项下都有无线调试选项,因此无需 USB 电缆设置即可在本机工作。如果没有可用的 wifi 调试(Android 11 之前的版本),则可以使用 USB 数据线进行设置。

  • "adb shell dumpsys deviceidle" 此命令总结了一些信息,如打瞌睡状态和子状态,可用于在 doze/app 测试期间检查当前状态。

  • 您可以在线查看其他 adb doze 命令及其效果,例如 forcing doze、enable/disable it 等。