跳转到主要内容

概述

Apple 对 VoIP 推送通知的处理方式与标准推送通知不同。由于这些平台限制,OneSignal 支持发送 VoIP 通知,但不会为您管理 VoIP 令牌注册。 您必须:
  • 使用 Apple PushKit 自行注册 VoIP 令牌
  • 上传 VoIP 专用的 APNs 证书
  • 使用 OneSignal 的 API 注册令牌并发送通知
OneSignal 不会自动注册或刷新 VoIP(PushKit)令牌。您必须使用 API 手动向 OneSignal 注册 VoIP 令牌。

平台差异一览

平台是否支持 VoIP 推送工作原理
iOS✅ 是使用 Apple PushKit 和 VoIP APNs 证书
Android❌ 否使用纯数据推送模拟通话样式行为

如果您正在构建跨平台通话应用,则需要针对不同平台使用不同的方法。

Android:模拟 VoIP 样式行为(非真正的 VoIP)

Android 不支持 VoIP 推送通知。没有与 Apple PushKit 相当的功能。 相反,Android 通话应用使用以下方式模拟 VoIP 行为:
  • 纯数据推送通知
  • 前台服务
  • 自定义通话样式 UI
您可以使用 OneSignal 的常规 Android 推送支持结合原生 Android API 来实现此功能。 推荐方法:
  • 发送纯数据通知
  • 在您的应用中处理它们以:
    • 启动前台服务
    • 启动通话 UI 活动
    • 显示自定义来电通知
如果您想拦截并完全控制通知呈现,请使用 Android 的通知服务扩展 有用的资源:
Android 设置并非 OneSignal 特定的。OneSignal 仅传递推送负载;您的应用处理通话行为。

iOS:发送真正的 VoIP 推送通知

在 iOS 上,VoIP 通知使用 Apple PushKit,并具有与标准推送通知不同的特殊传递规则。 iOS VoIP 如何与 OneSignal 配合使用: 对于 iOS VoIP 通知:
  1. 您的应用使用 PushKit 注册 VoIP 令牌
  2. 您将 VoIP Services APNs 证书上传到 OneSignal
  3. 您使用 API 向 OneSignal 注册 VoIP 令牌
  4. 您使用 apns_push_type_override: “voip” 发送 VoIP 推送
由于 Apple 对 VoIP 推送的处理方式不同,OneSignal 也必须将其作为单独的应用配置处理。

1. 使用 PushKit 注册 VoIP 令牌

使用 Apple 的 PushKit 框架注册 VoIP 通知并接收 VoIP 令牌。
  • 在您的应用中实现 PushKit
  • 在 Apple 轮换时存储并刷新 VoIP 令牌
  • 严格遵守 Apple 的 VoIP 策略
Apple 资源:

2. 为 VoIP 用户创建新的 OneSignal 应用

您必须维护两个独立的 OneSignal 应用
  • 主推送应用:用于标准推送通知
  • VoIP 应用:仅用于 VoIP 通知
两个应用都必须:
  • 使用相同的 iOS Bundle ID
  • 与同一原生 iOS 应用关联

3. 上传 VoIP Services 证书

在您的 VoIP OneSignal 应用中:
  • 上传 VoIP Services 证书(.p12)
  • 不要重复使用您的标准 APNs 证书
您必须为 VoIP 应用上传 VoIP Services 证书(.p12),使用与主应用相同的 Bundle ID。

钥匙串访问中的 VoIP 证书

在 OneSignal 仪表板中上传的 VoIP 证书

4. 向 OneSignal 注册 VoIP 令牌

使用 Create User API 向您的 VoIP OneSignal 应用注册 VoIP 令牌。
如果 VoIP 令牌来自开发或沙盒构建,您必须包含 "test_type": 1 属性。如果省略此属性:
  • API 调用可能会成功
  • 推送将静默失败
curl --request POST \
     --url https://api.onesignal.com/apps/YOUR_VOIP_APP_ID/users \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
{
  "subscriptions": [
    {
      "type": "iOSPush",
      "token": "your-voip-token",
      "test_type": 1 // 在生产环境中省略
    }
  ]
}
'
要稍后更新令牌,请使用 Update Subscription API。

5. 发送 VoIP 通知

使用 Create Notification API 并包含以下参数:
  • "apns_push_type_override": "voip"
  • 您的 VoIP 应用的 app_id
  • 您注册的 VoIP 令牌的 subscription_id
curl --include \
     --request POST \
     --header "Content-Type: application/json; charset=utf-8" \
     --header "Authorization: key YOUR_REST_API_KEY" \
     --data-binary '{
  "app_id": "YOUR_VOIP_APP_ID",
  "contents": {"en": "English Message"},
  "apns_push_type_override": "voip",
  "include_subscription_ids": ["YOUR_VOIP_SUBSCRIPTION_ID"]
}' \
https://api.onesignal.com/notifications

6. 验证您的 VoIP 设置

如果满足以下条件,则您的 iOS VoIP 集成正在工作:
  1. VoIP 令牌在您的 VoIP 应用中显示为 iOS 推送订阅
  2. VoIP 推送触发 pushRegistry(_:didReceiveIncomingPushWith:for:completion:)
  3. 应用即使在终止或后台运行时也会被唤醒

常见问题

确认送达功能是否适用于 VoIP?

不适用,VoIP 推送不会跟踪确认送达。它们依赖于通知服务扩展,而通知服务扩展不会为 VoIP 通知触发。 相反,通过原生 iOS PushKit 事件跟踪接收:
pushRegistry(_:didReceiveIncomingPushWith:for:completion:)
此事件是主应用目标的一部分,不需要单独的扩展。在 Apple 的 VoIP 文档中了解更多信息。