说明:
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 全屏来电界面,您只需申请该证书即可。
说明:
下面分两步:先做通用准备(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 控制台
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:开通服务

步骤2:接入 TUIVoIPExtension 组件
使用 CocoaPods 导入组件,具体步骤如下:
1. 在您的
Podfile 文件中添加以下依赖:pod 'TUIVoIPExtension/CallKit'
2. 执行以下命令,安装组件:
pod update
步骤3:上报证书 ID
import TUIVoIPExtensionfunc application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {// 上报证书 IDTUIVoIPExtension.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 inswitch result {case .success:// 通话发起成功,此时可以跳转到您自己的通话页面breakcase .failure(let error):// 通话失败处理break}}
步骤5:通过系统通话记录拨打通话
如果需要实现点击系统电话 > 最近通话列表中的通话记录,直接发起单人音视频通话,您需要在 Application 的生命周期回调函数使用 TUIVoIPExtension 组件中的 callWith 接口,具体示例如下:
说明:
仅支持单人音视频通话的直接拨打。
登录账户必须为同一个账户。
1. iOS 13 引入 SceneDelegate。如果项目启用 SceneDelegate,并且最低部署版本低于 iOS 13,为同时兼容 iOS 13 以下与 iOS 13+ 设备,需要在
AppDelegate 和 SceneDelegate 分别实现对应的生命周期方法。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 实现如下方法。import TUIVoIPExtensionfunc 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 通话。


