iOS集成環(huán)信移動(dòng)客服

前幾天集成環(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)步!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容