前幾天集成環(huán)信移動(dòng)客服,遇到了許多問(wèn)題,集成的過(guò)程也是磕磕絆絆,現(xiàn)在總結(jié)出來(lái)記錄一下。步驟大體是這樣:
1.首先到環(huán)信官網(wǎng)下載3.0SDK的demo 網(wǎng)址:http://www.easemob.com/download
(PS:因?yàn)槲耶?dāng)時(shí)下的SDK是最新的3.1.5版本,環(huán)信官方文檔和最新的3.0的demo中,有好多API和類(lèi)名都對(duì)不上,導(dǎo)致了我走了許多彎路,這一點(diǎn)小伙伴們可以借鑒一下)
2.然后將demo中的SDK加入到你的工程中(SDK的文件名是 HyphenateSDK),SDK文件中有兩個(gè).a包,一個(gè)是帶實(shí)時(shí)通話功能(HyphenateFullSDK),一個(gè)是不帶的(HyphenateSDK),選其中一個(gè),另一個(gè)刪除掉,兩者只能保留一個(gè)。具體如何添加SDK以及SDK的依賴庫(kù)參考環(huán)信官方鏈接:http://docs.easemob.com/doku.php?id=im:300iosclientintegration:20iossdkimport
3.添加完SDK之后,添加聊天頁(yè)面,環(huán)信demo中UI的部分都封裝在了EaseUI文件中(具體是聊天頁(yè)面,會(huì)話列表界面,聯(lián)系人界面),找到環(huán)信 demo中的EaseUI文件。將EaseUI內(nèi)部的EaseUI,以及EaseUIResource里的Resource,以及export文件 --->resource文件-->EaseUIResource.bundle,將這3個(gè)文件加到你的工程中,編譯的過(guò)程會(huì)報(bào)錯(cuò),下面列舉幾個(gè)常見(jiàn)的報(bào)錯(cuò)的解決辦法:
? ? ?1)修改報(bào)錯(cuò)的路徑: buildSetting ->搜索library search paths,將報(bào)錯(cuò)的路徑都刪除掉,再重新添加進(jìn)去,我出現(xiàn)的路徑問(wèn)題是我項(xiàng)目中友盟和樂(lè)視,刪除重新添加就好了。
? ? ?2)SDK 不支持 bitcode,向Build Settings →Linking →Enable Bitcode 中設(shè)置 NO。
? ? ?3)刪除EMSDWebImage ,MJRefesh , MBProgress(因?yàn)槲业捻?xiàng)目中有這三個(gè)框架,重復(fù)了),編譯后,把帶有EMSDWebImage都改成SDWebImage
? ? ?4)然后先找到自己項(xiàng)目中的pch文件,然后將SDK的頭文件引入到你的pch文件中,如果是用的帶實(shí)時(shí)通話功能的SDK就引入 #import "EMSDKFull.h" ?如果不帶實(shí)時(shí)通話功能的引入 #import "EMSDK.h",同時(shí)在引入 #import "EaseUI.h"(UI的頭文件)
4.如果工程編譯成功了,那么恭喜你,可以寫(xiě)移動(dòng)客服代碼了。在你的appdelegate,寫(xiě)上初始化環(huán)信appkey,以及登錄環(huán)信服務(wù)器的方法:http://docs.easemob.com/doku.php?id=im:300iosclientintegration:30iossdkbasic (收發(fā)消息是根據(jù)環(huán)信ID,客戶端一定要寫(xiě)登錄環(huán)信服務(wù)器的方法,這個(gè)環(huán)信ID就是你環(huán)信管理后臺(tái)應(yīng)用下的IM用戶)。然后自己可以寫(xiě)一個(gè)按鈕,在按鈕的點(diǎn)擊事件中,跳轉(zhuǎn)到聊天頁(yè)面,方法如下:
EaseMessageViewController *message = [[EaseMessageViewController alloc] initWithConversationChatter:"這里填接受消息方的環(huán)信ID" conversationType:EMConversationTypeChat];
這里用到的聊天頁(yè)面就是EaseUI中的EaseMessageViewController.m聊天頁(yè)面,自己引一下頭文件
這里需要注意兩點(diǎn):
1)conversationType:后面是個(gè)枚舉類(lèi)型,集成的時(shí)候可以點(diǎn)進(jìn)去看一下,因?yàn)樽龅氖且苿?dòng)客服,所以選擇EMConversationTypeChat(單聊)就行。
2)在跳轉(zhuǎn)到聊天控制界面之前,要實(shí)例化聊天控制器EaseMessageViewController,但是實(shí)例化的時(shí)候一定不能這么寫(xiě):EaseMessageViewController *message = [[EaseMessageViewController alloc] init];這種寫(xiě)法是錯(cuò)誤的。這樣會(huì)生成一個(gè)新的聊天界面,之前的聊天記錄和信息是獲取不到的,一定要按照上面正確的寫(xiě)法來(lái)寫(xiě)。
以上集成SDK的過(guò)程可以參考下面的視頻,視頻地址:http://www.imgeek.org/video/
昵稱、頭像的設(shè)置

這里說(shuō)一下頭像和昵稱獲取的方法:第一種是發(fā)送請(qǐng)求從后臺(tái)獲取,第二種是從本地獲取,我是從本地取出來(lái)的
- (id)messageViewController:(EaseMessageViewController *)viewController ? ? ? ? ? ? ? ? ? ? ? ? ? modelForMessage:(EMMessage *)message{ ? ?idmodel = nil;
//獲取用戶的模型信息
model = [[EaseMessageModel alloc] initWithMessage:message];
if (model.isSender) {
model.avatarImage = [UIImage imageNamed:@"EaseUIResource.bundle/user"];
}else{
model.avatarImage = [UIImage imageNamed:@"road_chat_icon"];
}
//從本地獲取昵稱和頭像,在此處賦值即可
NSString * nickName = @"從本地獲取的昵稱";
NSString * araURLStr = @"從本地獲取的頭像";
NSString * currentName = [[EMClient sharedClient] currentUsername];
NSString * msgName = model.message.from;
if ([currentName isEqualToString:msgName]) {
//設(shè)置自己的頭像
if (nickName) {
model.nickname = nickName;
}
if (araURLStr) {
model.avatarURLPath = araURLStr;
}
}else{
//設(shè)置對(duì)方的頭像和昵稱
model.nickname = @"設(shè)置對(duì)方的昵稱";
model.avatarURLPath = @"設(shè)置對(duì)方的頭像";
}
model.failImageName = @"imageDownloadFail";
return model;
}
發(fā)送擴(kuò)展消息
當(dāng)點(diǎn)擊進(jìn)入聊天界面的時(shí)候,默認(rèn)是把商品的信息詳情給發(fā)過(guò)去,這時(shí)需要定義擴(kuò)展消息。



這里說(shuō)明一下:
? ? ? ? 1)commodityInfo是自己定義 的一個(gè)字典,為了接收從上一個(gè)控制器傳過(guò)來(lái)的商品信息。
? ? ? ? 2)messageExt中是想要發(fā)送的擴(kuò)展消息,其中"msgtype"是在客服后臺(tái)的聊天界面要展示的內(nèi)容,"weichat"是用戶要展示的詳細(xì)信息

? ? 3)在移動(dòng)端展示的時(shí)候,問(wèn)了客服,說(shuō)是讓定義一個(gè)cell,繼承自EaseBaseMessageCell,可以自定義中的bubbleView來(lái)進(jìn)行布局。我是定義了一個(gè)新的cell,繼承UITableViewCell,然后在聊天控制器的- (UITableViewCell *)messageViewController:(UITableView *)tableView cellForMessageModel:(id)model方法中,根據(jù)是否是擴(kuò)展消息,來(lái)創(chuàng)建擴(kuò)展消息的cell。
推送問(wèn)題
在網(wǎng)上查資料的時(shí)候,發(fā)現(xiàn)大多數(shù)的人都是因?yàn)橥扑妥C書(shū)的問(wèn)題而導(dǎo)致推送不成功。關(guān)于證書(shū)的詳細(xì)配置和上傳問(wèn)題,可以參考這個(gè)鏈接:http://www.imgeek.org/article/825307504
說(shuō)一下本地通知的實(shí)現(xiàn):
具體原理可以參考這個(gè)鏈接:http://blog.csdn.net/u012236875/article/details/52328783
代碼如下:
- (void)didReceiveMessages:(NSArray *)aMessages
{
for(EMMessage *message in aMessages){
UIApplicationState state = [[UIApplication sharedApplication] applicationState];
switch (state) {
case UIApplicationStateBackground:
[self showNotificationWithMessage:message];
break;
default:
break;
}
}
}
- (void)showNotificationWithMessage:(EMMessage *)message
{
EMPushOptions *options = [[EMClient sharedClient] pushOptions];
//發(fā)送本地推送
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = [NSDate date]; //觸發(fā)通知的時(shí)間
if (options.displayStyle == EMPushDisplayStyleMessageSummary) {
EMMessageBody * ?messageBody = message.body;
NSString *messageStr = nil;
switch (messageBody.type) {
case EMMessageBodyTypeText:
{
messageStr = ((EMTextMessageBody *)messageBody).text;
}
break;
case EMMessageBodyTypeImage:
{
messageStr = NSLocalizedString(@"message.image", @"Image");
}
break;
default:
break;
}
NSString *title = message.from;
notification.alertBody = [NSString stringWithFormat:@"%@:%@", title, messageStr];
}
else{
// ? ? ? ?notification.alertBody = NSLocalizedString(@"receiveMessage", @"you have a new message");
notification.alertBody = @"您有一條新消息";
}
#warning 去掉注釋會(huì)顯示[本地]開(kāi)頭, 方便在開(kāi)發(fā)中區(qū)分是否為本地推送
//notification.alertBody = [[NSString alloc] initWithFormat:@"[本地]%@", notification.alertBody];
notification.alertAction = NSLocalizedString(@"open", @"Open");
notification.timeZone = [NSTimeZone defaultTimeZone];
notification.soundName = UILocalNotificationDefaultSoundName;
//發(fā)送通知
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
總結(jié):
? ? ? ? 在集成的過(guò)程中,會(huì)遇到很多問(wèn)題。遇到問(wèn)題的時(shí)候,一定要多和項(xiàng)目組的人溝通,安卓和iOS集成的原理差不多,和安卓人員溝通可能會(huì)給你解決問(wèn)題帶來(lái)思路。最主要的還是要在環(huán)信官網(wǎng)上咨詢客服,因?yàn)榭头?huì)根據(jù)你的實(shí)際情況來(lái)幫你解決問(wèn)題。環(huán)信官網(wǎng)的大部分客服態(tài)度還是挺好的,技術(shù)也蠻專(zhuān)業(yè)的,會(huì)幫到你很多。在這里向他們表示感謝。
? ? ? ? 以上就是我在集成環(huán)信移動(dòng)客服上的大致過(guò)程,如果有哪里不對(duì)的地方歡迎指出,大家一起學(xué)習(xí),一起進(jìn)步!