- 在应用中使用 Apple PushKit 注册 VoIP 令牌
- 创建一个使用 VoIP Services 证书的专用 OneSignal 应用
- 通过 OneSignal REST API 注册令牌并发送推送
平台差异
| 平台 | 是否支持 VoIP 推送 | 工作原理 |
|---|---|---|
| iOS | Yes | 使用 Apple PushKit 和 VoIP APNs 证书 |
| Android | No | 使用纯数据推送模拟通话样式行为 |
iOS:发送 VoIP 推送通知
在 iOS 上,VoIP 通知使用 Apple PushKit,并遵循与标准推送通知不同的特殊传递规则。由于 Apple 对 VoIP 推送的处理方式不同,OneSignal 需要为 VoIP 使用单独的应用配置。使用 PushKit 注册 VoIP 令牌
使用 Apple 的 PushKit 框架注册 VoIP 通知并获取 VoIP 令牌。
Apple 资源:
- 在您的应用中实现 PushKit
- 在 Apple 轮换时存储并刷新 VoIP 令牌
- 严格遵守 Apple 的 VoIP 策略
示例:PushKit 委托实现
示例:PushKit 委托实现
这是标准的 Apple PushKit 代码。OneSignal 不提供 PushKit SDK——您需要自行注册令牌,然后在第 4 步将其传递给 OneSignal。
为 VoIP 创建独立的 OneSignal 应用
Apple VoIP 推送需要与标准推送通知不同的证书类型。单个 OneSignal 应用只能使用一种证书类型,因此您必须创建两个独立的 OneSignal 应用:
- 主推送应用:使用 APNs 证书处理标准推送通知
- VoIP 推送应用:使用 VoIP Services 证书专门处理 VoIP 通知
Bundle ID(例如
com.yourcompany.appname)可在 Xcode 中您的 target 的 General 选项卡下找到。上传 VoIP Services 证书
在您的 VoIP OneSignal 应用中,上传 VoIP Services 证书(.p12)。这与您用于常规通知的标准 APNs 推送证书是不同的证书类型。创建步骤:

- 前往 Apple Developer Portal
- 选择 VoIP Services Certificate
- 按照提示生成并下载证书
- 在”钥匙串访问”中打开并将其导出为
.p12文件 - 将
.p12文件上传至您的 VoIP OneSignal 应用的 iOS 设置中


向 OneSignal 注册 VoIP 令牌
使用 Create User API 将 VoIP 令牌注册到您的 VoIP OneSignal 应用。如需稍后更新令牌,请使用 Update Subscription API。
有效的 VoIP 令牌是 64 个字符的小写十六进制字符串(例如
a1b2c3d4e5f6...)。PushKit 在 iOS 模拟器上无法使用——您必须使用真实设备才能获取有效令牌。发送 VoIP 通知
使用 Create Notification API 并包含以下参数:
"apns_push_type_override": "voip"— 告知 Apple 这是 VoIP 推送app_id— 您的 VoIP 应用 IDinclude_subscription_ids— 您注册的 VoIP 订阅 IDcontents或content_available二选一,必须填写
验证您的 VoIP 设置
如果满足以下条件,则说明您的 iOS VoIP 集成运行正常:
- VoIP 令牌在您的 VoIP 应用中显示为 iOS 推送订阅
- VoIP 推送触发了应用中的
pushRegistry(_:didReceiveIncomingPushWith:for:completion:) - 即使应用已终止或在后台运行,也能被唤醒
Android:模拟 VoIP 样式行为
Android 不支持 VoIP 推送通知,没有与 Apple PushKit 等效的功能。 Android 通话应用使用以下方式模拟 VoIP 行为:- 纯数据推送通知
- 前台服务
- 自定义通话样式 UI
- 发送纯数据通知
- 在您的应用中处理它们以:
- 启动前台服务
- 启动通话 UI 活动
- 显示自定义来电通知
Android 设置并非 OneSignal 特定的。OneSignal 仅传递推送负载;您的应用负责处理通话行为。
常见问题
确认送达功能是否适用于 VoIP?
不适用。VoIP 推送不会跟踪确认送达。确认送达依赖于通知服务扩展,而通知服务扩展不会为 VoIP 通知触发。 请通过原生 iOS PushKit 事件来跟踪接收情况:能否从 OneSignal 仪表板发送 VoIP 通知?
不能。VoIP 通知必须通过 Create Notification API 并携带"apns_push_type_override": "voip" 参数来发送。仪表板不支持此参数。
为什么我的 VoIP 推送静默失败?
VoIP 推送可能在 OneSignal API 不返回任何错误的情况下失败。请逐一检查以下清单:- 您使用的是沙盒/开发构建吗? 通过 Create User API 注册令牌时,必须包含
"test_type": 1。不包含此字段时,令牌会被注册为生产令牌,Apple 会拒绝推送并静默失败。 - 您上传了正确的证书吗? VoIP OneSignal 应用必须使用 VoIP Services 证书(.p12),而非标准 APNs 推送证书。两者在”钥匙串访问”中看起来相似——请确认证书名称以”VoIP Services”开头。
- 您是否向正确的 OneSignal 应用发送? 发送请求中的
app_id必须是您的 VoIP 应用,而非主推送应用。REST API Key也必须来自 VoIP 应用。 - VoIP 令牌是否有效? 重新安装应用或恢复设备后令牌会过期。请确认令牌是 64 个字符的小写十六进制字符串,且是近期注册的。
- 您的应用是否调用了
reportNewIncomingVoIPPushPayload? 从 iOS 13 开始,Apple 会终止收到 VoIP 推送但未向 CallKit 报告通话的应用。这是 Apple 的要求,而非 OneSignal 的限制。
相关页面
创建消息 API
使用 REST API 以编程方式发送推送通知。
确认送达
在支持的平台上跟踪推送通知的送达确认。
服务扩展
使用通知服务扩展自定义通知处理。
Create User API
通过 OneSignal API 注册用户和订阅。