帮你快速理解、总结文档立即下载

iOS 离线推送接入(海外场景)

最近更新时间:2026-10-10 10:22:26
我的收藏
说明:
本文档适用于在 海外 App Store 上架的 App。如果您的 App 面向中国大陆,请参见 iOS 通话离线推送接入(中国大陆)。
TUICallKit 组件支持在 App 退到后台或被系统杀死时,通过离线推送唤醒被叫用户,使其能及时收到来电。

集成效果

按照本文档接入后,您的 App 将在 iOS 14.0 及以上全版本通过 Apple CallKit 提供原生电话级别的全屏来电界面体验,进程被杀或锁屏状态下也能唤醒系统级来电界面。
锁屏时的效果
应用在后台的效果
应用在后台展开的效果



说明:
本方案使用 Apple CallKit 唤起系统全屏来电界面,覆盖 iOS 14.0 及以上全版本。
VoIP Push 无法复用 APNs 普通推送证书,需要单独在苹果开发者网站上申请 VoIP Push 证书。
注意:
中国大陆 App Store 对 Apple CallKit 使用存在隐性限制,可能导致 App 上架审核被驳回。如果您的 App 同时上架中国大陆 App Store,请参见 iOS 通话离线推送接入(中国大陆) 使用不含 CallKit 的方案。
完成选择后,请先阅读 前置准备 章节完成工程配置和证书申请,再前往对应方案章节完成接入。

前置准备

步骤1:完成工程配置

1. 确认您工程的 Capability 中已添加 Push Notification 能力。



2. 检查您工程 Capability 的 Background Modes 中,是否同时开启了 Voice over IP 和 Remote notifications 选项。




步骤2:申请 VoIP Push 证书

海外通话场景的离线推送由 VoIP Push 证书 唤起 CallKit 全屏来电界面,您只需申请该证书即可。
说明:
如果您的 App 还有非通话类的离线消息推送需求(如 IM 文字消息),可另行申请 APNs 证书,开通 TIMPush 服务 并参考 IM 离线推送接入文档,本文档不再赘述。
下面分两步:先做通用准备(CSR + AppID 配置),再申请 VoIP Push 证书。

步骤2.1:通用准备

步骤2.1.1:开启 AppID 的 Push Notifications 能力
您可以在已有的 AppID 上增加 Push Notifications 服务,也可以新建一个 AppID。
说明:
您 App 的 Bundle ID 不能使用通配符 *,否则将无法使用远程推送服务。
1. 登录 苹果开发者中心,进入 Certificates, IDs & Profiles > Identifiers。



2. 如果您已有 AppID,直接选中后跳到步骤 6;如果需要新建 AppID,单击 Identifiers 右侧的 +。



3. 勾选 App IDs,单击 Continue 进行下一步。
4. 选择 App,单击 Continue 进行下一步。
5. 配置 Bundle ID 等其他信息,单击 Continue 进行下一步。
6. 在 Capabilities 列表中勾选 Push Notifications,单击 Save(或新建时单击 Continue > Register)。



步骤2.1.2:制作 CSR 文件
申请 VoIP Push 证书时需要上传 CSR 文件,先准备好:
1. 在 Mac 上打开钥匙串访问(Keychain Access),菜单选择 钥匙串访问 → 证书助理 → 从证书颁发机构请求证书。



2. 输入您的邮箱地址和常用名称,选择存储到磁盘,单击继续。系统会生成一个 *.certSigningRequest 文件,保存到桌面备用。

步骤2.2:申请 VoIP Push 证书

说明:
VoIP Push 证书不区分开发环境和生产环境,只需申请一份。
1. 进入 Certificates, IDs & Profiles > Certificates。



2. 单击 Certificates 右侧的 +。



3. 在 Create a New Certificate 中选择 VoIP Services Certificate,单击 Continue。
4. 选择您的 App 的 Bundle ID,单击 Continue。
5. 在 CSR 上传页面,单击 Choose File 上传 2.1 节 中生成的 *.certSigningRequest 文件。



6. 单击 Continue 生成证书,单击 Download 下载 voip_services.cer 到本地。
7. 双击 .cer 文件导入钥匙串,然后在登录 > 我的证书中找到 VoIP Services 证书,右键导出为 .p12 文件。
说明:
保存 .p12 文件时必须设置密码,否则收不到推送。

步骤3:上传证书到 IM 控制台

打开 IM 控制台,选择您创建的 IM 应用,按如下步骤上传 VoIP 证书:
1. 选择您的 IM 应用,进入应用的推送服务 > 概览页面,在配置厂商证书选项卡中,切换到 iOS,点击添加证书按钮,然后在悬浮页面中选择证书类型,分别上传 APNs 证书(p12)和 VoIP 证书(p12),设置证书密码后单击确认。



说明:
添加证书时,推送类型默认为 APNs,不影响 VoIP 证书的上传和使用。
VoIP Push 证书本身不区分生产环境和测试环境,生产环境和开发环境使用的是同一份 VoIP Push 证书,请分别上传。
上传证书名最好使用全英文(尤其不能使用括号等特殊字符)。
上传证书需要设置密码,无密码收不到推送。
发布 App Store 的证书需要设置为生产环境,否则无法收到推送。
上传的 p12 证书必须是自己申请的真实有效的证书。
2. 上传完成后,记录 APNs 和 VoIP 不同环境下的证书 ID。



说明:
开发环境和生产环境下的证书 ID 要严格区分,请根据实际环境填写。

功能接入

注意:
TUIVoIPExtension 是 TIMPush 的一个子模块,由于 VoIP 推送的特殊性,TUIVoIPExtension 是独立发布的。使用 TUIVoIPExtension 插件首先需要开通 TIMPush 服务。

步骤1:开通服务

进入 IM 控制台 > 插件市场,单击立即购买或免费试用(每个应用可免费试用一次,有效期 7 天)。

注意:
推送插件试用或购买到期后,将自动停止提供推送服务(包括普通消息离线推送、全员/标签推送等服务)。为避免影响您业务正常使用,请提前 购买/续费。

步骤2:接入 TUIVoIPExtension 组件

使用 CocoaPods 导入组件,具体步骤如下:
1. 在您的 Podfile 文件中添加以下依赖:
pod 'TUIVoIPExtension/CallKit'
2. 执行以下命令,安装组件:
pod update

步骤3:上报证书 ID

在 App 启动时,调用 TUIVoIPExtension.setCertificateID 上报 前置准备 中获取的 VoIP 证书 ID。
import TUIVoIPExtension

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

// 上报证书 ID
TUIVoIPExtension.setCertificateID(1234)

return true
}

步骤4:拨打 VoIP 通话

AtomicXCore 的 CallStore 在发起通话时自动携带 VoIP 离线推送参数,您不需要手动设置任何 offlinePushInfo 字段。默认推送内容如下:
字段
默认值
推送类型
VoIP
推送标题
主叫用户的 ID
推送描述
中文环境下为「您有新的来电」,其它语言为「You have a new call」
iOS 铃声
phone_ringing.mp3
如果您想自定义推送标题或描述,可在发起通话时通过 CallParams 传入 offlinePushTitle / offlinePushDescription,传入后会覆盖上述默认值。
import AtomicXCore

// 构造通话参数
var params = CallParams()
params.timeout = 30 // 超时时间(秒)
params.userData = "自定义数据" // 扩展信息(可选)

// 可选:自定义离线推送标题和描述(不填则使用默认值)
params.offlinePushTitle = "张三" // 覆盖默认标题
params.offlinePushDescription = "邀请您视频通话" // 覆盖默认描述

// 发起通话
let userIdList = ["被叫用户的 userID"]
let mediaType = CallMediaType.video // .video 视频通话,.audio 语音通话

CallStore.shared.calls(
participantIds: userIdList,
mediaType: mediaType,
params: params
) { result in
switch result {
case .success:
// 通话发起成功,此时可以跳转到您自己的通话页面
break
case .failure(let error):
// 通话失败处理
break
}
}

步骤5:通过系统通话记录拨打通话

如果需要实现点击系统电话 > 最近通话列表中的通话记录,直接发起单人音视频通话,您需要在 Application 的生命周期回调函数使用 TUIVoIPExtension 组件中的 callWith 接口,具体示例如下:
说明:
仅支持单人音视频通话的直接拨打。
登录账户必须为同一个账户。
1. iOS 13 引入 SceneDelegate。如果项目启用 SceneDelegate,并且最低部署版本低于 iOS 13,为同时兼容 iOS 13 以下与 iOS 13+ 设备,需要在 AppDelegate 和 SceneDelegate 分别实现对应的生命周期方法。
Swift
import TUIVoIPExtension

/// AppDelegate 中的实现,iOS 13 以前版本的处理
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([any UIUserActivityRestoring]?) -> Void) -> Bool {
TUIVoIPExtension.call(with: userActivity)
return true
}

/// SceneDelegate 中的实现
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
for userActivity in connectionOptions.userActivities {
TUIVoIPExtension.call(with: userActivity);
}
}

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
TUIVoIPExtension.call(with: userActivity);
}
2. 若项目最低部署版本为 iOS13 及以上,未使用 SceneDelegate,不需要兼容 iOS13 以下系统,则只需要在 AppDelegate 实现如下方法。
Swift
import TUIVoIPExtension

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([any UIUserActivityRestoring]?) -> Void) -> Bool {
TUIVoIPExtension.call(with: userActivity)
return true
}

常见问题

收不到 VoIP Push,如何处理?

1. 检查 App 的运行环境和证书的环境是否一致,证书 ID 是否匹配,如果不一致,无法收到推送。
2. 请确认当前您登录的账号是否处于离线状态:按 home 键切后台、登录后主动杀进程退出。VoIP Push 目前只支持离线状态下的推送。
3. 检查 完成工程配置 中 Push Notifications capability 和 Background Modes 是否正确开启。
4. 尝试重启测试手机来清除系统缓存和内存(很重要)。

证书 ID 怎么填?开发环境和生产环境怎么区分?

在 IM 控制台上传证书时,开发环境和生产环境是分别上传、分别生成证书 ID 的。请根据您当前的 App 运行环境填写对应的证书 ID:
Debug 包 / TestFlight 测试 > 填开发环境的证书 ID
App Store 正式包 > 填生产环境的证书 ID

如何自集成 VoIP 推送功能?

如果您希望完全自定义推送逻辑,也支持您自己通过 SDK 的方式来集成 VoIP 推送能力,整体的方案设计如下:



相关流程说明:
1. 参考 申请 VoIP Push 证书 申请证书,并在 IM 控制台上传证书获取证书 ID。
2. 参考 Apple PushKit 使用获取设备 token。
3. 使用 IMSDK 的 setVOIP 接口向 IM 服务器上报设备 token。
4. 参考 Apple CallKit 展示推送弹窗。
5. 参考 TUICallKit 接口的使用 发起 VoIP 通话。