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

主页 > 服务与支持 > 开发平台 > 客户端SDK参考 > iOS Native SDK > 会议 会议接入

入门使用

会议接入

更新时间:2019-11-20

会议列表一键入会

描述

用户通过会议列表一键入会的方式加入会议。

前提条件

  1. 鉴权登录成功。
  2. SIP号码已成功注册。
  3. 会议环境参数已设置。

业务流程

图1 会议列表一键入会流程

  1. UI调用tsdk_join_conference()加入会议;SDK发送加入会议请求至服务器。
    说明: 

    在加入会议时,入会参数(conf_join_param),是否视频接入会议(is_video_join)为必选;

    1. 入会参数结构体中conf_id,access_number,conf_password都为必选。
    2. 入会号码(join_number)如果不填,则使用自己软终端号码入会。
    3. 会议对应的呼叫ID(接口会同步返回call_id,需要记录下),在使用SIP终端号码入会时有效。
    代码示例:
    -(BOOL)joinConferenceWithConfId:(NSString *)confId AccessNumber:(NSString *)accessNumber confPassWord:(NSString *)confPassWord joinNumber:(NSString *)joinNumber isVideoJoin:(BOOL)isVideoJoin
    {    
        TSDK_S_CONF_JOIN_PARAM confJoinParam;    
        memset(&confJoinParam, 0, sizeof(TSDK_S_CONF_JOIN_PARAM));    
        if (confId.length > 0 && confId != nil) 
        {        
            strcpy(confJoinParam.conf_id, [confId UTF8String]);    
        }    
        if (confPassWord.length > 0 && confPassWord != nil) 
        {        
            strcpy(confJoinParam.conf_password, [confPassWord UTF8String]);    
        }    
        if (accessNumber.length > 0 && accessNumber != nil) 
        {        
            strcpy(confJoinParam.access_number, [accessNumber UTF8String]);    
        }        
        TSDK_CHAR join_number;    
        if (!self.selfJoinNumber) 
        {        
            self.selfJoinNumber = self.sipAccount;    
        }    
        strcpy(&join_number, [self.selfJoinNumber UTF8String]);        
        TSDK_UINT32 call_id;        
        BOOL result = tsdk_join_conference(&confJoinParam, &join_number, (TSDK_BOOL)isVideoJoin, &call_id);    
        DDLogInfo(@"tsdk_join_conference = %d, call_id is :%d",result,call_id);    
        return result == TSDK_SUCCESS ? YES : NO;
    }
     
  2. SDK在收到服务器返回的加入会议响应后,向UI上报加入会议结果通知TSDK_E_CONF_EVT_JOIN_CONF_RESULT,对应的结果数据结构为TSDK_S_JOIN_CONF_IND_INFO,并返回conf handle,后续会控时使用,此时, UI可跳转至会议界面。
    说明: 
    1. 在加入会议时,会请求会议权限,若请求失败,则会向UI上报会议权限请求失败通知TSDK_E_CONF_EVT_REQUEST_CONF_RIGHT_FAILED,UI提示申请会控权限失败,若请求成功,则不上报。
    2. 若应用程序是以多流的方式(SVC)成功加入会议,则此结果通知中会携带SVC信息,包含 is_svc_conf (是否多流会议)、svc_label_count(可使用的多流Label数) 和 svc_label (多流Label 表),应用程序应保存多流“Label”信息,用于后继流程中“绑定SVC视频窗口”、"选看SVC与会者"和“设置SVC窗口和与会者关系”等操作。
    代码示例:
    case TSDK_E_CONF_EVT_JOIN_CONF_RESULT:        
    {         
        DDLogInfo(@"TSDK_E_CONF_EVT_JOIN_CONF_RESULT");            
        BOOL result = notify.param2 == TSDK_SUCCESS;            
        if (!result) 
        {                
            DDLogError(@"TSDK_E_CONF_EVT_JOIN_CONF_RESULT,error:%@",[NSString stringWithUTF8String:(TSDK_CHAR *)notify.data]);                
            return;            
        }                        
        _confHandle = notify.param1;            
        TSDK_S_JOIN_CONF_IND_INFO *confInfo = (TSDK_S_JOIN_CONF_IND_INFO *)notify.data;            
        _currentCallId = confInfo->call_id;                        
        dispatch_async(dispatch_get_main_queue(), ^{                
            // go conference                               
            [self goConferenceRunView:nil];                
            [self respondsECConferenceDelegateWithType:CONF_E_CONNECT result:nil];                
            [[NSNotificationCenter defaultCenter] postNotificationName:TUP_CALL_REMOVE_CALL_VIEW_NOTIFY object:nil];            
        });        
    }            
    break;
     
  3. SDK收到会议状态更新通知,向UI上报会议信息及状态更新事件TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE,UI刷新会议成员列表和会议信息。
    代码示例:
    case TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE:        
    {            
        DDLogInfo(@"TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE");                        
        [self handleAttendeeUpdateNotify:notify];        
    }           
    break;
     
  4. 若会议包含数据会议能力,SDK会向UI上报获取数据会议参数结果TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT。
    代码示例:
    case TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT:        
    {            
        DDLogInfo(@"TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT");            
        BOOL result = notify.param2 == TSDK_SUCCESS;            
        if (!result) 
        {                
            DDLogError(@"TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT,error:%@",[NSString stringWithUTF8String:(TSDK_CHAR *)notify.data]);                
            return;            
        }            
        dispatch_async(dispatch_get_main_queue(), ^{                
             [self joinDataConference];                
            [self startHeartBeatTimer];            
        });                    
    }            
    break;
     
  5. 此时UI可选择自动加入或用户选择加入数据会议,调用加入数据会议接口tsdk_join_data_conference(),SDK发送创建会议请求至会议服务器。
    代码示例:
    -(void)joinDataConference
    {    
        TSDK_RESULT result = tsdk_join_data_conference(_confHandle);    
        DDLogInfo(@"tsdk_join_data_conference ret: %d", result);
    }
     
  6. SDK在收服务器加入数据会议响应后,向UI上报数据会议加入结果通知TSDK_E_CONF_EVT_JOIN_DATA_CONF_RESULT,若成功,则UI刷新界面,提示加入数据会议成功,若失败,则提示加入数据会议失败。
    说明: 

    在加入数据会议后,会向UI上报会议信息及状态更新事件TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE,UI刷新会议成员列表和会议信息。

    代码示例:
    case TSDK_E_CONF_EVT_JOIN_DATA_CONF_RESULT:        
    {            
        DDLogInfo(@"TSDK_E_CONF_EVT_JOIN_DATA_CONF_RESULT");            
        NSDictionary *resultInfo = nil;            
        BOOL isSuccess = notify.param2 == TSDK_SUCCESS;            
        resultInfo = @{                           
            UCCONF_RESULT_KEY :[NSNumber numberWithBool:isSuccess]                           
        };            
      [self respondsECConferenceDelegateWithType:DATA_CONF_JOIN_RESOULT result:resultInfo];        
    }            
    break;
     

注意事项

无。

会议接入码入会

描述

用户由第三方途径获取会议信息,通过输入会议号和接入码的方式加入会议。

说明: 
  1. 因不支持从拨号盘拨打“会议号”+“接入码”的方式直接加入会议,所以应用程序界面需要提供“接入会议”的单独入口;
  2. 与“会议列表一键入会”的接口调用流程相同,不同在于用户界面入口。

业务流程

参见“会议列表一键入会”。

注意事项

无。

统一会议接入号入会

描述

用户由第三方途径获取会议信息,通过拨打统一会议接入号,使用IVR导航的方式加入会议。

前提条件

  1. 鉴权登录成功。
  2. SIP号码已成功注册。
  3. 会议环境参数已设置。

业务流程

图2 统一会议接入号入会流程

  1. UI调用“音视频呼叫”接口tsdk_start_call()发起一个呼叫请求,被叫号码为“统一会议接入号”。
    代码示例:
    TSDK_BOOL isVideo = ((TSDK_CALL_E_CALL_TYPE)callType==CALL_VIDEO)?TSDK_TRUE:TSDK_FALSE;    
    TSDK_UINT32 callid = 0;    
    TSDK_RESULT ret = tsdk_start_call(&callid,(TSDK_CHAR*)[number UTF8String], isVideo);
     
  2. 若呼叫建立 成功,SDK向UI上报呼叫建立事件TSDK_E_CALL_EVT_CALL_CONNECTED,与普通音视频呼叫相同。
    代码示例:
    case TSDK_E_CALL_EVT_CALL_CONNECTED:        
    {            
        DDLogInfo(@"Call_Log: recv call notify :CALL_E_EVT_CALL_CONNECTED");            
        TSDK_S_CALL_INFO *callInfo = (TSDK_S_CALL_INFO *)notify.data;           
        CallInfo *tsdkCallInfo = [CallInfo transfromFromCallInfoStract:callInfo];            
        NSString *callId = [NSString stringWithFormat:@"%d", tsdkCallInfo.stateInfo.callId];            
        [_tsdkCallInfoDic setObject:tsdkCallInfo forKey:callId];            
        NSDictionary *resultInfo = @{                                        
            TSDK_CALL_INFO_KEY : tsdkCallInfo                                         
        };            
        [self respondsCallDelegateWithType:CALL_CONNECT result:resultInfo];
    }
     
  3. 用户根据服务器的语言提示,在二次拨号界面输入会议接入码和密码,UI调用tsdk_send_dtmf()完成会议接入码和密码发送,SDK完成入会交互处理。
    代码示例:
    - (BOOL)sendDTMFWithDialNum:(NSString *)number callId:(unsigned int)callId
    {    
        TSDK_E_DTMF_TONE dtmfTone = (TSDK_E_DTMF_TONE)[number intValue];    
        if ([number isEqualToString:@"*"])    
        {        
             dtmfTone = TSDK_E_DTMF_STAR;    
        }    
        else if ([number isEqualToString:@"#"])    
        {        
            dtmfTone = TSDK_E_DTMF_POUND;    
        }    
        TSDK_UINT32 callid = callId;    
        TSDK_RESULT ret = tsdk_send_dtmf((TSDK_UINT32)callid,(TSDK_E_DTMF_TONE)dtmfTone);    
        DDLogInfo(@"Call_Log: tsdk_send_dtmf = %@",(TSDK_SUCCESS == ret)?@"YES":@"NO");    
        return ret == TSDK_SUCCESS ? YES : NO;
    }
     
  4. SDK在收到服务器返回的加入会议响应后,向UI上报加入会议结果通知TSDK_E_CONF_EVT_JOIN_CONF_RESULT,对应的结果数据结构为TSDK_S_JOIN_CONF_IND_INFO,并返回conf handle,后续会控时使用,此时, UI可跳转至会议界面。
    说明: 
    1. 在加入会议时,会请求会议权限,若请求失败,则会向UI上报会议权限请求失败通知TSDK_E_CONF_EVT_REQUEST_CONF_RIGHT_FAILED,UI提示申请会控权限失败,若请求成功,则不上报。
    2. 若应用程序是以多流的方式(SVC)成功加入会议,则此结果通知中会携带SVC信息,包含 is_svc_conf (是否多流会议)、svc_label_count(可使用的多流Label数) 和 svc_label (多流Label 表),应用程序应保存多流“Label”信息,用于后继流程中“绑定SVC视频窗口”、"选看SVC与会者"和“设置SVC窗口和与会者关系”等操作。
    代码示例:
    case TSDK_E_CONF_EVT_JOIN_CONF_RESULT:        
    {         
        DDLogInfo(@"TSDK_E_CONF_EVT_JOIN_CONF_RESULT");            
        BOOL result = notify.param2 == TSDK_SUCCESS;            
        if (!result) 
        {                
            DDLogError(@"TSDK_E_CONF_EVT_JOIN_CONF_RESULT,error:%@",[NSString stringWithUTF8String:(TSDK_CHAR *)notify.data]);                
            return;            
        }                        
        _confHandle = notify.param1;            
        TSDK_S_JOIN_CONF_IND_INFO *confInfo = (TSDK_S_JOIN_CONF_IND_INFO *)notify.data;            
        _currentCallId = confInfo->call_id;                        
        dispatch_async(dispatch_get_main_queue(), ^{                
            // go conference                               
            [self goConferenceRunView:nil];                
            [self respondsECConferenceDelegateWithType:CONF_E_CONNECT result:nil];                
            [[NSNotificationCenter defaultCenter] postNotificationName:TUP_CALL_REMOVE_CALL_VIEW_NOTIFY object:nil];            
        });        
    }            
    break;
     
  5. SDK收到会议状态更新通知,向UI上报会议信息及状态更新事件TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE,UI刷新会议成员列表和会议信息。
    代码示例:
    case TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE:        
    {            
        DDLogInfo(@"TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE");                        
        [self handleAttendeeUpdateNotify:notify];        
    }           
    break;
     
  6. 若会议包含数据会议能力,SDK会向UI上报获取数据会议参数结果TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT。
    代码示例:
    case TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT:        
    {            
        DDLogInfo(@"TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT");            
        BOOL result = notify.param2 == TSDK_SUCCESS;            
        if (!result) 
        {                
            DDLogError(@"TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT,error:%@",[NSString stringWithUTF8String:(TSDK_CHAR *)notify.data]);                
            return;            
        }            
        dispatch_async(dispatch_get_main_queue(), ^{                
             [self joinDataConference];                
            [self startHeartBeatTimer];            
        });                    
    }            
    break;
     
  7. 此时UI可选择自动加入或用户选择加入数据会议,调用加入数据会议接口tsdk_join_data_conference,SDK发送创建会议请求至会议服务器。
    代码示例:
    -(void)joinDataConference
    {    
        TSDK_RESULT result = tsdk_join_data_conference(_confHandle);    
        DDLogInfo(@"tsdk_join_data_conference ret: %d", result);
    }
     
  8. SDK在收服务器加入数据会议响应后,向UI上报数据会议加入结果通知TSDK_E_CONF_EVT_JOIN_DATA_CONF_RESULT,若成功,则UI刷新界面,提示加入数据会议成功,若失败,则提示加入数据会议失败。
    说明: 

    在加入数据会议后,会向UI上报会议信息及状态更新事件TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE,UI刷新会议成员列表和会议信息。

    代码示例:
    case TSDK_E_CONF_EVT_JOIN_DATA_CONF_RESULT:        
    {            
        DDLogInfo(@"TSDK_E_CONF_EVT_JOIN_DATA_CONF_RESULT");            
        NSDictionary *resultInfo = nil;            
        BOOL isSuccess = notify.param2 == TSDK_SUCCESS;            
        resultInfo = @{                           
            UCCONF_RESULT_KEY :[NSNumber numberWithBool:isSuccess]                           
        };            
      [self respondsECConferenceDelegateWithType:DATA_CONF_JOIN_RESOULT result:resultInfo];        
    }            
    break;
     

注意事项

无。

被邀接入会议

描述

会议主席邀请新的与会者加入会议。

与会者通过主席身份加入会议,或已申请获取为主席。

业务流程

图3 被邀入会流程 
  1. 被邀与会者侧SDK收到会议来电请求,向UI上报会议来电事件TSDK_E_CONF_EVT_CONF_INCOMING_IND,对应的事件数据结构为TSDK_S_CONF_INCOMING_INFO,UI提示用户会议来电。
    说明: 

    在会议来电通知携带的信息(TSDK_S_CONF_INCOMING_INFO)中,对端号码(number)一般默认为会议服务的统一接入号码,作为对用户的提示意义不大,建议使用会议主题(subject)作为来电提示信息。

    代码示例:
    case TSDK_E_CONF_EVT_CONF_INCOMING_IND:        
    {            
        if (!self.selfJoinNumber) 
        {                
             self.selfJoinNumber = self.sipAccount;            
        }                        
        DDLogInfo(@"TSDK_E_CONF_EVT_CONF_INCOMING_IND");            
        int callID = notify.param2;           
        _confHandle = notify.param1;            
        TSDK_S_CONF_INCOMING_INFO *inComingInfo = (TSDK_S_CONF_INCOMING_INFO *)notify.data;                        
        CallInfo *tsdkCallInfo = [[CallInfo alloc]init];            
        tsdkCallInfo.stateInfo.callId = callID;            
        BOOL is_video_conf = NO;            
        if (inComingInfo->conf_media_type == TSDK_E_CONF_MEDIA_VIDEO || inComingInfo->conf_media_type == TSDK_E_CONF_MEDIA_VIDEO_DATA) 
        {                
            is_video_conf = YES;            
        }            
        tsdkCallInfo.stateInfo.callType = is_video_conf?CALL_VIDEO:CALL_AUDIO;            
        tsdkCallInfo.stateInfo.callNum = [NSString stringWithUTF8String:inComingInfo->number];                        
        [[NSNotificationCenter defaultCenter] postNotificationName:EC_COMING_CONF_NOTIFY object:nil                                                                 userInfo:@{TUP_CONF_INCOMING_KEY : tsdkCallInfo}];        
    }            
    break;
     
  2. 被邀与会者侧接受入会邀请则调用tsdk_accept_conference()接听会议来电呼叫,拒绝入会邀请则调用tsdk_reject_conference()。
    代码示例:
    - (BOOL)acceptConfCallIsJoinVideoConf:(BOOL)isJoinVideoConf
    {    
        BOOL result = tsdk_accept_conference(_confHandle, isJoinVideoConf);    
        DDLogInfo(@"tsdk_accept_conference = %d, _confHandle is :%d",result,_confHandle);    
        return result == TSDK_SUCCESS ? YES : NO;
    }
     
  3. SDK在收到服务器返回的加入会议响应后,向UI上报加入会议结果通知TSDK_E_CONF_EVT_JOIN_CONF_RESULT,对应的结果数据结构为TSDK_S_JOIN_CONF_IND_INFO,并返回conf handle,后续会控时使用,此时, UI可跳转至会议界面。
    代码示例:
    case TSDK_E_CONF_EVT_JOIN_CONF_RESULT:        
    {         
        DDLogInfo(@"TSDK_E_CONF_EVT_JOIN_CONF_RESULT");            
        BOOL result = notify.param2 == TSDK_SUCCESS;            
        if (!result) 
        {                
            DDLogError(@"TSDK_E_CONF_EVT_JOIN_CONF_RESULT,error:%@",[NSString stringWithUTF8String:(TSDK_CHAR *)notify.data]);                
            return;            
        }                        
        _confHandle = notify.param1;            
        TSDK_S_JOIN_CONF_IND_INFO *confInfo = (TSDK_S_JOIN_CONF_IND_INFO *)notify.data;            
        _currentCallId = confInfo->call_id;                        
        dispatch_async(dispatch_get_main_queue(), ^{                
            // go conference                               
            [self goConferenceRunView:nil];                
            [self respondsECConferenceDelegateWithType:CONF_E_CONNECT result:nil];                
            [[NSNotificationCenter defaultCenter] postNotificationName:TUP_CALL_REMOVE_CALL_VIEW_NOTIFY object:nil];            
        });        
    }            
    break;
     
  4. SDK收到会议成员列表刷新通知,向UI上报会议成员列表刷新事件TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE,UI刷新会议成员列表和会议信息。
    代码示例:
    case TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE:        
    {            
        DDLogInfo(@"TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE");                        
        [self handleAttendeeUpdateNotify:notify];        
    }           
    break;
     

注意事项

无。

匿名加入会议

描述

用户在未注册EC帐号时,通过匿名方式加入一个会议。

会议已经创建,且用户通过第三方方式获取到会议ID和密码。

业务流程

图4 匿名加入会议流程 
  1. UI调用tsdk_join_anonymous_conference()接口,匿名加入会议。
    说明: 

    参数TSDK_S_CONF_ANONYMOUS_JOIN_PARAM中的服务器地址和端口,指会议服务器的地址和端口。

    代码示例:
    - (BOOL)joinConferenceWithDisPlayName:(NSString *)disPlayName ConfId:(NSString *)confID PassWord:(NSString *)passWord ServerAdd:(NSString *)serverAdd ServerPort:(int)serverPort
    {    
        TSDK_S_CONF_ANONYMOUS_JOIN_PARAM anonymousParam;    
        memset(&anonymousParam, 0, sizeof(TSDK_S_CONF_ANONYMOUS_JOIN_PARAM));        
        strcpy(anonymousParam.display_name, [disPlayName UTF8String]);    
        strcpy(anonymousParam.conf_id, [confID UTF8String]);    
        strcpy(anonymousParam.conf_password, [passWord UTF8String]);    
        strcpy(anonymousParam.server_addr, [serverAdd UTF8String]);    
        anonymousParam.server_port = serverPort;        
        TSDK_RESULT joinConfResult = tsdk_join_conference_by_anonymous(&anonymousParam);        
        return joinConfResult == TSDK_SUCCESS;
    }
     
  2. SDK通过会议ID和密码向会议服务器完成鉴权,获取临时帐号,上报临时帐号获取结果事件TSDK_E_LOGIN_EVT_GET_TEMP_USER_RESULT。
    说明: 

    若此次事件通知返回失败,应用程序界面应提示用户。

  3. SDK自动完成临时帐号注册,并完成加入会议处理,向UI上报加入会议结果事件TSDK_E_CONF_EVT_JOIN_CONF_RESULT。后续过程与普通入会流程相同。
    说明: 

    匿名会议过程中,无论用户采用主席密码入会或是普通与会者密码入会,均只有设置自己闭音的会控能力,其他会控能力暂不支持。

    代码示例:
    case TSDK_E_CONF_EVT_JOIN_CONF_RESULT:        
    {            
        DDLogInfo(@"TSDK_E_CONF_EVT_JOIN_CONF_RESULT");            
        BOOL result = notify.param2 == TSDK_SUCCESS;            
        if (!result) 
        {                
            DDLogError(@"TSDK_E_CONF_EVT_JOIN_CONF_RESULT,error:%@",
            [NSString stringWithUTF8String:(TSDK_CHAR *)notify.data]);                
            return;           
         }                       
        _confHandle = notify.param1;           
        TSDK_S_JOIN_CONF_IND_INFO *confInfo = (TSDK_S_JOIN_CONF_IND_INFO *)notify.data;            
        _currentCallId = confInfo->call_id;                        
        dispatch_async(dispatch_get_main_queue(), ^{                
            // go conference               
            DDLogInfo(@"goConferenceRunView");                
            [self respondsECConferenceDelegateWithType:CONF_E_CONNECT result:nil];                
            [[NSNotificationCenter defaultCenter] postNotificationName:TUP_CALL_REMOVE_CALL_VIEW_NOTIFY object:nil];            
        });       
    }            
    break;
     

注意事项

无。