項(xiàng)目需要集成環(huán)信客服系統(tǒng)救湖,這兩天的摸爬滾打和客服溝通后整理一篇文章趟紊,以作備份
環(huán)信的客服真的真的真的很贊
撰稿時(shí)間:2017.03.07晚
相關(guān)文檔:
環(huán)信開(kāi)發(fā)文檔
移動(dòng)客服 iOS SDK 集成
移動(dòng)客服 iOS SDK API
移動(dòng)客服:商城”demo源碼和EaseUI源碼(iOS)
移動(dòng)客服 Android SDK 集成
移動(dòng)客服 Android SDK API
移動(dòng)客服:商城”demo源碼和EaseUI源碼(Android)
后臺(tái):
移動(dòng)客服后臺(tái)
環(huán)信管理后臺(tái)
詳細(xì)步驟如下:
SDK方面
- 先把 移動(dòng)客服:商城”demo源碼和EaseUI源碼(iOS) 下載下來(lái)悠轩,該SDK基于IM SDK 3.x芬失,如同時(shí)使用環(huán)信IM功能(非音視頻)袍啡,需使用此文檔中的初始化乞娄、登錄剃斧、登出操作轨香,不需要添加IM的SDK,其IMSDK-API正常使用幼东。
- 打開(kāi)下載好的demo臂容,架構(gòu)如下圖
將紅色框框里面的兩個(gè)文件夾,在Finder中復(fù)制到自己的項(xiàng)目的適當(dāng)路徑中(這個(gè)地方有個(gè)坑根蟹,稍后下午詳細(xì)說(shuō)明)脓杉,然后拖拽到項(xiàng)目時(shí)選擇 Create groups。 - Build Phases ---> Link Binary With Libraries 中添加依賴庫(kù)
AudioToolbox.framework
AVFoundation.framework
libc++.dylib
libz.dylib
libstdc++.6.0.9.dylib
libsqlite3.dylib
// Xcode 7 及以上版本 . dylib 為 .tbd
如下圖:
- Build Settings ---> Linking ---> Other Linker Flags 中增加 -ObjC娜亿。
-
SDK 不支持 bitcode丽已,在 Build Settings ---> Build Options ---> Enable Bitcode 中設(shè)置 NO。
-
在工程info.plist文件中 增加隱私權(quán)限
此處相關(guān)的權(quán)限:
Privacy - Photo Library Usage Description 需要訪問(wèn)您的相冊(cè)
Privacy - Microphone Usage Description 需要訪問(wèn)您的麥克風(fēng)
Privacy - Camera Usage Description 需要訪問(wèn)您的攝像機(jī)
詳細(xì)的權(quán)限設(shè)置沛婴,請(qǐng) 點(diǎn)我點(diǎn)我。
- 在 .pch 中 或者 全局的 .h 中添加如下代碼:
#ifdef __OBJC__
#import "helpdesk_sdk.h"
#import "HelpDeskUI.h"
#endif
如果項(xiàng)目中沒(méi)有 .pch督赤,如下步驟創(chuàng)建:
a. command + N ---> PCH File ---> Next
b. 可以修改名字 ---> Create
c. 如下圖配置嘁灯,搜索 prefix 即可
創(chuàng)建APP關(guān)聯(lián)
上面的步驟依據(jù)文檔 可以輕松完成,但是APP相關(guān)關(guān)聯(lián)躲舌,就比較坑了丑婿,如果沒(méi)有集成過(guò)環(huán)信聊天的經(jīng)歷的話很容易碼入誤區(qū),下面請(qǐng)緊跟隨筆者步驟:
- 需要申請(qǐng)兩個(gè)賬號(hào):移動(dòng)客服后臺(tái)没卸、環(huán)信管理后臺(tái)羹奉,如果已經(jīng)有了請(qǐng)下一步。
- 先在 環(huán)信管理后臺(tái) 創(chuàng)建應(yīng)用
點(diǎn)擊應(yīng)用顯示應(yīng)用的信息(** AppKey约计、Client ID诀拭、Client Secret** 這幾個(gè)要記著)
- 在 環(huán)信管理后臺(tái) 注冊(cè)IM用戶(名稱要記著)
- 移至 環(huán)信管理后臺(tái) 創(chuàng)建APP關(guān)聯(lián)( 官方文檔,官方文檔介紹有些不全面煤蚌,而且有點(diǎn)不全面 )
在后臺(tái)右上角選擇 管理員模式 ---> 渠道管理 ---> 手機(jī)APP ---> 添加APP關(guān)聯(lián) ---> 去關(guān)聯(lián)IM賬號(hào)
-
輸入關(guān)聯(lián)的應(yīng)用的信息耕挨,下圖方框中為所關(guān)聯(lián)應(yīng)用創(chuàng)建的IM用戶
輸入完畢细卧,保存即可如下圖
- 記下 tenantId 租戶ID,下文用到:設(shè)置 ---> 企業(yè)信息
- 上面步驟完成后筒占,官方文檔中沒(méi)有提及的一步: 設(shè)置--->會(huì)話分配規(guī)則
至此APP關(guān)聯(lián)結(jié)束贪庙,可以切回 客服模式
代碼部分
- 入口類(lèi)中 didFinishLaunchingWithOptions,初始化環(huán)信客服
HOptions *option = [[HOptions alloc] init];
option.appkey = @"***";
option.tenantId = @"***"; // 上文提到的 設(shè)置 ---> 企業(yè)信息
//推送證書(shū)名字
#if DEBUG
option.apnsCertName = @"開(kāi)發(fā)環(huán)境推送證書(shū)名稱";
#else
option.apnsCertName = @"正式環(huán)境推送證書(shū)名稱";
#endif
//Kefu SDK 初始化,初始化失敗后將不能使用 SDK
HError *initError = [[HChatClient sharedClient] initializeSDKWithOptions:option];
if (initError) { // 初始化錯(cuò)誤
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" message:@"客服系統(tǒng)初始化錯(cuò)誤" delegate:nil cancelButtonTitle:@"知道了" otherButtonTitles:nil, nil];
[alertView show];
}
[[HChatClient sharedClient] addDelegate:self delegateQueue:nil];
- 入口類(lèi)遵循
HChatClientDelegate
- 入口類(lèi)實(shí)現(xiàn)協(xié)議
// 環(huán)信客服連接服務(wù)器的狀態(tài)變化時(shí)會(huì)接收到該回調(diào), 有以下幾種情況, 會(huì)引起該方法的調(diào)用: 1. 登錄成功后, 手機(jī)無(wú)法上網(wǎng)時(shí), 會(huì)調(diào)用該回調(diào) 2. 登錄成功后, 網(wǎng)絡(luò)狀態(tài)變化時(shí), 會(huì)調(diào)用該回調(diào)
// @param aConnectionState 當(dāng)前狀態(tài)
- (void)connectionStateDidChange:(HConnectionState)aConnectionState {
NSLog(@"\n-----> %@", aConnectionState == HConnectionConnected ? @"已連接" : @"未連接");
}
- 實(shí)現(xiàn)下面方法
- (void)applicationWillEnterForeground:(UIApplication *)application {
[[HChatClient sharedClient] applicationWillEnterForeground:self];
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[HChatClient sharedClient] applicationDidEnterBackground:self];
}
- 快速集成可以如下操作:
找到下載的demo中如下 .h 和 .m (如下圖)復(fù)制到自己的項(xiàng)目中翰苫,并拖拽到項(xiàng)目中:
由于 HDChatViewController 繼承自 HDMessageViewController(在 HelpDeskUI 中)止邮,可以直接套用demo里面的相關(guān)邏輯,移入后編譯 修改 由于缺乏相關(guān)引用文件報(bào)錯(cuò)革骨,即可作為聊天頁(yè)面农尖。 - 在監(jiān)聽(tīng)進(jìn)入聊天頁(yè)面的func析恋,可以進(jìn)行如下操作
注冊(cè):經(jīng)驗(yàn)證這里注冊(cè)的賬號(hào)良哲,會(huì)出現(xiàn)在 環(huán)信管理后臺(tái) 該應(yīng)用的 IM用戶列表中
HChatClient *client = [HChatClient sharedClient];
// registerWithUsername:password: 注冊(cè)用戶,同步方法助隧,會(huì)阻塞當(dāng)前線程. 不推薦使用筑凫,建議后臺(tái)通過(guò)REST注冊(cè),快速
// 這里 注冊(cè)的用戶 相當(dāng)于使用app聯(lián)系客服的用戶并村,可以依照一定的規(guī)則來(lái)創(chuàng)建巍实,規(guī)則如下
HError *error = [[HChatClient sharedClient] registerWithUsername:@"fengfengAppUser" password:@"123456"];
if (error && error.code != HErrorUserAlreadyExist) {
// HErrorNetworkUnavailable 網(wǎng)絡(luò)不可用
// HErrorUserAlreadyExist 用戶已存在
// HErrorUserAuthenticationFailed 無(wú)開(kāi)放注冊(cè)權(quán)限(后臺(tái)管理界面設(shè)置[開(kāi)放|授權(quán)])
// HErrorUserIllegalArgument 用戶名非法
NSLog(@"注冊(cè)失敗;error code:%d,error description :%@",error.code,error.errorDescription);
}
// 由于HChatClient有一個(gè)isLoggedInBefore(BOOL),登錄操作前可以先做個(gè)判斷
if (client.isLoggedInBefore != YES) {
//這里登錄的賬號(hào)是上面注冊(cè)的賬號(hào)哩牍,或者是從服務(wù)端獲取的賬號(hào)棚潦,也即是使用app聯(lián)系客服的用戶的賬號(hào)
HError *error2 = [client loginWithUsername:@"fengfengAppUser" password:@"123456"];
if (!error2) { //登錄成功
// 這里 的 @"fengfeng01"參數(shù),一定是上文 中 在 環(huán)信客服后臺(tái) 關(guān)聯(lián)的IM賬號(hào)
HDChatViewController *chatVC = [[HDChatViewController alloc] initWithConversationChatter:@"fengfeng01"];
[weakSelf.navigationController pushViewController:chatVC animated:YES];
} else { //登錄失敗
[weakSelf showTextHud:error.errorDescription];
return;
}
} else { //已經(jīng)成功登錄
// 這里 的 @"fengfeng01"參數(shù)膝昆,一定是上文 中 在 環(huán)信客服后臺(tái) 關(guān)聯(lián)的IM賬號(hào)
HDChatViewController *chatVC = [[HDChatViewController alloc] initWithConversationChatter:@"fengfeng01"];
[weakSelf.navigationController pushViewController:chatVC animated:YES];
}
這里比較重要 丸边,單獨(dú)再次列出來(lái):
// 這里 的 @"fengfeng01"參數(shù),一定是上文 中 在 環(huán)信客服后臺(tái) 關(guān)聯(lián)的IM賬號(hào)荚孵,也就是 關(guān)聯(lián)的什么賬號(hào)妹窖,這里參數(shù)傳入什么
HDChatViewController *chatVC = [[HDChatViewController alloc] initWithConversationChatter:@"fengfeng01"];
消息發(fā)送完成回調(diào)block
當(dāng)如上正確配置后,發(fā)送消息可以在回調(diào)block中看到如下信息
在如下圖 .m 中:
在 HDMessageViewController.m 中收叶,如下func中斷點(diǎn):
控制臺(tái)如下:
關(guān)鍵字段在方框中:
_conversationId 骄呼、_to :指的是在 環(huán)信客服后臺(tái) 關(guān)聯(lián)APP 的時(shí)候綁定的 IM賬號(hào)。
_from :指的是 上文 注冊(cè) 或 登錄 的賬號(hào)判没。
error:當(dāng)聊天異常的時(shí)候蜓萄,查看 error 中的信息是個(gè)不錯(cuò)的選擇。
至此:環(huán)信客服聊天系統(tǒng) 簡(jiǎn)單的集成完畢澄峰,如果一切順利的話可以在環(huán)信客服后臺(tái)收到如下信息:如下圖
環(huán)信客服后臺(tái) ---> 管理員模式 ---> 會(huì)話
集成過(guò)程遇到的問(wèn)題:(集成過(guò)程遇到新的問(wèn)題隨時(shí)更新)
-
導(dǎo)入SDK后重復(fù)導(dǎo)入編譯報(bào)錯(cuò):如圖
解決辦法:
由于環(huán)信客服SDK集成了一些常用的第三方的庫(kù)嫉沽,如果項(xiàng)目本身也存在這些第三方的庫(kù),就 會(huì)引起沖突摊阀,刪除掉耻蛇,然后把報(bào)錯(cuò)的地方修改成正常的調(diào)用即可
- 和客服溝通后對(duì)一些疑問(wèn)的整理:
Q:在APP中集成了客服系統(tǒng)后 客戶 和 客服 之間的關(guān)系如何協(xié)調(diào)踪蹬?
A:IM服務(wù)號(hào)就是 IM用戶,你新注冊(cè)一個(gè)IM用戶 然后用于綁定IM服務(wù)號(hào)的臣咖,然后客戶端登錄的用戶 都與這個(gè)綁定的IM服務(wù)號(hào)聊天跃捣,客服系統(tǒng)將與這個(gè)IM服務(wù)號(hào)聊天的會(huì)話分配給客服
Q:注冊(cè)的IM用戶 相當(dāng)于 客服和用戶之前的 樞紐么
M:可以這么理解
Q:為什么 這個(gè)賬號(hào)可以在服務(wù)端注冊(cè),也可以在后臺(tái)管理系統(tǒng)手動(dòng)添加啊
M:其實(shí)都是一個(gè)接口操作的夺蛇,服務(wù)器端的rest接口
Q:是不是 服務(wù)端返回的用于登陸的IM賬號(hào)不同 APP用戶關(guān)聯(lián)的客服也不同了吶疚漆?
M:未必,移動(dòng)客服那邊綁定一個(gè)IM服務(wù)號(hào)就夠用了刁赦,客戶端登錄的其他IM用戶(服務(wù)端返回的或者注冊(cè)的)都給這個(gè)移動(dòng)客服綁定的IM服務(wù)號(hào)發(fā)消息娶聘,環(huán)信的客服系統(tǒng)就能收到客戶端發(fā)送過(guò)來(lái)的消息了
不定期更新 不合適的地方 還請(qǐng)指點(diǎn)~ 感激不盡