- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [ECDevice sharedInstance].delegate = [DeviceDelegateHelper sharedInstance]; return YES; }
代理類(lèi)示例:
DeviceDelegateHelper.h文件
//代理類(lèi).h文件如下 import//創(chuàng)建單例 import "ECDeviceHeaders.h" @interface DeviceDelegateHelper : NSObject /** *@brief 獲取DeviceDelegateHelper單例句柄 */ +(DeviceDelegateHelper*)sharedInstance; //代理類(lèi).m文件中需要實(shí)現(xiàn)ECDeviceDelegate的回調(diào)函數(shù),代碼示例如下: import "DeviceDelegateHelper.h" import "AppDelegate.h" //如需使用IM功能,需實(shí)現(xiàn)ECChatDelegate類(lèi)的回調(diào)函數(shù)。 //如需使用實(shí)時(shí)音視頻功能,需實(shí)現(xiàn)ECVoIPCallDelegate類(lèi)的回調(diào)函數(shù)。 //如需使用音視頻會(huì)議功能,需實(shí)現(xiàn)ECMeetingDelegate類(lèi)的回調(diào)函數(shù)。
DeviceDelegateHelper.m文件
第一步:創(chuàng)建單例方法 +(DeviceDelegateHelper*)sharedInstance { static DeviceDelegateHelper *devicedelegatehelper; static dispatch_once_t devicedelegatehelperonce; dispatch_once(&devicedelegatehelperonce, ^{ devicedelegatehelper = [[DeviceDelegateHelper alloc] init]; }); return devicedelegatehelper; } 第二步:連接云通訊的服務(wù)平臺(tái),實(shí)現(xiàn)ECDelegateBase代理的方法 /** @brief 連接狀態(tài)接口 @discussion 監(jiān)聽(tīng)與服務(wù)器的連接狀態(tài) V5.0版本接口 @param state 連接的狀態(tài) @param error 錯(cuò)誤原因值 */ -(void)onConnectState:(ECConnectState)state failed:(ECError*)error { switch (state) { case State_ConnectSuccess://連接成功 [[NSNotificationCenter defaultCenter] postNotificationName:KNOTIFICATION_onConnected object:[ECError errorWithCode:ECErrorType_NoError]]; break; case State_Connecting://正在連接 [[NSNotificationCenter defaultCenter] postNotificationName:KNOTIFICATION_onConnected object:[ECError errorWithCode:ECErrorType_Connecting]]; break; case State_ConnectFailed://失敗 [[NSNotificationCenter defaultCenter] postNotificationName:KNOTIFICATION_onConnected object:error]; break; default: break; } } 第三步 :各功能回調(diào)函數(shù)實(shí)現(xiàn) 1. 如需使用im功能,需實(shí)現(xiàn)ECChatDelegate類(lèi)的回調(diào)函數(shù)。 /** @brief 客戶(hù)端錄音振幅代理函數(shù) @param amplitude 錄音振幅 */ -(void)onRecordingAmplitude:(double) amplitude; /** @brief 接收即時(shí)消息代理函數(shù) @param message 接收的消息 */ -(void)onReceiveMessage:(ECMessage*)message; /** @brief 離線消息數(shù) @param count 消息數(shù) */ -(void)onOfflineMessageCount:(NSUInteger)count; /** @brief 需要獲取的消息數(shù) @return 消息數(shù) -1:全部獲取 0:不獲取 */ -(NSInteger)onGetOfflineMessage; /** @brief 接收離線消息代理函數(shù) @param message 接收的消息 */ -(void)onReceiveOfflineMessage:(ECMessage*)message; /** @brief 離線消息接收是否完成 @param isCompletion YES:拉取完成 NO:拉取未完成(拉取消息失敗) */ -(void)onReceiveOfflineCompletion:(BOOL)isCompletion; /** @brief 接收群組相關(guān)消息 @discussion 參數(shù)要根據(jù)消息的類(lèi)型,轉(zhuǎn)成相關(guān)的消息類(lèi); 解散群組、收到邀請(qǐng)、申請(qǐng)加入、退出群組、有人加入、移除成員等消息 @param groupMsg 群組消息 */ -(void)onReceiveGroupNoticeMessage:(ECGroupNoticeMessage *)groupMsg; 2.如需使用音視頻通話功能,需實(shí)現(xiàn)ECVoIPCallDelegate類(lèi)的回調(diào)函數(shù)。 /** @brief 有呼叫進(jìn)入 @param callid 會(huì)話id @param caller 呼叫人 @param callerphone 被叫人手機(jī)號(hào) @param callername 被叫人姓名 @param calltype 呼叫類(lèi)型 */ - (NSString*)onIncomingCallReceived:(NSString*)callid withCallerAccount:(NSString *)caller withCallerPhone:(NSString *)callerphone withCallerName:(NSString *)callername withCallType:(CallType)calltype; /** @brief 呼叫事件 @param voipCall 電話實(shí)體類(lèi)的對(duì)象 */ - (void)onCallEvents:(VoIPCall*)voipCall; /** @brief 收到dtmf @param callid 會(huì)話id @param dtmf 鍵值 */ - (void)onReceiveFrom:(NSString*)callid DTMF:(NSString*)dtmf; /** @brief 視頻分辨率發(fā)生改變 @param callid 會(huì)話id @param voip 通訊號(hào) @param isConference NO 不是, YES 是 @param width 寬度 @param height 高度 */ - (void)onCallVideoRatioChanged:(NSString *)callid andVoIP:(NSString *)voip andIsConfrence:(BOOL)isConference andWidth:(NSInteger)width andHeight:(NSInteger)height; /** @brief 收到對(duì)方切換音視頻的請(qǐng)求 @param callid 會(huì)話id @param requestType 請(qǐng)求音視頻類(lèi)型 視頻:需要響應(yīng) 音頻:請(qǐng)求刪除視頻(不需要響應(yīng),雙方自動(dòng)去除視頻) */ - (void)onSwitchCallMediaTypeRequest:(NSString *)callid withMediaType:(CallType)requestType; /** @brief 收到對(duì)方應(yīng)答切換音視頻請(qǐng)求 @param callid 會(huì)話id @param responseType 回復(fù)音視頻類(lèi)型 */ - (void)onSwitchCallMediaTypeResponse:(NSString *)callid withMediaType:(CallType)responseType; 3.如需使用音視頻會(huì)議功能,需實(shí)現(xiàn)ECMeetingDelegate類(lèi)的回調(diào)函數(shù)。 /** @brief 實(shí)時(shí)對(duì)講通知消息 @param msg 實(shí)時(shí)對(duì)講消息 */ -(void)onReceiveInterphoneMeetingMsg:(ECInterphoneMeetingMsg *)msg; /** @brief 語(yǔ)音群聊通知消息 @param msg 語(yǔ)音群聊消息 */ -(void)onReceiveMultiVoiceMeetingMsg:(ECMultiVoiceMeetingMsg *)msg; //多路視頻通知消息 -(void)onReceiveMultiVideoMeetingMsg:(ECMultiVideoMeetingMsg *)msg; //有會(huì)議呼叫邀請(qǐng)。邀請(qǐng)用戶(hù)時(shí),呼叫回調(diào)接口,與點(diǎn)對(duì)點(diǎn)外呼接口不一致,只有會(huì)議邀請(qǐng)才會(huì)回調(diào)這個(gè)接口,其他情況均使用點(diǎn)對(duì)點(diǎn)呼叫回調(diào)接口 -(NSString*)onMeetingCallReceived:(NSString*)callid withCallType:(CallType)calltype withMeetingData:(NSDictionary*)meetingData;
//初始化登錄信息類(lèi)ECLoginInfo實(shí)例(ECLoginInfo已經(jīng)包含在SDK包里,不要用戶(hù)創(chuàng)建) //默認(rèn)模式:對(duì)AppKey、AppToken和userName鑒權(quán) ECLoginInfo * loginInfo = [[ECLoginInfo alloc] init]; loginInfo.username = @"自定義賬號(hào)";//用戶(hù)登錄app的用戶(hù)id即可。 loginInfo.appKey = @"appid"; loginInfo.appToken = @"apptoken"; loginInfo.authType = LoginAuthType_NormalAuth;//默認(rèn)方式登錄 loginInfo.mode = LoginMode_InputPassword; [[ECDevice sharedInstance] login:loginInfo completion:^(ECError *error){ if (error.errorCode == ECErrorType_NoError) { //登錄成功 }else{ //登錄失敗 } }]; //密碼模式:對(duì)AppKey、userName和userPassword鑒權(quán) ECLoginInfo * loginInfo = [[ECLoginInfo alloc] init]; loginInfo.username = @"通訊賬號(hào)"; loginInfo.appKey = @"appid"; loginInfo. userPassword= @"通訊密碼"; loginInfo.authType = LoginAuthType_PasswordAuth;//密碼方式登錄 loginInfo.mode = LoginMode_InputPassword; [[ECDevice sharedInstance] login:loginInfo completion:^(ECError *error){ if (error.errorCode == ECErrorType_NoError) { //登錄成功 }else{ //登錄失敗 } }]; // 鑒權(quán)模式:MD5 Token認(rèn)證方式,服務(wù)器認(rèn)證appKey、username、timestamp、MD5Token字段 * (該鑒權(quán)方式是最安全的方式,用戶(hù)在自己的服務(wù)器根據(jù)規(guī)則生成MD5,在不暴露apptoken的情況下進(jìn)行鑒權(quán),且生成的MD5 Token在平臺(tái)上有失效時(shí)間) ECLoginInfo * loginInfo = [[ECLoginInfo alloc] init]; loginInfo.username = @"自定義賬號(hào)"; loginInfo.appKey = @"appid"; loginInfo.timestamp = "時(shí)間戳";//yyyyMMddHHmmss loginInfo.MD5Token = "MD5串";//MD5(appid+username+timestamp+apptoken) loginInfo.authType = LoginAuthType_MD5TokenAuth;// 鑒權(quán)模式方式登錄 loginInfo.mode = LoginMode_InputPassword; [[ECDevice sharedInstance] login:loginInfo completion:^(ECError *error){ if (error.errorCode == ECErrorType_NoError) { //登錄成功 }else{ //登錄失敗 } }];
登錄環(huán)境:
登錄環(huán)境分為:生產(chǎn)(正式)環(huán)境和沙盒環(huán)境。主要是推送證書(shū)不一樣。如果你是在開(kāi)發(fā)環(huán)境注冊(cè)的推送,相對(duì)應(yīng)就需要選擇在沙盒環(huán)境上登錄;如果你是生產(chǎn)環(huán)境注冊(cè)的推送,相對(duì)應(yīng)就需要選擇在生產(chǎn)(正式)環(huán)境上登錄。
注:提供此方法僅用于客戶(hù)測(cè)試IOS離線推送功能,在測(cè)試完成后請(qǐng)及時(shí)去掉,防止環(huán)境不同導(dǎo)致的通信障礙。
功能:切換服務(wù)器環(huán)境 調(diào)用登錄接口前,調(diào)用該接口切換服務(wù)器環(huán)境;不調(diào)用該函數(shù),默認(rèn)使用的是生產(chǎn)環(huán)境; 參數(shù):isSandBox 是否沙盒環(huán)境 是否成功 0:成功 非0失敗 -(NSInteger)SwitchServerEvn:(BOOL)isSandBox;