您可以通过 OSNotification 类访问从 OneSignal 发送的推送通知中的数据
Android 通知服务扩展
允许您在向用户显示通知之前处理通知。常见用例包括:- 在后台接收数据,可以显示或不显示通知。
- 根据客户端应用逻辑覆盖特定通知设置,例如自定义强调色、振动模式或任何其他可用的
NotificationCompat选项。
第 1 步:为服务扩展创建一个类
创建一个扩展INotificationServiceExtension 的类并实现 onNotificationReceived 方法。
方法 onNotificationReceived 参数是 event,类型为 INotificationReceivedEvent。
@Keep 注解可防止 ProGuard/R8 在代码压缩期间重命名或移除您的类。第 2 步:自定义通知
以下是您可以在上述模板通知服务扩展类中实现的常见示例。- 阻止通知显示
- 添加自定义字段
- 更改通知颜色和图标
调用
event.preventDefault() 可以阻止通知自动显示,然后决定是手动显示还是完全不显示。第 3 步:将服务扩展添加到您的 AndroidManifest.xml
在 AndroidManifest.xml 文件的 application 标签中添加类名和值作为 meta-data。忽略任何”未使用”警告。
XML
com.onesignal.example.NotificationServiceExtension 替换为您的类的完全限定名称。
iOS 通知服务扩展
UNNotificationServiceExtension 允许您在向用户显示推送通知之前修改推送通知的内容,并且是其他重要功能所必需的,例如: 如果您遵循了我们针对您的应用的移动 SDK 设置说明,扩展应该已经配置好了。本节将说明如何访问 OneSignal 通知有效负载数据并解决您可能遇到的任何问题。获取 iOS 推送载荷
didReceive(_:withContentHandler:) 的重写会调用 OneSignalExtension.didReceiveNotificationExtensionRequest。在调用该方法之前,您可以读取或修改 bestAttemptContent。
在此示例中,我们发送包含以下数据的通知:
JSON
userInfo 的 custom 字典中的 a 键,在 OneSignalNotificationServiceExtension 中访问此附加 data:
iOS 通知服务扩展故障排除
本指南用于调试 iOS 移动应用上未显示图片、操作按钮或确认送达的问题。检查您的 Xcode 设置
在 General > Targets 中确保您的主应用目标和 OneSignalNotificationServiceExtension 目标具有相同且正确的:- Supported Destinations(支持的目标)
- Minimum Deployment(最低部署版本,iOS 14.5 或更高版本)

Xcode 中的主应用目标示例

Xcode 中的 OneSignalNotificationServiceExtension 目标示例
NSExtension 键。确保您看到:
XML

Info 标签中的 NSExtension 键示例
关闭”Copy only when installing”(仅在安装时复制)
选择您的主应用目标 > Build Phases > Embed App Extensions。确保”Copy only when installing”(仅在安装时复制)未选中。如果已选中,请取消选中:
主应用目标构建阶段设置
调试 iOS 通知服务扩展
按照以下步骤验证通知服务扩展是否正确设置。1. 更新 OneSignalNotificationServiceExtension 代码
打开NotificationService.m 或 NotificationService.swift,并将整个文件内容替换为以下代码。这将添加日志记录以帮助验证扩展是否正在运行。
将 YOUR_BUNDLE_ID 替换为您的实际 Bundle ID。
调试日志类型需要在控制台中通过 Action > Include Debug Messages 启用。
2. 更改活动方案
将您的活动方案设置为OneSignalNotificationServiceExtension。

Xcode 活动方案选择
3. 构建并运行项目
在 Xcode 中在真实设备上构建并运行项目。4. 打开控制台
在 Xcode 中,选择 Window > Devices and Simulators。
Xcode 设备和模拟器窗口

设备控制台访问按钮
5. 检查控制台
在控制台中:- 选择 Action > Include Debug Messages(操作 > 包含调试消息)
- 搜索
OneSignalNotificationServiceExtension作为 CATEGORY(类别) - 选择 Start(开始)

控制台调试配置
contents 属性)。在此示例中,载荷为:
cURL

控制台调试输出示例
常见问题
为什么我的通知服务扩展在 iOS 上无法运行? 扩展仅在通知设置了mutable-content 时才会运行。OneSignal 会自动为包含附件或操作按钮的通知设置此项。请验证您的 Xcode 设置是否与故障排除部分中的要求一致。
我可以在 Android 上阻止通知显示吗?
可以,调用 event.preventDefault() 可以阻止通知显示。之后可以调用 event.getNotification().display() 手动显示,或者不调用以静默丢弃通知。详情请参阅重复通知。
Android 上是否需要 @Keep 注解?
是的,@Keep 注解可防止 ProGuard/R8 在代码压缩期间重命名或移除实现了 INotificationServiceExtension 的类。
相关页面
移动 SDK 设置
为 iOS 和 Android 安装和配置 OneSignal SDK。
图片与富媒体
为推送通知附加图片、GIF 和视频。
确认送达
跟踪通知到达设备的确认送达情况。
重复通知
解决所有平台上的重复推送通知问题。