SOP TRTC SDK 仪表盘 Android TRTC 发送自定义采集的视频数据 Android TRTC 发送自定义采集音频解决方案 Android TRTC 实现横屏视频通话 iOS端 TRTC 发送自定义采集视频解决方案 iOS端 TRTC 发送自定义采集音频解决方案 APNS推送 脏字过滤 TXLiteAVSDK中使用 AVAudioSession 问题总结 AndroidStudio编译SDK报错 RoomService部署验证 Xcode编译SDK报错 iOS编译库冲突问题 iOS端移动直播自定义采集实现 iOS端TXLiteAVSDK与IMSDK 3.x集成冲突报错问题 Android端TXLiteAVSDK与IMSDK 3.x集成冲突报错问题 Android端LiteIM sdk升级IM4.x版本报错问题 移动直播iOS 12兼容问题 如何实现好的画质 如何计算PCM音量大小 使用播放器播放视频有黑边 直播拉流播放失败 直播拉流端卡顿现象 短视频上传失败 移动直播SDK对接第三方美颜库 移动直播连麦解决方案 Android移动直播推自定义采集的视频数据 Android移动直播推自定义采集的声音数据 Android直播播放如何获取YUV数据 Android直播播放如何自定义渲染 实时音视频画面黑屏 实时音视频订阅流显示 iOS 12默认新编译系统下文件名冲突问题 TXLiteAVSDK指标监控 进阶:小程序实时音视频参数透传 移动直播 Android 9.0 无法拉流问题 移动直播推流事件回调 移动直播拉流事件回调 短视频实现视频缩略图列表转GIF功能 roomService加入群组时报错invalid group id NTP时间戳转换 提示Role not exists 角色不存在 如何播放背景音乐 iOS端短视频添音频相关问题总结 Web同步终端离线推送TIMOfflinePushInfo说明文档 web端自定义消息发送 web端同步终端的已读回执 web端对群组内用户禁言操作 TRTC v2混流接口setMixTranscodingConfig使用指引

APNs推送

发布日期:2018年8月30日 更新日期:2018年8月30日 贡献者:lltingli

场景

即时通讯中需要对离线消息进行接收,此时就需要离线推送即当应用没有退出登录的情况下,被系统或者用户杀掉进程仍然能收到IMSDK消息提醒。云通讯iOS客户端采用的是APNs推送服务,以下提供整个处理流程及参考代码。

处理流程

  1. 申请APNs证书可参考文档:Apple 推送证书申请
  2. 上传证书到腾讯云控制台

    注意:

    • 上传证书名最好使用全英文(尤其不能使用括号等特殊字符)。
    • 上传证书生效时间为 10 分钟左右。
    • 上传证书需要设置密码,无密码收不到推送。
    • 注意生产环境的选择,发布 AppStore 的证书需要设置为生产环境,否则无法收到推送。
    • 上传的 p12 证书必须是自己申请的真实有效的证书。
  3. 客户端实现APNs推送

客户端实现步骤

1. 向苹果后台请求DeviceToken

//在IM登录之后注册通知
- (void)registNotification
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    {
        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    }
    else
    {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
    }
}

2. 上传Token到腾讯云

//在通知的回调中上传的token
-(void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    DebugLog(@"didRegisterForRemoteNotificationsWithDeviceToken:%ld", (unsigned long)deviceToken.length);
    NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
    [[TIMManager sharedInstance] log:TIM_LOG_INFO tag:@"SetToken" msg:[NSString svtringWithFormat:@"My Token is :%@", token]];
    TIMTokenParam *param = [[TIMTokenParam alloc] init];
    //注意区分证书环境
#if kAppStoreVersion
    // AppStore版本
#if DEBUG
    param.busiId = 2383;
#else
    param.busiId = 2382;
#endif
#else
    //企业证书id
    param.busiId = 4496;
#endif
    [param setToken:deviceToken];
    //调用IM API 上传Token到腾讯云
    [[TIMManager sharedInstance] setToken:param succ:^{
        NSLog(@"-----> 上传token成功 ");
    } fail:^(int code, NSString *msg) {
        NSLog(@"-----> 上传token失败 ");
    }];
}

3. App进入后台时上报切后台事件

//App进入后台 上报事件
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    __block UIBackgroundTaskIdentifier bgTaskID;
    bgTaskID = [application beginBackgroundTaskWithExpirationHandler:^ {
        //不管有没有完成,结束background_task任务
        [application endBackgroundTask: bgTaskID];
        bgTaskID = UIBackgroundTaskInvalid;
    }];

    //App进入后台时配置
    // 将相关的配置缓存至本地
    [[IMAPlatform sharedInstance] saveToLocal];
    NSUInteger unReadCount = [[IMAPlatform sharedInstance].conversationMgr unReadMessageCount];
    [UIApplication sharedApplication].applicationIconBadgeNumber = unReadCount;
    TIMBackgroundParam  *param = [[TIMBackgroundParam alloc] init];
    [param setC2cUnread:(int)unReadCount];
    [[TIMManager sharedInstance] doBackground:param succ:^() {
        DebugLog(@"doBackgroud Succ");
    } fail:^(int code, NSString * err) {
        DebugLog(@"Fail: %d->%@", code, err);
    }];
}

4. App进入前台时上报切前台事件

//App进入前台
- (void)applicationDidBecomeActive:(UIApplication *)application
{
   [[TIMManager sharedInstance] doForeground:^() {
           DebugLog(@"doForegroud Succ");
     } fail:^(int code, NSString * err) {
           DebugLog(@"Fail: %d->%@", code, err);
     }];
}

5. 离线消息处理

// 处理推送消息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    DebugLog(@"userinfo:%@",userInfo);
    DebugLog(@"收到推送消息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
    //当APP在前台运行时,不做处理
    if( [UIApplication sharedApplication].applicationState == UIApplicationStateActive){

    }else if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive) {
        //当APP在后台运行时,当有通知栏消息时,点击它,就会执行下面的方法跳转到相应的页面
        if ([[TIMManager sharedInstance] getLoginStatus])
        {
            for (NSString *tfStr in userInfo)
            {
                if ([tfStr isEqualToString:@"careline"])
                {
                    //跳转到对应的页面

                }
            }
        }
    }

}

推送机制

上图可以分为三个阶段:

  1. 应用程序的服务器端把要发送的消息、目的iPhone的标识打包,发给APNS。
  2. APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。
  3. iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。

问题排查

  1. 确认是否按照上传证书到控制台 正确上传证书到腾讯云控制台
  2. 确认在登录成功后,是否成功上报token到腾讯云了,注意开发环境与发布环境的token不一样,删除app重新装也会导致token的变化。建议每次登录后都获取token。
  3. 确认是否正确上报了切前后台事件,应用进入后台上报applicationDidEnterBackground事件,进入前台上报applicationDidBecomeActive事件。
  4. 确认TIMCustomElem消息中的desc属性是否是空的,如果desc为空消息将发送不出。
  5. MsgRandom 等去重标记设为一样,导致被去重无法推送
  6. 对于群消息,确认群消息接收选项是否为接收群消息提醒
    //设置群接收选项
    [[TIMGroupManager sharedInstance] ModifyReciveMessageOpt:@"TGID1JYSZEAEQ" opt:TIM_GROUP_RECEIVE_MESSAGE succ:^() {
     NSLog(@"modify receive group message option succ");
    }fail:^(int code, NSString* err) {
     NSLog(@"failed code: %d %@", code, err);
    }];
    
  7. 对于更换证书的情况下新证书得在上传一个小时后生效
  8. 以上排查不出问题可提供sdkappid、证书id、发送接收双方的账号给技术人员排查

参考文档:

  1. http://blog.jiguang.cn/ios_push_overall
  2. https://segmentfault.com/a/1190000012019282
  3. https://blog.csdn.net/csdn100861/article/details/51508885

results matching ""

    No results matching ""