跳转到主要内容

概览

确认送达跟踪设备是否真正接收到通过OneSignal发送的推送通知。当设备上的OneSignal SDK收到推送时,它会将包含通知ID和设备订阅ID的确认事件发送回OneSignal。这让您可以确切地看到哪些订阅收到了哪些通知。 在您的OneSignal仪表板中,确认送达在消息报告中显示为已确认(或已接收)。有关所有送达和参与指标,请参阅指标词汇表
确认送达流程
确认送达与”已送达”不同。平台推送服务(APNs、FCM、ADM、HMS)报告通知是否被服务接受——而不是设备是否实际收到了它。确认送达是设备端的确认。

要求

平台特定限制

iOS
  • 需要Notification Service ExtensionApp Group两者的设置。
  • APNs在离线时每个应用仅保留一条消息。如果离线时发送了多条推送,则仅送达最新的一条。
Huawei
  • 仅支持data 华为消息类型
  • 对于message类型,华为仅在其自己的仪表板中提供回执数据。
Web
  • Safari支持确认送达。

确认送达故障排除

如果您根本没有收到推送通知,请先参阅通知未显示

iOS

iOS上的确认送达需要两件事协同工作:
  1. 推送到达时运行OneSignal代码的Notification Service Extension(NSE)
  2. 在主应用目标和NSE目标之间共享的App Group,使它们能够交换数据
如果任何一个缺失或配置错误,设备会收到推送但从不向OneSignal报告。 验证您的iOS设置
1

确认NSE目标存在并具有正确的代码

在Xcode中,检查项目目标下是否列出了OneSignalNotificationServiceExtension目标。如果不存在,请按照iOS SDK设置的第2步操作。打开NSE的NotificationService.swift(或.m)文件。它必须在didReceive(_:withContentHandler:)内调用OneSignalExtension.didReceiveNotificationExtensionRequest。如果文件仍包含Apple的默认模板代码,请将其替换为OneSignal NSE代码
2

确认NSE具有OneSignalExtension包

选择您的NSE目标 > General > Frameworks and Libraries(或Build Phases > Link Binary With Libraries)。验证OneSignalExtension已列出。主应用目标使用OneSignalFramework,但NSE目标必须使用OneSignalExtension——这些是不同的包。
3

验证App Group在两个目标上都已正确配置

OneSignal SDK使用App Group在主应用和NSE之间共享数据。有两种配置方式——选择与您的设置匹配的一种。
  1. 选择您的主应用目标 > Signing & Capabilities > App Groups
  2. 确认App Group。
如果您的App Group是group.YOUR_MAIN_APP_BUNDLE_ID.onesignal——其中YOUR_MAIN_APP_BUNDLE_ID是主应用目标的Bundle Identifier(在General > Identity下可找到),请按照默认App Group选项卡操作。否则,请按照自定义App Group选项卡操作。
  1. 选择您的NSE目标 > Signing & Capabilities > App Groups
  2. 确认完全相同的App Group已列出。如果缺少,通过**+ Capability > App Groups**添加并选择相同的组。
常见错误是使用NSE的bundle identifier而不是主应用的:
  • 正确: group.YOUR_MAIN_APP_BUNDLE_ID.onesignal
  • 错误: group.YOUR_MAIN_APP_BUNDLE_ID.OneSignalNotificationServiceExtension.onesignal
您的主应用目标和NSE目标应具有相同的App Group标识符。
如果您使用.xcconfig文件进行构建设置,请验证App Group没有在这些文件中被覆盖或省略。
4

确认最低部署目标匹配

选择您的NSE目标 > General > Minimum Deployments。此值必须与主应用目标的最低部署相匹配。不匹配可能会导致NSE在某些操作系统版本上无法运行。
5

取消勾选"Copy only when installing"

选择您的主应用目标 > Build Phases > Embed App Extensions。确保取消勾选”Copy only when installing”。如果勾选,NSE在开发构建期间不会被嵌入,因此在测试时永远不会运行。
6

验证Info.plist中的NSExtension值

选择您的NSE目标 > Info选项卡并展开NSExtension键。确认它包含:
<key>NSExtensionPointIdentifier</key>
<string>com.apple.usernotifications.service</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).NotificationService</string>
如果您的NSE是用Objective-C编写的,请使用NotificationService而不是$(PRODUCT_MODULE_NAME).NotificationService
7

验证mutable-content已设置

OneSignal自动在推送有效载荷中设置mutable-content: 1,这告诉iOS调用NSE。如果您通过REST API发送推送,请验证您没有明确设置mutable_content: false。没有mutable-content,iOS不会运行NSE,确认送达就无法触发。
8

测试NSE是否正在运行

在OneSignal调用之前,临时在didReceive内添加这一行:
bestAttemptContent.body = "[Modified] " + bestAttemptContent.body
向自己发送一条测试推送。如果通知正文以[Modified]开头,则NSE运行正常。如果没有,请重新检查上述步骤——NSE未被调用。测试后删除此行。有关使用Xcode Console日志进行高级NSE调试,请参阅调试iOS Notification Service Extension

Android

Web

  • Safari不受支持。
  • 对于其他浏览器,确保迁移到v16 SDK已完成:
    • 正确的SDK初始化:
      <script src="https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.page.js" defer></script>
      
    • 正确的Service Worker引用:
      importScripts("https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.sw.js");
      

常见问题

为什么我的确认送达数量很低或没有显示?

最常见的原因是设置问题(尤其是iOS)、不活跃设备和平台限制。
  1. iOS配置错误: Notification Service Extension或App Group缺失或不正确。请参阅上面的iOS确认送达故障排除
  2. 不活跃或废弃的设备: 离线或不再使用的设备不会接收推送或发送确认送达事件。请参阅下面的如何处理不活跃设备?
  3. 平台限制: 华为message类型和Safari不支持确认送达。
  4. Android强制退出: 某些设备制造商将划走应用视为强制退出,这会停止SDK事件。请参阅移动推送未显示指南

如何处理不活跃设备?

离线或废弃的设备不会接收推送通知或发送确认送达事件。这在用户更换或废弃设备时很常见。 要重新吸引不活跃用户:
  • 使用受众活动向未确认送达的用户重新发送。
  • 基于最后会话创建细分(例如,90天以上不活跃)。
    • 重新参与Journey结合,将他们赢回。
    • 定期针对不活跃用户以清除无法触达的设备。
有关OneSignal如何更新订阅状态的更多详情,请参阅推送订阅状态何时更新?

为什么显示已确认但在我的设备上没有显示?

确认送达事件意味着设备收到了推送有效载荷。在极少数情况下,通知可能不会显示。 可能的原因:
需要帮助?与我们的支持团队聊天或发送邮件至 support@onesignal.com请包含以下信息:
  • 您遇到的问题详情以及复现步骤(如有)
  • 您的 OneSignal 应用 ID
  • 外部 ID 或订阅 ID(如适用)
  • 您在 OneSignal 控制台中测试的消息 URL(如适用)
  • 任何相关的日志或错误信息
我们很乐意为您提供帮助!