tencent cloud

实时音视频

动态与公告
产品动态
产品近期公告
关于 TRTC Live 正式上线的公告
关于TRTC Conference 正式版上线的公告
Conference 商业化版本即将推出
关于多人音视频 Conference 开启内测公告
关于音视频通话 Call 正式版上线的公告
关于腾讯云音视频终端 SDK 播放升级及新增授权校验的公告
关于 TRTC 应用订阅套餐服务上线的相关说明
产品简介
产品概述
基本概念
产品功能
产品优势
应用场景
性能数据
购买指南
计费概述
免费时长说明
月订阅
现收现付
TRTC 逾期与暂停政策
常见问题解答
退款说明
新手指引
Demo 体验
视频通话 SDK
组件介绍
开通服务
跑通 Demo
快速接入
离线唤醒
会话聊天
云端录制
AI 降噪
界面定制
Chat 集成通话能力
更多特性
无 UI 集成
服务端 API
客户端 API
解决方案
错误码表
发布日志
常见问题
视频会议 SDK
组件介绍(TUIRoomKit)
开通服务(TUIRoomKit)
跑通 Demo(TUIRoomKit)
快速接入(TUIRoomKit)
屏幕共享(TUIRoomKit)
预定会议(TUIRoomKit)
会中呼叫(TUIRoomKit)
界面定制(TUIRoomKit)
虚拟背景(TUIRoomKit)
会议控制(TUIRoomKit)
云端录制(TUIRoomKit)
AI 降噪(TUIRoomKit)
会中聊天(TUIRoomKit)
机器人推流(TUIRoomKit)
更多特性(TUIRoomKit)
客户端 API(TUIRoomKit)
服务端 API(TUIRoomKit)
常见问题(TUIRoomKit)
错误码 (TUIRoomKit)
SDK更新日志(TUIRoomKit)
直播与语聊 SDK
Live 视频直播计费说明
组件介绍
开通服务(TUILiveKit)
跑通 Demo
无 UI 集成
UI 自定义
直播监播
视频直播
语聊房
高级功能
客户端 API
服务端 API
错误码
发布日志
常见问题
RTC Engine
开通服务
SDK 下载
API-Example
接入指引
API-参考手册
高级功能
AI 集成
概述
MCP 配置
Skills 配置
集成指南
常见问题
RTC RESTFUL API
History
Introduction
API Category
Room Management APIs
Stream mixing and relay APIs
On-cloud recording APIs
Data Monitoring APIs
Pull stream Relay Related interface
Web Record APIs
AI Service APIs
Cloud Slicing APIs
Cloud Moderation APIs
Making API Requests
Call Quality Monitoring APIs
Usage Statistics APIs
Data Types
Appendix
Error Codes
控制台指南
应用管理
套餐包管理
用量统计
监控仪表盘
开发辅助
解决方案
实时合唱
常见问题
迁移指南
计费相关
功能相关
UserSig 相关
应对防火墙限制相关
缩减安装包体积相关
Andriod 与 iOS 相关
Web 端相关
Flutter 相关
Electron 相关
TRTCCalling Web 相关
音视频质量相关
其他问题
旧版文档
RTC RoomEngine SDK(旧)
集成 TUIRoom (Web)
集成 TUIRoom (Android)
集成 TUIRoom (iOS)
集成 TUIRoom (Flutter)
集成 TUIRoom (Electron)
TUIRoom API 查询
实现云端录制与回放(旧)
监控仪表盘计费(旧)
协议与策略
安全合规认证
安全白皮书
信息安全说明
服务等级协议
苹果隐私策略:PrivacyInfo.xcprivacy
TRTC 政策
隐私协议
数据处理和安全协议
词汇表

VoIP(Apple CallKit)

PDF
聚焦模式
字号
最后更新时间: 2025-07-30 11:08:53
TUICallKit 组件支持通过接入 TUIVoIPExtension/CallKit 推送插件实现 VoIP 推送的功能。 TUICallKit 为您提供了两种集成方式:TUIVoIPExtension/CallKit 插件(付费)和 自集成推送(免费),我们更推荐您使用 TUIVoIPExtension/CallKit 推送插件来实现离线推送,TUIVoIPExtension/CallKit 推送插件有以下优势:
接入周期短,预计全厂商接入仅需要 30 分钟。
支持数据统计和链路追踪,方便您查看推送触达率、点击率和转化率等各类指标。
可以实现系统级的通话效果,提高通话触达率。
支持 Flutter 等跨平台框架。
注意:
TUIVoIPExtensionTIMPush 的一个子模块,由于 VoIP 推送的特殊性, TUIVoIPExtension 是独立发布的。 使用 TUIVoIPExtension 插件首先需要开通 TIMPush 服务
说明:
TUIVoIPExtension/CallKit 插件需要在 iOS 13.0 及以上系统中使用。
VoIP Push 无法复用 APNs 普通推送证书,需要单独在苹果开发者网站上 申请 VoIP Push 证书
禁止:
由于 TUIVoIPExtension/CallKit 插件使用了 Apple CallKit,无法在 App Store 的中国大陆地区上架!

集成效果

锁屏时的效果
应用在后台的效果
应用在后台展开的效果




准备条件

1. 开通服务

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

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

2. 厂商配置

步骤1:申请 VoIP Push 证书

在申请 VoIP Push 证书之前,请先登录 苹果开发者中心 网站开启 App 的远程推送功能。当您的 AppID 具备了 Push Notification 能力后,按照如下步骤申请并配置 VoIP Push 证书:
1. 登录 苹果开发者中心 网站,单击 Certificates, IDs & Profiles 选项卡中的 Certificates,进入 Certificates, Identifiers & Profiles 页面。

2. 单击 Certificates 右侧的+

3. Create a New Certificate 选项卡中,选择 VoIP Services Certificate,并单击 Continue
4. Select an App ID for your VoIP Service Certificate 选项卡中,选择您当前的 App 的 BundleID,并单击 Continue
5. 紧接着,系统提示我们需要一个 Certificate Signing Request(CSR)
6. 我们接下来制作 CSR 文件。首先在 Mac 上打开钥匙串访问工具(Keychain Access),在菜单中选择钥匙串访问 > 证书助理 > 从证书颁发机构请求证书Keychain Access - Certificate Assistant - Request a Certificate From a Certificate Authority)。

7. 输入用户电子邮件地址(您的邮箱)、常用名称(您的名称或公司名),选择存储到磁盘,单击继续,系统将生成一个 *.certSigningRequest 文件。
返回上述步骤5中 Apple Developer 网站刚才的页面,单击 Choose File 上传生成的*.certSigningRequest文件。

8. 单击 Continue 后生成证书,点击 Download 下载对应的证书到本地。
9. 双击打开刚才下载的 voip_services.cer,系统会将其导入钥匙串中。
10. 打开钥匙串应用,在登录 > 我的证书,右键导出刚创建的 VoIP Services 的 P12 文件。
说明:
保存P12文件时,请务必要为其设置密码。

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

打开 IM 控制台,选择您创建的 IM 应用,并按照如下步骤上传证书:
1. 选择您的 IM 应用,进入应用的基础配置页面,在离线推送证书配置选项卡中,单击立即前往。



2. 厂商配置中,切换到 iOS, 点击添加证书按钮,然后在悬浮页面中选择证书类型,上传 iOS 证书(.p12),设置证书密码,单击确认



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



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

功能接入

1. 完成工程配置

1. 如下图,确认您工程的 Capability 中是否添加 Push Notification 能力。

2. 如下图,请检查您工程 Capability 的 Background Modes 中,是否开启了 Voice over IP 选项。


2. 接入 TUIVoIPExtension 组件

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

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 上报证书 ID
TUIVoIPExtension.setCertificateID(1234)
return true
}
#import <TUIVoIPExtension/TUIVoIPExtension.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 上报证书 ID
[TUICallKitVoIPExtension setCertificateID:1234];
return YES;
}

拨打 VoIP 通话

如果您需要拨打 VoIP 通话,需要在调用 calls 时候设置 OfflinePushInfo 中的 iOSPushType 字段为 TUICallIOSOfflinePushTypeVoIP,默认为 TUICallIOSOfflinePushTypeAPNs。
Swift
Java
Dart
Objective-C
import TUICallKit_Swift
import RTCRoomEngine

let pushInfo: TUIOfflinePushInfo = TUIOfflinePushInfo()
pushInfo.title = ""
pushInfo.desc = "您有一个新的通话"
pushInfo.iOSPushType = .voIP
pushInfo.ignoreIOSBadge = false
pushInfo.iOSSound = "phone_ringing.mp3"
pushInfo.androidSound = "phone_ringing"
// OPPO必须设置ChannelID才可以收到推送消息,这个channelID需要和控制台一致
// OPPO must set a ChannelID to receive push messages. This channelID needs to be the same as the console.
pushInfo.androidOPPOChannelID = "tuikit"
// FCM channel ID, you need change PrivateConstants.java and set "fcmPushChannelId"
pushInfo.androidFCMChannelID = "fcm_push_channel"
// VIVO message type: 0-push message, 1-System message(have a higher delivery rate)
pushInfo.androidVIVOClassification = 1
// HuaWei message type: https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/message-classification-0000001149358835
pushInfo.androidHuaWeiCategory = "IM"

let params = TUICallParams()
params.userData = "User Data"
params.timeout = 30
params.offlinePushInfo = pushInfo

TUICallKit.createInstance().calls(userIdList: ["123456"], callMediaType: .audio, params: params) {

} fail: { code, message in

}
TUICallDefine.OfflinePushInfo offlinePushInfo = new TUICallDefine.OfflinePushInfo();
offlinePushInfo.setTitle("");
offlinePushInfo.setDesc("You have receive a new call");
// OPPO必须设置ChannelID才可以收到推送消息,这个channelID需要和控制台一致
// OPPO must set a ChannelID to receive push messages. This channelID needs to be the same as the console.
offlinePushInfo.setAndroidOPPOChannelID("tuikit");
offlinePushInfo.setIgnoreIOSBadge(false);
offlinePushInfo.setIOSSound("phone_ringing.mp3");
offlinePushInfo.setAndroidSound("phone_ringing"); //Note:don't add suffix
//VIVO message type: 0-push message, 1-System message(have a higher delivery rate)
offlinePushInfo.setAndroidVIVOClassification(1);
//FCM channel ID, you need change PrivateConstants.java and set "fcmPushChannelId"
offlinePushInfo.setAndroidFCMChannelID("fcm_push_channel");
//Huawei message type
offlinePushInfo.setAndroidHuaWeiCategory("IM");
//IOS push type: if you want user VoIP, please modify type to TUICallDefine.IOSOfflinePushType.VoIP
offlinePushInfo.setIOSPushType(TUICallDefine.IOSOfflinePushType.VoIP);

TUICallDefine.CallParams params = new TUICallDefine.CallParams();
params.offlinePushInfo = offlinePushInfo;

List<String> list = new ArrayList<>();
list.add("mike")
TUICallKit.createInstance(context).calls(list, TUICallDefine.MediaType.Video, params, null);
TUIOfflinePushInfo offlinePushInfo = TUIOfflinePushInfo();
offlinePushInfo.title = "Flutter TUICallKit";
offlinePushInfo.desc = "This is an incoming call from Flutter TUICallkit";
offlinePushInfo.ignoreIOSBadge = false;
offlinePushInfo.iOSSound = "phone_ringing.mp3";
offlinePushInfo.androidSound = "phone_ringing";
offlinePushInfo.androidOPPOChannelID = "Flutter TUICallKit";
offlinePushInfo.androidVIVOClassification = 1;
offlinePushInfo.androidFCMChannelID = "fcm_push_channel";
offlinePushInfo.androidHuaWeiCategory = "Flutter TUICallKit";
offlinePushInfo.iOSPushType = TUICallIOSOfflinePushType.VoIP;

TUICallParams params = TUICallParams(offlinePushInfo: offlinePushInfo);
TUICallKit.instance.calls(['vince'], TUICallMediaType.audio, params);
#import <TUICallKit_Swift/TUICallKit_Swift-Swift.h>
#import <RTCRoomEngine/TUICallEngine.h>

- (TUICallParams *)getCallParams {
TUIOfflinePushInfo *offlinePushInfo = [self createOfflinePushInfo];
TUICallParams *callParams = [TUICallParams new];
callParams.offlinePushInfo = offlinePushInfo;
callParams.timeout = 30;
return callParams;
}

- (TUIOfflinePushInfo *)createOfflinePushInfo {
TUIOfflinePushInfo *pushInfo = [TUIOfflinePushInfo new];
pushInfo.title = @"";
pushInfo.desc = @"您有一个新的通话";
pushInfo.iOSPushType = TUICallIOSOfflinePushTypeVoIP;
pushInfo.ignoreIOSBadge = NO;
pushInfo.iOSSound = @"phone_ringing.mp3";
pushInfo.AndroidSound = @"phone_ringing";
// OPPO必须设置ChannelID才可以收到推送消息,这个channelID需要和控制台一致
// OPPO must set a ChannelID to receive push messages. This channelID needs to be the same as the console.
pushInfo.AndroidOPPOChannelID = @"tuikit";
// FCM channel ID, you need change PrivateConstants.java and set "fcmPushChannelId"
pushInfo.AndroidFCMChannelID = @"fcm_push_channel";
// VIVO message type: 0-push message, 1-System message(have a higher delivery rate)
pushInfo.AndroidVIVOClassification = 1;
// HuaWei message type: https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/message-classification-0000001149358835
pushInfo.AndroidHuaWeiCategory = @"IM";
return pushInfo;
}

[[TUICallKit createInstance] calls:@[@"123456"]
callMediaType:TUICallMediaTypeAudio
params:[self getCallParams] succ:^{

} fail:^(int code, NSString * _Nullable errMsg) {

}];

通过系统通话记录拨打通话

如果需要实现点击系统电话 - 最近通话列表中的通话记录,直接发起单人音视频通话,您需要在 Application 的生命周期回调函数使用 TUIVoIPExtension 组件中的 callWith 接口,具体示例如下:
说明:
仅支持单人音视频通话的直接拨打。
登录账户必须为同一个账户。
1. 在iOS 13(及以后版本)上,使用了 SceneDelegate,且最低兼容版本到iOS 13以下,需分别在 AppDelegateSceneDelegate 中实现如下方法。
Swift
Objective-C
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);
}
#import <TUIVoIPExtension/TUIVoIPExtension.h>

/// AppDelegate 中的实现,iOS 13 以前版本的处理
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
[TUIVoIPExtension callWith:userActivity];
return YES;
}

/// SceneDelegate 中的实现
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)sessionptions:(UISceneConnectionOptions *)connectionOptions {
[connectionOptions.userActivities enumerateObjectsUsingBlock:^(NSUserActivity * _Nonnull userActivity, BOOL * _Nonnull stop) {
[TUIVoIPExtension callWith:userActivity];
}];
}

- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
[TUIVoIPExtension callWith:userActivity];
}
2. 在iOS 13(及以后版本)上,未使用SceneDelegate,只需要在 AppDelegate 实现如下方法。
Swift
Objective-C
import TUIVoIPExtension

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

- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
[TUIVoIPExtension callWith:userActivity];
return YES;
}

常见问题

1. 获取不到 VoIP Push,如何处理?

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

2. 如何自集成 VoIP 推送功能

我们也支持您自己通过SDK的方式来集成 VoIP 推送的能力,整体的方案设计如下:

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


帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈