跳转到主要内容
当推送通知在您的推送消息报告中显示”已送达”状态时,这意味着 OneSignal 已成功将通知交给推送服务(例如 FCM、APNS、HMS)。之后,推送服务负责将其投递到每个用户的设备。 当 OneSignal SDK 在用户设备上收到通知时,通知会被标记为”已确认”。 如果您的通知显示为”已送达”但没有在设备上出现或被延迟,本指南帮助您排查原因。
有关如何查找您的设备并将其设置为测试订阅的详细信息,请参阅测试订阅这将有助于确保您的设置正确,并使故障排除变得更加容易。

缺少通知权限

在您的设备上,检查您的应用的通知设置。验证您的应用已启用通知,然后打开您的应用。在您的 OneSignal 仪表板受众 > 订阅中,您应该看到您的推送订阅具有”已订阅”推送状态。

发送推送

设备不在消息受众中

您的订阅可能未包含在消息的目标受众中。如果使用细分或筛选器,请确保您的订阅符合条件。如果定位外部 ID 或其他别名,请检查是否已设置并且您正在发送给正确的目标。

折叠 ID

如果您为消息添加了折叠 ID,最新的通知将替换具有相同 ID 的较旧通知。检查您是否没有设置此项,或者为要替换的通知正确设置了此项。有关详细信息,请参阅移除通知和 TTL

网络连接

设备必须在线才能接收推送通知。如果您的设备已关闭、处于飞行模式、网络连接不稳定或无网络连接,推送将不会显示,直到建立适当的连接。有关详细信息,请参阅生存时间 (TTL) 参数

WiFi 连接、防火墙或 VPN

检查您连接的网络/WiFi,因为它可能已关闭与 Apple 或 Google 服务器的连接。尝试禁用并重新启用您的网络连接。也可以尝试不使用 WiFi,而使用蜂窝数据。 如果您限制进出互联网的流量,需要配置以允许与推送服务的连接。

设备设置阻止推送

请勿打扰和专注模式

检查并禁用设备上的”请勿打扰”和”专注”模式。这些会阻止通知显示。如果需要,您可以将应用添加到”允许”列表中。

低电量模式和电池优化

iOS 设备: 在测试时禁用低电量模式或为设备充电。 Android 设备: 根据设备制造商和操作系统版本,“电池优化”设置有几种不同的名称。在电池设置中,将应用设置为”不受限制”或”未优化”。如果您没有此设置,请搜索电池优化省电模式节能后台使用限制自适应电池设置,并为应用禁用此功能或在测试时禁用。

模拟器问题

您的模拟器设备需要同时满足:
  1. 安装 Google Play 服务(Google Play Store)
  2. 冷启动
  • 打开 Android Studio 设备管理器
  • 选择您的设备,确保已安装 Google Play Store 并点击编辑
  • 转到附加设置更多按钮
  • 启动选项设置为冷启动
  • 保存更改并重新启动模拟器

代码阻止、防止、移除通知

OneSignal 前台通知防护

我们的 SDK 有一个前台事件监听器方法。在此方法中,您可以调用 event.preventDefault() 来阻止通知在应用打开时显示。 在测试时,确保应用在后台或已关闭,以验证这不会阻止通知。

Android 服务扩展阻止通知

如果您设置了 Android 通知服务扩展,这是通知进入应用的入口点。您可能正在使用 event.preventDefault() 方法阻止通知。检查您的代码,查看是否正在使用此方法以及在什么条件下使用。

iOS UNUserNotificationCenterDelegate 在前台阻止通知

如果您设置了 iOS UNUserNotificationCenterDelegate,那么您的代码可能会阻止 iOS 设备在前台显示通知。 请移除此自定义代码,改为使用我们的 SDK 前台事件监听器方法。

iOS 徽章清除

徽章清除会影响通知。当应用清除徽章时,它可以从通知中心移除现有通知。OneSignal 的 SDK 也会在应用打开时清除徽章,这会移除通知。有关如何防止这种情况的详细信息,请参阅徽章

移除通知

Apple 提供了 removeAllDeliveredNotifications() 方法来从通知中心移除应用的所有已投递通知。请参阅 Apple 关于 removeAllDeliveredNotifications() 的开发者文档

Firebase 冲突

如果您正在使用 Firebase Messaging SDK,请检查您的 Android Manifest 文件中是否有以下行。这可能会阻止您的通知。
com.google.firebase.iid.FirebaseInstanceIdReceiver

Android 特定问题

每个 Android 制造商都会为其设备创建自己的 Android 版本。有时这会导致不同设备上的推送通知体验不同。

Android 类别已禁用

在您的 Android 设置应用 > 通知 > 您的应用中,您应该看到“显示通知”已启用,且下面的所有类别都已启用。如果您禁用了某个类别,您将不会收到来自该类别的通知。 在此示例中,“放弃购物车 - 紧急”类别已关闭。如果我在通知中设置了此类别,设备将不会收到此通知。 如果未设置类别,OneSignal 会使用默认的“杂项”类别。如果不设置类别,请确保启用该类别。有关更多详细信息,请参阅 Android 通知类别

图片显示设备上您的应用的类别已禁用,因此使用该类别发送时,设备将不会收到此推送。

通知分组行为

不同版本的 Android 可能具有自己的通知分组行为,有时可能与原生 Android 不同。这可能与 1)添加组键和 2)添加 Android 通知类别 有关。 可尝试的解决方案:
  1. 尝试在您的 OneSignal 仪表板中或使用代码创建 Android 通知类别。然后在所有通知上设置此 ID,查看是否有任何效果。
  2. 查看设备特定设置:在设备上,检查设置 > 通知 > 高级设置是否有任何设备特定的分组选项。
  3. 检查通知限制:验证此特定设备上是否为您的应用启用了电池优化或应用睡眠功能。

Android 应用被强制停止

当 Android 应用被强制停止时,设备将阻止该应用的推送通知显示。为了帮助节省电池电量,一些 Android 制造商如小米、华为、三星等实施了积极的后台进程管理,当用户滑动清除应用时可能会强制停止您的应用(但会省略 Facebook、WhatsApp、Gmail 等大型应用)。网上有很多相关信息,如:https://dontkillmyapp.com/我们写的博客文章,这篇文章在 Reddit 上引发了很多讨论 根据设备不同,您可能需要采取以下步骤来防止这种情况发生:
  1. 允许后台活动:
    • 设置 > 应用 > 您的应用 > 电池 > 允许后台活动。
  2. 禁用休眠应用功能:
    • 设置 > 电池和设备维护 > 电池 > 后台使用限制 > 休眠应用 > 从此列表中移除您的应用。
  3. 在最近应用中锁定应用:
    • 打开您的应用,然后点击最近应用按钮。
    • 找到您的应用,点击并按住应用窗口,然后锁定此应用(在某些三星机型上可用)。
  4. 为应用启用自启动(在某些设备上):
    • 设置 > 应用 > 您的应用 > 权限 > 自启动 > 启用。
  5. 为应用禁用自适应电池优化:
    • 设置 > 电池和设备维护 > 电池 > 更多电池设置 > 自适应电池 > 切换关闭(或排除您的应用)。
在测试时,请确保在发送通知时您的应用正在运行。请参阅获取调试日志来验证您是否收到了消息。

Android 休眠模式、优先级和降低优先级(节流)消息

Android 的节能功能(休眠模式应用待机)可能会延迟或阻止通知。当设备断开电源并静止一段时间后,这些模式会自动生效。 如果您的设备处于这些模式,发送高优先级消息将唤醒应用。但是,发送太多可能会导致您的通知被降低优先级并以正常优先级发送。FCM 声明
Android 上的高优先级消息旨在处理时间敏感、用户可见的内容,应导致面向用户的通知。如果 FCM 检测到消息未导致面向用户的通知的模式,您的消息可能会被降低优先级为正常优先级或委托给 Google Play 服务处理。

测试

按照获取调试日志来为应用添加我们的详细调试方法。 让应用在后台运行,然后给自己发送一条消息。 如果您没有收到消息事件,请与 support@onesignal.com 联系并提供以下信息:
  • 测试的完整日志。有关详细信息,请参阅获取调试日志
  • 您在调试时发送的 onesignal.com 仪表板中消息报告的链接。这可以在投递 > 已发送消息中找到。只需点击您发送的消息,然后复制粘贴 URL 并与我们分享。

检查您的应用状态

运行以下命令来检查您应用的当前状态。请将 “com.company.appname” 替换为您的包名。
adb shell dumpsys package com.company.appname | grep stopped
如果您看到 stopped=false,则一切正常,否则您将看到 stopped=true,这表示您的应用被某种方式强制终止了。 另一种方法是发送几个通知并检查以下 GCM logcat 条目。
W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent {
   act=com.google.android.c2dm.intent.RECEIVE pkg=com.onesignal.example (has extras)
}
如果您看到上面的取消意图,则您的应用无法启动来处理通知。 一些设备制造商会将应用列入白名单,以防止其进入强制关闭状态。例如 Gmail 和 WhatsApp。

其他调试

FCM 提供了一个 REST API 来查询设备上次连接到 FCM 的时间。有关如何获取此信息,请参阅以下 Google 文档。https://developers.google.com/instance-id/reference/server#get_information_about_app_instances
I