离线唤醒功能,能够让您的 App 在后台运行或者离线状态下依然能够收到音视频通话的响铃呼叫,TUICallKit 使用 Apple 提供的系统级推送通道(APNs)来进行消息通知。
配置离线推送
步骤1:开启 APP 远程推送
1. 登录 苹果开发者中心 网站,单击【Certificates,Identifiers & Profiles】或者侧栏的【Certificates, IDs & Profiles】,进入 Certificates, IDs & Profiles 页面。 2. 单击 Identifiers 右侧的【+】。
3. 您可以参考如下步骤新建一个 AppID,或者在您原有的 AppID 上增加 Push Notification
的 Service
。
说明:
需要注意的是,您 App 的 Bundle ID
不能使用通配符 *,否则将无法使用远程推送服务。
4. 勾选【App IDs】,单击【Continue】进行下一步。
5. 选择【App】,单击【Continue】进行下一步。
6. 配置Bundle ID
等其他信息,单击【Continue】进行下一步。
7. 勾选【Push Notifications】,开启远程推送服务。
步骤2:生成推送证书
1. 选中您的 AppID,选择【Configure】。
2. 可以看到在【Apple Push Notification service SSL Certificates】窗口中有两个 SSL Certificate
,分别用于开发环境(Development
)和生产环境(Production
)的远程推送证书,如下图所示:
3. 我们先选择开发环境(Development
)的【Create Certificate】,系统将提示我们需要一个Certificate Signing Request(CSR)
。
4. 在 Mac 上打开钥匙串访问工具(Keychain Access),在菜单中选择【钥匙串访问】>【证书助理】>【从证书颁发机构请求证书】(Keychain Access - Certificate Assistant - Request a Certificate From a Certificate Authority
)。
5. 输入用户电子邮件地址(您的邮箱)、常用名称(您的名称或公司名),选择【存储到磁盘】,单击继续,系统将生成一个 *.certSigningRequest
文件。
6. 返回上述 第3步
中 Apple Developer
网站刚才的页面,单击【Choose File】上传生成的*.certSigningRequest
文件。
7. 单击【Continue】,即可生成推送证书。
8. 单击【Download】下载开发环境的 Development SSL Certificate
到本地。
9. 再次按照上述步骤1 - 8,将生产环境的 Production SSL Certificate
下载到本地。
说明:
生产环境的证书实际是开发(Sandbox
)+生产(Production
)的合并证书,可以同时作为开发环境和生产环境的证书使用。
10. 双击打开下载的开发环境和生产环境的 SSL Certificate
,系统会将其导入钥匙串中。
11. 打开钥匙串应用,在【登录】>【我的证书】,右键分别导出刚创建的开发环境(Apple Development IOS Push Service
)和生产环境(Apple Push Services
)的 P12 文件。
步骤3:上传证书到 IM 控制台
2. 单击目标应用卡片,进入应用的基础配置页面。
3. 单击【iOS 原生离线推送设置】右侧的【添加证书】。
4. 选择证书类型,上传 iOS 证书(p.12),设置证书密码,单击【确认】。
说明:
上传证书名最好使用全英文(尤其不能使用括号等特殊字符)。
上传证书需要设置密码,无密码收不到推送。
发布 App Store 的证书需要设置为生产环境,否则无法收到推送。
上传的 p12 证书必须是自己申请的真实有效的证书。
5. 待推送证书信息生成后,记录证书的 ID。
步骤4:完成工程配置
要在应用程序中添加所需的权限,请在 Xcode 项目中启用推送通知功能。
打开 Xcode 项目,在 Project > Target > Capabilities 页面中点击红框中的加号按钮,然后选择并添加 Push Notifications,添加后的结果如图中黄框所示:
步骤5:在 App 每次登录时,向苹果获取 deviceToken
您可以在您的 App 中添加如下代码,用来向苹果的后台服务器获取 deviceToken:
说明:
考虑到合规,建议您在用户同意隐私协议之后再向苹果请求 deviceToken
- (void)registerNotification {
[[UIApplication sharedApplication] registerUserNotificationSettings:
[UIUserNotificationSettings settingsForTypes:
(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge)
categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
-(void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
_deviceToken = deviceToken;
}
步骤6:调用 接口将其上报到 IM 后台
在 IM SDK 登录成功后,就可以调用 setAPNS 接口,将 步骤5 中获取的 deviceToken 上传到腾讯云后台,示例代码如下: - (void)pushRegisterIfLogined {
if (self.deviceToken) {
V2TIMAPNSConfig *config = [[V2TIMAPNSConfig alloc] init];
config.businessID = sdkBusiId;
config.token = self.deviceToken;
[[V2TIMManager sharedInstance] setAPNS:config succ:^{
NSLog(@"%s, succ", __func__");
} fail:^(int code, NSString *msg) {
NSLog(@"%s, fail, %d, %@", __func__, code, msg);
}];
}
}
自定义离线铃声
请在调用 call 拨打电话的时候设置 params 的 offlinePushInfo 中的 iOSSound 字段, iOSSound 传语音文件名。 注意:
离线推送声音设置(仅对 iOS 生效),如果要自定义 iOSSound,需要先把语音文件链接进 Xcode 工程,然后把语音文件名(带后缀名)设置给 iOSSound。
[[TUICallKit createInstance] call:@"mike 的 id" params:[self getCallParams] callMediaType:TUICallMediaTypeVideo];
- (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 = TUICallingLocalize(@"TUICallKit.have.new.invitation");
pushInfo.iOSPushType = TUICallIOSOfflinePushTypeAPNs;
pushInfo.ignoreIOSBadge = NO;
pushInfo.iOSSound = @"phone_ringing.mp3";
pushInfo.AndroidSound = @"phone_ringing";
pushInfo.AndroidOPPOChannelID = @"tuikit";
pushInfo.AndroidFCMChannelID = @"fcm_push_channel";
pushInfo.AndroidVIVOClassification = 1;
pushInfo.AndroidHuaWeiCategory = @"IM";
return pushInfo;
}
常见问题
1、收不到推送,且后台报错 bad devicetoken?
如果使用的是 Release 环境编译,则 - application:didRegisterForRemoteNotificationsWithDeviceToken:
回调返回的是发布环境的 token,此时 businessID 需要设置生产环境的 [证书 ID ](#businessid :缺少内容)。
如果使用的是 Debug 环境编译,则 - application:didRegisterForRemoteNotificationsWithDeviceToken:
回调返回的是开发环境的 token,此时 businessID 需要设置开发环境的证书 ID。
V2TIMAPNSConfig *confg = [[V2TIMAPNSConfig alloc] init];
confg.businessID = sdkBusiId;
confg.token = self.deviceToken;
[[V2TIMManager sharedInstance] setAPNS:confg succ:^{
} fail:^(int code, NSString *msg) {
}];
2、iOS 开发环境下,注册偶现不返回 deviceToken 或提示 APNs 请求 token 失败?
此问题现象是由于 APNs 服务不稳定导致的,可尝试通过以下方式解决:
1. 给手机插入 SIM 卡后使用4G网络测试。
2. 卸载重装、重启 App、关机重启后测试。
3. 打生产环境的包测试。
4. 更换其它 iOS 系统的手机测试。
本页内容是否解决了您的问题?