tencent cloud

文档反馈

最后更新时间:2024-05-28 17:50:53
    离线唤醒功能,能够让您的 App 在后台运行或者离线状态下依然能够收到音视频通话的响铃呼叫,TUICallKit 使用 Apple 提供的系统级推送通道(APNs)来进行消息通知。

    集成效果

    锁屏时的效果
    在后台时的效果
    
    
    
    
    
    

    配置离线推送

    步骤1:开启 APP 远程推送

    1. 登录 苹果开发者中心 网站,单击 Certificates, IDs & Profiles 选项卡中的 Identifiers,进入 Certificates, Identifiers & Profiles 页面。
    
    
    
    2. 单击 Identifiers 右侧的 +
    
    
    
    3. 您可以参见如下步骤新建一个 AppID,或者在您原有的 AppID 上增加 Push NotificationService
    说明:
    需要注意的是,您 App 的 Bundle ID 不能使用通配符 *,否则将无法使用远程推送服务。
    4. 勾选 App IDs,单击 Continue 进行下一步。
    5. 选择 App,单击 Continue 进行下一步。
    6. 配置Bundle ID等其他信息,单击 Continue 进行下一步。
    7. 勾选 Push Notifications,开启远程推送服务。
    
    
    

    步骤2:生成推送证书

    1. 选中您的 AppID,找到 Push Notifications 配置项,选择 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. 输入用户电子邮件地址(您的邮箱)、常用名称(您的名称或公司名),选择存储到磁盘(Saved to disk),单击继续,系统将生成一个 *.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 文件。
    说明:
    保存P12文件时,请务必要为其设置密码。

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

    2. 单击目标应用卡片,进入应用的基础配置页面。单击 Offline Push Certificate Configuration 选项卡中的 Go now
    
    3. Manufacturer configuration 中,切换到 iOS, 单击 Add Certificate,然后在悬浮页面中选择证书类型,上传 iOS 证书(p.12),设置证书密码,单击 Confirm
    
    说明:
    上传证书名最好使用全英文(尤其不能使用括号等特殊字符)。
    上传证书需要设置密码,无密码收不到推送。
    发布 App Store 的证书需要设置为生产环境,否则无法收到推送。
    上传的 p12 证书必须是自己申请的真实有效的证书。
    4. 待推送证书信息生成后,记录证书的 ID,将在 步骤6:调用接口将其上报到 IM 后台 作为必填参数使用。
    

    步骤4:完成工程配置

    要在应用程序中添加所需的权限,请在 Xcode 项目中启用推送通知功能。
    打开 Xcode 项目,在 Project > Target > Capabilities 页面中单击红框中的 +,然后选择并添加 Push Notifications,添加后的结果如图中黄框所示:
    
    
    

    步骤5:在 App 每次登录时,向苹果获取 deviceToken

    您可以在您的 App 中添加如下代码,用来向苹果的后台服务器获取 deviceToken:
    说明:
    考虑到合规,建议您在用户同意隐私协议之后再向苹果请求 deviceToken。
    Swift
    Objective-C
    import ImSDK_Plus
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
    if let error = error {
    print("Error requesting authorization for notifications: \\(error)")
    return
    }
    DispatchQueue.main.async {
    application.registerForRemoteNotifications()
    }
    }
    return true
    }
    
    // 在 AppDelegate 的回调中会返回 deviceToken,需要在登录后上报给腾讯云后台
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // 记录下 Apple 返回的 deviceToken
    tuiDeviceToken = deviceToken
    }
    #import <UserNotifications/UserNotifications.h>
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge)
    completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (error) {
    NSLog(@"Error requesting authorization for notifications: %@", error);
    return;
    }
    
    // 向苹果后台请求 DeviceToken
    dispatch_async(dispatch_get_main_queue(), ^{
    [application registerForRemoteNotifications];
    });
    }];
    return YES;
    }
    
    // 在 AppDelegate 的回调中会返回 deviceToken,需要在登录后上报给腾讯云后台
    -(void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    // 记录下 Apple 返回的 deviceToken
    _deviceToken = deviceToken;
    }

    步骤6:调用接口将其上报到 IM 后台

    在 IM SDK 登录成功后,就可以调用 setAPNS 接口,将 步骤5 中获取的 deviceToken 上传到腾讯云后台,示例代码如下:
    Swift
    Objective-C
    import ImSDK_Plus
    
    func pushRegisterIfLogin() {
    let config = V2TIMAPNSConfig()
    // 用户自己到苹果注册开发者证书,在开发者帐号中下载并生成证书(p12 文件),将生成的 p12 文件传到腾讯证书管理控制台,
    // 控制台会自动生成一个证书 ID,将证书 ID 传入以下 businessID 参数中。
    config.businessID = 1234;
    // 苹果后台服务器获取的 deviceToken
    config.token = tuiDeviceToken;
    V2TIMManager.sharedInstance().setAPNS(config) {
    
    } fail: { code, msg in
    
    }
    }
    #import <ImSDK_Plus/ImSDK_Plus.h>
    
    - (void)pushRegisterIfLogin {
    V2TIMAPNSConfig *config = [[V2TIMAPNSConfig alloc] init];
    // 用户自己到苹果注册开发者证书,在开发者帐号中下载并生成证书(p12 文件),将生成的 p12 文件传到腾讯证书管理控制台,
    // 控制台会自动生成一个证书 ID,将证书 ID 传入以下 businessID 参数中。
    config.businessID = 1234;
    // 苹果后台服务器获取的 deviceToken
    config.token = _deviceToken;
    
    [[V2TIMManager sharedInstance] setAPNS:config succ:^{
    
    } fail:^(int code, NSString *msg) {
    
    }];
    }

    自定义离线铃声

    请在调用 call 拨打电话的时候设置 params 的 offlinePushInfo 中的 iOSSound 字段, iOSSound 传语音文件名。
    注意:
    离线推送声音设置(仅对 iOS 生效),如果要自定义 iOSSound,需要先把语音文件链接进 Xcode 工程,然后把语音文件名(带后缀名)设置给 iOSSound。
    Swift
    Objective-C
    import TUICallKit_Swift
    import TUICallEngine
    
    let pushInfo: TUIOfflinePushInfo = TUIOfflinePushInfo()
    pushInfo.title = ""
    pushInfo.desc = "您有一个新的通话"
    pushInfo.iOSPushType = .apns
    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().call(userId: "123456", callMediaType: .audio, params: params) {
    
    } fail: { code, message in
    
    }
    #import <TUICallKit_Swift/TUICallKit_Swift-Swift.h>
    #import <TUICallEngine/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 = TUICallIOSOfflinePushTypeAPNs;
    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] callWithUserId:@"123456"
    callMediaType:TUICallMediaTypeAudio
    params:[self getCallParams] succ:^{
    
    } fail:^(int code, NSString * _Nullable errMsg) {
    
    }];

    常见问题

    收不到推送,且后台报错 bad devicetoken?

    Apple 的 deviceToken 与当前编译环境有关。如果 登录 IMSDK 后上传 deviceToken 到腾讯云 所使用的证书 ID 和 token 不一致,就会报错。
    如果使用的是 Release 环境编译,则 - application:didRegisterForRemoteNotificationsWithDeviceToken: 回调返回的是发布环境的 token,此时 businessID 需要设置生产环境的 [证书 ID ](#businessid :缺少内容)。
    如果使用的是 Debug 环境编译,则 - application:didRegisterForRemoteNotificationsWithDeviceToken: 回调返回的是开发环境的 token,此时 businessID 需要设置开发环境的证书 ID。

    iOS 开发环境下,注册偶现不返回 deviceToken 或提示 APNs 请求 token 失败?

    此问题现象是由于 APNs 服务不稳定导致的,可尝试通过以下方式解决:
    1. 给手机插入 SIM 卡后使用4G网络测试。
    2. 卸载重装、重启 App、关机重启后测试。
    3. 打生产环境的包测试。
    4. 更换其它 iOS 系统的手机测试。
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持