更新时间:2019-11-20
描述
用户通过会议列表一键入会的方式加入会议。
前提条件
业务流程
在加入会议时,入会参数(conf_join_param),是否视频接入会议(is_video_join)为必选;
-(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; }
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;
case TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE: { DDLogInfo(@"TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE"); [self handleAttendeeUpdateNotify:notify]; } break;
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;
-(void)joinDataConference { TSDK_RESULT result = tsdk_join_data_conference(_confHandle); DDLogInfo(@"tsdk_join_data_conference ret: %d", result); }
在加入数据会议后,会向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;
注意事项
无。
描述
用户由第三方途径获取会议信息,通过拨打统一会议接入号,使用IVR导航的方式加入会议。
前提条件
业务流程
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);
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]; }
- (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; }
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;
case TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE: { DDLogInfo(@"TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE"); [self handleAttendeeUpdateNotify:notify]; } break;
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;
-(void)joinDataConference { TSDK_RESULT result = tsdk_join_data_conference(_confHandle); DDLogInfo(@"tsdk_join_data_conference ret: %d", result); }
在加入数据会议后,会向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;
注意事项
无。
描述
会议主席邀请新的与会者加入会议。
与会者通过主席身份加入会议,或已申请获取为主席。
业务流程
在会议来电通知携带的信息(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;
- (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; }
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;
case TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE: { DDLogInfo(@"TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE"); [self handleAttendeeUpdateNotify:notify]; } break;
注意事项
无。
描述
用户在未注册EC帐号时,通过匿名方式加入一个会议。
会议已经创建,且用户通过第三方方式获取到会议ID和密码。
业务流程
参数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; }
若此次事件通知返回失败,应用程序界面应提示用户。
匿名会议过程中,无论用户采用主席密码入会或是普通与会者密码入会,均只有设置自己闭音的会控能力,其他会控能力暂不支持。
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;
注意事项
无。