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

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

入门使用

会议管理

更新时间:2019-11-20

创建预约会议

描述

用户创建预约会议。

前提是鉴权登录成功和会议环境参数已设置。

业务流程

图1 预约会议流程 
  1. UI调用tsdk_book_conference()预约会议,会议参数结构为TSDK_S_BOOK_CONF_INFO,SDK发送预约会议请求至会议服务器。
    说明: 
    1. 在预约会议时,会议开始时间(start_time)、会议方数(size)、会议类型(conf_type)、媒体类型(conf_media_type)和与会者信息(attendee_num&attendee_list)必选,其他参数可选;
    2. 按具体需求填写会议方数,当实际与会者数目多于设置的方数时,服务会自动扩大会议方数,当填写方数小于3时,服务器默认会议方数为3。
    3. 预约会议,会议类型应选TSDK_E_CONF_RESERVED。
    4. 服务器默认时间为UTC时间,在预约时需将预约时间转换为UTC时间。
    代码示例:
    -(BOOL)tsdkConfctrlBookConf:(NSArray *)attendeeArray mediaType:(EC_CONF_MEDIATYPE)mediaType startTime:(NSDate *)startTime confLen:(int)confLen subject:(NSString *)subject
    {    
        TSDK_S_BOOK_CONF_INFO *bookConfInfoUportal = (TSDK_S_BOOK_CONF_INFO *)malloc(sizeof(TSDK_S_BOOK_CONF_INFO));    
        memset_s(bookConfInfoUportal, sizeof(TSDK_S_BOOK_CONF_INFO), 0, sizeof(TSDK_S_BOOK_CONF_INFO));    
        if (subject.length > 0 && subject != nil) 
        {        
            strcpy(bookConfInfoUportal->subject, [subject UTF8String]);    
        }    
        bookConfInfoUportal->conf_type = TSDK_E_CONF_INSTANT;    
        if (startTime != nil)    
        {         
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];        
            [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];        
            NSString *startTimeStr = [dateFormatter stringFromDate:startTime];        
            NSString *utcStr = [self getUTCFormateLocalDate:startTimeStr];        
            DDLogInfo(@"start time : %@, utc time: %@",startTimeStr,utcStr);        
            strcpy(bookConfInfoUportal->start_time, [utcStr UTF8String]);                
            bookConfInfoUportal->duration = confLen;                
            bookConfInfoUportal->conf_type = TSDK_E_CONF_RESERVED;    
        }   
        if (attendeeArray.count == 0)    
        {        
            bookConfInfoUportal->size = 5;        
            bookConfInfoUportal->attendee_num = 0;        
            bookConfInfoUportal->attendee_list = NULL;    
        }else{        
            bookConfInfoUportal->size = (TSDK_UINT32)attendeeArray.count * 2;        
            bookConfInfoUportal->attendee_num = (TSDK_UINT32)attendeeArray.count;        
            bookConfInfoUportal->attendee_list = [self returnAttendeeWithArray:attendeeArray];    
        }        
        bookConfInfoUportal->conf_media_type = (TSDK_E_CONF_MEDIA_TYPE)mediaType;    
        bookConfInfoUportal->is_hd_conf = TSDK_FALSE;    
        bookConfInfoUportal->is_multi_stream_conf = TSDK_FALSE;    
        bookConfInfoUportal->is_auto_record = TSDK_FALSE;    
        bookConfInfoUportal->is_auto_prolong = TSDK_TRUE;    
        bookConfInfoUportal->is_auto_mute = TSDK_FALSE;    
        bookConfInfoUportal->welcome_prompt = TSDK_E_CONF_WARNING_DEFAULT;    
        bookConfInfoUportal->enter_prompt = TSDK_E_CONF_WARNING_DEFAULT;    
        bookConfInfoUportal->leave_prompt = TSDK_E_CONF_WARNING_DEFAULT;    
        bookConfInfoUportal->reminder = TSDK_E_CONF_REMINDER_NONE;    
        bookConfInfoUportal->language = TSDK_E_CONF_LANGUAGE_ZH_CN;        
        TSDK_RESULT ret = tsdk_book_conference(bookConfInfoUportal);    
        DDLogInfo(@"tsdk_book_conference result : %d",ret);    
        free(bookConfInfoUportal);    
        return ret == TSDK_SUCCESS ? YES : NO;
    }
     
  2. SDK在收到服务器返回的会议预约结果响应后,向UI上报预约会议结果通知TSDK_E_CONF_EVT_BOOK_CONF_RESULT,对应的结果数据结构为TSDK_S_CONF_BASE_INFO。
    说明: 

    如果会议成功预约,其他用户可以通过“查询会议列表”或其他第三方方式获取该会议的信息:

    代码示例:
    case TSDK_E_CONF_EVT_BOOK_CONF_RESULT:        
    {            
        DDLogInfo(@"TSDK_E_CONF_EVT_BOOK_CONF_RESULT");            
        BOOL result = notify.param1 == TSDK_SUCCESS;            
        if (!result) 
        {                
            DDLogError(@"TSDK_E_CONF_EVT_BOOK_CONF_RESULT,error:%@",[NSString stringWithUTF8String:(TSDK_CHAR *)notify.data]);                
            return;            
        }                        
        TSDK_S_CONF_BASE_INFO *confListInfo = (TSDK_S_CONF_BASE_INFO *)notify.data;
    }
     

注意事项

无。

创建即时会议

描述

用户创建立即会议。

说明: 

立即会议创建成功后,用户的SIP号码自动入会,用户作为会议主席召集其他与会者加入会议。

前提条件

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

业务流程

图2 创建立即会议流程

  1. UI调用tsdk_book_conference()创建立即会议,会议参数结构为TSDK_S_BOOK_CONF_INFO;SDK发送创建会议请求至会议服务器。
    说明: 

    在创建即时会议时,会议方数(size)、会议类型(conf_type),媒体类型(conf_media_type)和与会者信息(attendee_num&attendee_list)必选,其他参数可选。

    1. 预约会议,会议类型应选TSDK_E_CONF_INSTANT。
    2. 会议开始时间不用指定。
    3. 服务器默认时间为UTC时间,在预约时需将预约时间转换为UTC时间。
    代码示例:
    -(BOOL)tsdkConfctrlBookConf:(NSArray *)attendeeArray mediaType:(EC_CONF_MEDIATYPE)mediaType startTime:(NSDate *)startTime confLen:(int)confLen subject:(NSString *)subject
    {    
        TSDK_S_BOOK_CONF_INFO *bookConfInfoUportal = (TSDK_S_BOOK_CONF_INFO *)malloc(sizeof(TSDK_S_BOOK_CONF_INFO));    
        memset_s(bookConfInfoUportal, sizeof(TSDK_S_BOOK_CONF_INFO), 0, sizeof(TSDK_S_BOOK_CONF_INFO));    
        if (subject.length > 0 && subject != nil) 
        {        
            strcpy(bookConfInfoUportal->subject, [subject UTF8String]);    
        }    
        bookConfInfoUportal->conf_type = TSDK_E_CONF_INSTANT;    
        if (startTime != nil)    
        {         
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];        
            [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];        
            NSString *startTimeStr = [dateFormatter stringFromDate:startTime];        
            NSString *utcStr = [self getUTCFormateLocalDate:startTimeStr];        
            DDLogInfo(@"start time : %@, utc time: %@",startTimeStr,utcStr);        
            strcpy(bookConfInfoUportal->start_time, [utcStr UTF8String]);                
            bookConfInfoUportal->duration = confLen;                
            bookConfInfoUportal->conf_type = TSDK_E_CONF_RESERVED;    
        }   
        if (attendeeArray.count == 0)    
        {        
            bookConfInfoUportal->size = 5;        
            bookConfInfoUportal->attendee_num = 0;        
            bookConfInfoUportal->attendee_list = NULL;    
        }else{        
            bookConfInfoUportal->size = (TSDK_UINT32)attendeeArray.count * 2;        
            bookConfInfoUportal->attendee_num = (TSDK_UINT32)attendeeArray.count;        
            bookConfInfoUportal->attendee_list = [self returnAttendeeWithArray:attendeeArray];    
        }        
        bookConfInfoUportal->conf_media_type = (TSDK_E_CONF_MEDIA_TYPE)mediaType;    
        bookConfInfoUportal->is_hd_conf = TSDK_FALSE;    
        bookConfInfoUportal->is_multi_stream_conf = TSDK_FALSE;    
        bookConfInfoUportal->is_auto_record = TSDK_FALSE;    
        bookConfInfoUportal->is_auto_prolong = TSDK_TRUE;    
        bookConfInfoUportal->is_auto_mute = TSDK_FALSE;    
        bookConfInfoUportal->welcome_prompt = TSDK_E_CONF_WARNING_DEFAULT;    
        bookConfInfoUportal->enter_prompt = TSDK_E_CONF_WARNING_DEFAULT;    
        bookConfInfoUportal->leave_prompt = TSDK_E_CONF_WARNING_DEFAULT;    
        bookConfInfoUportal->reminder = TSDK_E_CONF_REMINDER_NONE;    
        bookConfInfoUportal->language = TSDK_E_CONF_LANGUAGE_ZH_CN;        
        TSDK_RESULT ret = tsdk_book_conference(bookConfInfoUportal);    
        DDLogInfo(@"tsdk_book_conference result : %d",ret);    
        free(bookConfInfoUportal);    
        return ret == TSDK_SUCCESS ? YES : NO;
    }
     
  2. SDK在收到服务器返回的立即会议创建响应后,向UI上报会议创建结果通知TSDK_E_CONF_EVT_BOOK_CONF_RESULT,对应的结果数据结构为TSDK_S_CONF_BASE_INFO,UI应提示创建会议成功。
    代码示例:
    case TSDK_E_CONF_EVT_BOOK_CONF_RESULT:        
    {            
        DDLogInfo(@"TSDK_E_CONF_EVT_BOOK_CONF_RESULT");            
        BOOL result = notify.param1 == TSDK_SUCCESS;            
        if (!result) 
        {                
            DDLogError(@"TSDK_E_CONF_EVT_BOOK_CONF_RESULT,error:%@",[NSString stringWithUTF8String:(TSDK_CHAR *)notify.data]);                
            return;            
        }                        
        TSDK_S_CONF_BASE_INFO *confListInfo = (TSDK_S_CONF_BASE_INFO *)notify.data;
    }
     
  3. 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;
     
  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;
     
  5. 若会议包含数据会议能力,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;
     
  6. 此时UI可选择自动加入或用户选择加入数据会议,调用加入数据会议接口tsdk_join_data_conference(),SDK发送创建会议请求至会议服务器。
    代码示例:
    -(void)joinDataConference
    {    
        TSDK_RESULT result = tsdk_join_data_conference(_confHandle);    
        DDLogInfo(@"tsdk_join_data_conference ret: %d", result);
    }
     
  7. 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. 会议环境参数已设置。

业务流程

图3 查询会议列表流程 
  1. UI调用tsdk_query_conference_list()查询会议列表,查询会议列表的请求信息结构为TSDK_S_QUERY_CONF_LIST_REQ。
    说明: 

    1、会议权限(conf_right)用于指定要查询的会议权限类型,包含查询创建的会议、待参加的会议或创建和待参加的会议,可选填;

    2、请求会议列表页索引(page_index),取值从1开始,建议与应用程序与会议列表的页签对应,必须要有明确值;

    3、会议列表每页的会议个数(page_size),建议与应用程序会议列表个数相同,必须要有明确值。

    4、返回来的时间为UTC时间,UI进行页面呈现之前需要将UTC时间转换为本地时间。

    代码示例:
    -(BOOL)obtainConferenceListWithPageIndex:(int)pageIndex pageSize:(int)pageSize
    {    
        TSDK_S_QUERY_CONF_LIST_REQ conflistInfo;    
        memset(&conflistInfo, 0, sizeof(TSDK_S_QUERY_CONF_LIST_REQ));    
        conflistInfo.conf_right = TSDK_E_CONF_RIGHT_CREATE_JOIN;    
        conflistInfo.is_include_end = TSDK_FALSE;    
        conflistInfo.page_index = pageIndex;    
        conflistInfo.page_size = pageSize;    
        int result = tsdk_query_conference_list(&conflistInfo);    
        DDLogInfo(@"tsdk_query_conference_list result: %d",result);    
        return result == TSDK_SUCCESS ? YES : NO;
    }
     
  2. SDK在收到服务器返回的查询会议列表响应后,向UI上报查询会议列表结果通知TSDK_E_CONF_EVT_QUERY_CONF_LIST_RESULT,对应的结果数据结构为TSDK_S_CONF_LIST_INFO。
    说明: 

    1、查询会议列表只返回会议的概要信息,如需查询会议详情(包括与会者信息),需要“查询会议详情”;

    2、会议的主席密码需要“查询会议详情”获取。

    代码示例:
    case TSDK_E_CONF_EVT_QUERY_CONF_LIST_RESULT:        
    {           
        DDLogInfo(@"TSDK_E_CONF_EVT_QUERY_CONF_LIST_RESULT");            
        BOOL result = notify.param1 == TSDK_SUCCESS;            
        if (!result) 
        {                
            DDLogError(@"TSDK_E_CONF_EVT_QUERY_CONF_LIST_RESULT,error:%@",[NSString stringWithUTF8String:(TSDK_CHAR *)notify.data]);               
            return;            
        }                        
        [self handleGetConfListResult:notify];        
    }            
    break;
     

注意事项

无。

查询会议详情

描述

用户查询指定会议的详细信息。

前提条件

  1. 鉴权登录成功。
  2. 会议环境参数已设置。

业务流程

图4 查询会议详情流程 
  1. UI调用tsdk_query_conference_detail查询会议详情,请求信息结构为TSDK_S_QUERY_CONF_DETAIL_REQ。
    说明: 

    请求消息结构TSDK_S_QUERY_CONF_DETAIL_REQ中,

    • conf_id:需要查询的会议ID,通过查询列表或其他方式获取;
    • page_index:请求与会者列表页索引,取值从1开始,建议与应用程序与会者列表的页签对应;
    • page_size:与会者列表每页的与会者个数,建议与应用程序与会者列表个数相同。
    代码示例:
     
    -(BOOL)obtainConferenceDetailInfoWithConfId:(NSString *)confId Page:(int)pageIndex pageSize:(int)pageSize
    {    
        if (confId.length == 0)    
        {        
            DDLogInfo(@"current confId is nil");        
            return NO;    
        }    
        TSDK_S_QUERY_CONF_DETAIL_REQ confInfo;    
        memset(&confInfo, 0, sizeof(TSDK_S_QUERY_CONF_LIST_REQ));    
        if (confId.length > 0 && confId != nil) 
        {        
            strcpy(confInfo.conf_id, [confId UTF8String]);    
        }    
        confInfo.page_size = pageSize;    
        confInfo.page_index = pageIndex;        
        int getConfInfoRestult = tsdk_query_conference_detail(&confInfo);    
        DDLogInfo(@"tsdk_query_conference_detail result: %d",getConfInfoRestult);    
        return getConfInfoRestult == TSDK_SUCCESS ? YES : NO;
    }
     
  2. SDK在收到服务器返回的查询会议详情响应后,向UI上报查询结果事件TSDK_E_CONF_EVT_QUERY_CONF_DETAIL_RESULT,对应的结果数据结构为TSDK_S_CONF_DETAIL_INFO。
    代码示例:
    case TSDK_E_CONF_EVT_QUERY_CONF_DETAIL_RESULT:        
    {            
        DDLogInfo(@"TSDK_E_CONF_EVT_QUERY_CONF_DETAIL_RESULT");            
        BOOL result = notify.param1 == TSDK_SUCCESS;            
        if (!result) 
        {                
            DDLogError(@"TSDK_E_CONF_EVT_QUERY_CONF_DETAIL_RESULT,error:%@",[NSString stringWithUTF8String:(TSDK_CHAR *)notify.data]);                
            return;            
        }            
        [self handleGetConfInfoResult:notify];        
    }            
    break;
     

注意事项

无。