智慧服务,成就美好体验 项目咨询

主页 > 服务与支持 > 开发平台 > 客户端SDK参考 > iOS Native SDK > 会议 网络变化时恢复会议

入门使用

网络变化时恢复会议

更新时间:2019-11-20

网络变化时恢复会议

描述

用户正在会议中,用户设备的网络发生变化时,应用程序可以自动恢复会议连接。

前提条件

用户正在会议中,应用程序检测到IP地址变化。

业务流程

图1 网络变化恢复会议流程

  1. 应用程序检查到IP地址变化,并获取到有效IP,UI调用tsdk_set_config_param()接口设置最新的本地IP,参数ID:TSDK_E_CONFIG_LOCAL_ADDRESS。
    说明: 

    若应用程序期望SDK尝试以最大能力自动恢复,需要将参数TSDK_S_LOCAL_ADDRESS结构中 is_try_resume 设置为TSDK_TRUE。

    代码示例:

    //oc code
    -(void)networkStatusChangeNotify:(NSNotification *)notify
    {
        NetworkStatus netStatus = (NetworkStatus)[[notify object] integerValue];
    
        if (netStatus == ECSNotReachable)
        {
            if (!_isJoinConfCall) {
                [[ManagerService callService] hangupAllCall];
                [self showMessage:@"Current network is unavailable"];
            }
        }
        NSString *ip = [CommonUtils getLocalIpAddressWithIsVPN:[CommonUtils checkIsVPNConnect]];
        if ([ip isEqualToString:@"0.0.0.0"]) {
            [[ECSDKProgressHud shareInstance] makeProgressHUD:@"the network is disconnected" duration:2.0];
        }
        if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
            return;
        }
        if (![LoginCenter sharedInstance].isResuming) {
            //config local ip
            TSDK_S_LOCAL_ADDRESS local_ip;
            memset(&local_ip, 0, sizeof(TSDK_S_LOCAL_ADDRESS));
    
            strcpy(local_ip.ip_address, [ip UTF8String]);
            local_ip.is_try_resume = TSDK_TRUE;
            TSDK_RESULT configResult = tsdk_set_config_param(TSDK_E_CONFIG_LOCAL_ADDRESS, &local_ip);
            DDLogInfo(@"config local address result: %d; local ip is: %@", configResult, ip);
        }else{
            _needSetLocalIp = YES;
        }
    }
     
  2. 如果在当前正在会议中,SDK自动启动恢复处理,向UI上报会议恢复中通知TSDK_E_CONF_EVT_CONF_RESUMING_IND,应用程序UI应记录当前状态,并提示用户。
    说明: 

    若不在会议中,则仅进行尝试恢复登录处理。

    代码示例:

    //oc code
    case TSDK_E_CONF_EVT_CONF_RESUMING_IND:
    {
         self.hasConfResumedFirstRewatch = YES;
         [self confStopReplay];
         dispatch_async(dispatch_get_main_queue(), ^{
            [[NSNotificationCenter defaultCenter] postNotificationName:LOGIN_AND_CONF_RESUMING_NOTIFY object:nil];
          });
    }
        break;
     
  3. SDK向UI上报会议恢复中通知TSDK_E_LOGIN_EVT_LOGIN_RESUMING_IND,应用程序UI应记录当前状态,并提示用户。
    说明: 

    若在会议中,建议应用程序仅提示“会议正在恢复中”。

    代码示例:

    //oc code
    - (void) showResumeNotify
    {
        if (_isJoinConfCall) {
            [[ECSDKProgressHud shareInstance] makeProgressHUD:@"Poor network quality. Attempting to join the meeting again..." duration:4.0];
        }else{
            [[ECSDKProgressHud shareInstance] makeProgressHUD:@"Poor network quality. Attempting to login again..." duration:4.0];
        }
    }
     
  4. SDK完成登录恢复处理,向UI上报登录恢复结果通知TSDK_E_LOGIN_EVT_LOGIN_RESUME_RESULT。
    说明: 

    登录状态恢复过程中,SDK上报的过程事件通知与普通登录处理相同。恢复过程若出现异常,则通过

    TSDK_E_LOGIN_EVT_LOGIN_RESUME_RESULT上报原因。只有登录恢复成功,SDK才会进行会议恢复处理。

    代码示例:

    //oc code
    case TSDK_E_CONF_EVT_CONF_RESUME_RESULT:
        {
            DDLogInfo(@"TSDK_E_CONF_EVT_CONF_RESUME_RESULT");
            BOOL result = notify.param2 == TSDK_SUCCESS;
            if (!result) {
                DDLogError(@"TSDK_E_CONF_EVT_JOIN_CONF_RESULT,error:%@",[NSString stringWithUTF8String:(TSDK_CHAR *)notify.data]);
                [self restoreConfParamsInitialValue];
                return;
            }
    
            _confHandle = notify.param1;
            TSDK_S_RESUME_CONF_IND_INFO *confResumeInfo = (TSDK_S_RESUME_CONF_IND_INFO *)notify.data;
            TSDK_S_JOIN_CONF_IND_INFO* confInfo = (TSDK_S_JOIN_CONF_IND_INFO *)&confResumeInfo->join_conf_ind_info;
            self.currentCallId = confInfo->call_id;
    
            if (self.currentJoinConfIndInfo == nil) {
                self.currentJoinConfIndInfo = [[JoinConfIndInfo alloc] init];
            }
            self.currentJoinConfIndInfo.callId = confInfo->call_id;
            self.currentJoinConfIndInfo.confMediaType = confInfo->conf_media_type;
            self.currentJoinConfIndInfo.isHdConf = confInfo->is_hd_conf;
            self.currentJoinConfIndInfo.confEnvType = confInfo->conf_env_type;
            self.currentJoinConfIndInfo.isSvcConf = confInfo->is_svc_conf;
            self.currentJoinConfIndInfo.svcLableCount = confInfo->svc_label_count;
            NSMutableArray *lableArray = [[NSMutableArray alloc] init];
            TSDK_UINT32 *svc_lable = confInfo->svc_label;
            for (int i = 0; i <= self.currentJoinConfIndInfo.svcLableCount; i++) {
                TSDK_UINT32 lable = svc_lable[i];
                [lableArray addObject:[NSNumber numberWithInt:lable]];
            }
            self.currentJoinConfIndInfo.svcLable = [NSArray arrayWithArray:lableArray];
    
    
            if (confInfo->conf_media_type == TSDK_E_CONF_MEDIA_VIDEO || confInfo->conf_media_type == TSDK_E_CONF_MEDIA_VIDEO_DATA) {
                self.isVideoConfInvited = YES;
            }
            [self respondsECConferenceDelegateWithType:CONF_E_CONNECT result:nil];
    
            dispatch_async(dispatch_get_main_queue(), ^{
                // go conference
                DDLogInfo(@"goConferenceRunView");
                [[NSNotificationCenter defaultCenter] postNotificationName:TUP_CALL_REMOVE_CALL_VIEW_NOTIFY object:nil];
    
            });
        }
        break;
     
  5. SDK完成会议恢复处理,向UI上报会议恢复结果通知TSDK_E_CONF_EVT_CONF_RESUME_RESULT,应用程序刷新信息并提示用户。
    说明: 
    • 若会议恢复成功,TSDK_E_CONF_EVT_CONF_RESUME_RESULT事件携带的信息中,"handle"为新的会议句柄,应用程序应保存此句柄信息;TSDK_S_RESUME_CONF_IND_INFO 结构中携带的“original_handle”为原始的会议句柄信息,用于应用程序关联新老句柄;TSDK_S_RESUME_CONF_IND_INFO 结构中携带的"join_conf_ind_info"为重新加入会议的通知信息,与普通加入会议时携带的“加入会议通知信息”相同,应用程序应更新记录相应信息,若当前为一个视频会议,则需要重新绑定窗口信息。后继过程与普通加入会议过程相同。
    • 若会议恢复失败,TSDK_E_CONF_EVT_CONF_RESUME_RESULT事件携带的信息中,"handle"为原会议句柄,应用程序UI应该从会议界面退出,并清除应用层记录的相关会议信息。

注意事项

若SDK在首次上报TSDK_E_CONF_EVT_CONF_RESUMING_IND事件60秒内,未正常恢复会议,SDK会自动放弃恢复。