前幾天集成環(huán)信移動客服,遇到了許多問題约啊,集成的過程也是磕磕絆絆饵逐,現(xiàn)在總結(jié)出來記錄一下劲阎。步驟大體是這樣:
1.首先到環(huán)信官網(wǎng)下載3.0SDK的demo 網(wǎng)址:http://www.easemob.com/download
(PS:因為我當(dāng)時下的SDK是最新的3.1.5版本,環(huán)信官方文檔和最新的3.0的demo中刨沦,有好多API和類名都對不上诗宣,導(dǎo)致了我走了許多彎路,這一點小伙伴們可以借鑒一下)
2.然后將demo中的SDK加入到你的工程中(SDK的文件名是 HyphenateSDK)想诅,SDK文件中有兩個.a包召庞,一個是帶實時通話功能(HyphenateFullSDK),一個是不帶的(HyphenateSDK)来破,選其中一個篮灼,另一個刪除掉,兩者只能保留一個徘禁。具體如何添加SDK以及SDK的依賴庫參考環(huán)信官方鏈接:http://docs.easemob.com/doku.php?id=im:300iosclientintegration:20iossdkimport
3.添加完SDK之后诅诱,添加聊天頁面,環(huán)信demo中UI的部分都封裝在了EaseUI文件中(具體是聊天頁面晌坤,會話列表界面逢艘,聯(lián)系人界面),找到環(huán)信 demo中的EaseUI文件骤菠。將EaseUI內(nèi)部的EaseUI,以及EaseUIResource里的Resource疤孕,以及export文件 --->resource文件-->EaseUIResource.bundle商乎,將這3個文件加到你的工程中,編譯的過程會報錯祭阀,下面列舉幾個常見的報錯的解決辦法:
? ? ?1)修改報錯的路徑: buildSetting ->搜索library search paths鹉戚,將報錯的路徑都刪除掉,再重新添加進去专控,我出現(xiàn)的路徑問題是我項目中友盟和樂視抹凳,刪除重新添加就好了。
? ? ?2)SDK 不支持 bitcode伦腐,向Build Settings →Linking →Enable Bitcode 中設(shè)置 NO赢底。
? ? ?3)刪除EMSDWebImage ,MJRefesh , MBProgress(因為我的項目中有這三個框架,重復(fù)了)柏蘑,編譯后幸冻,把帶有EMSDWebImage都改成SDWebImage
? ? ?4)然后先找到自己項目中的pch文件,然后將SDK的頭文件引入到你的pch文件中咳焚,如果是用的帶實時通話功能的SDK就引入 #import "EMSDKFull.h" ?如果不帶實時通話功能的引入 #import "EMSDK.h"洽损,同時在引入 #import "EaseUI.h"(UI的頭文件)
4.如果工程編譯成功了,那么恭喜你革半,可以寫移動客服代碼了碑定。在你的appdelegate流码,寫上初始化環(huán)信appkey,以及登錄環(huán)信服務(wù)器的方法:http://docs.easemob.com/doku.php?id=im:300iosclientintegration:30iossdkbasic (收發(fā)消息是根據(jù)環(huán)信ID延刘,客戶端一定要寫登錄環(huán)信服務(wù)器的方法漫试,這個環(huán)信ID就是你環(huán)信管理后臺應(yīng)用下的IM用戶)。然后自己可以寫一個按鈕访娶,在按鈕的點擊事件中商虐,跳轉(zhuǎn)到聊天頁面,方法如下:
EaseMessageViewController *message = [[EaseMessageViewController alloc] initWithConversationChatter:"這里填接受消息方的環(huán)信ID" conversationType:EMConversationTypeChat];
這里用到的聊天頁面就是EaseUI中的EaseMessageViewController.m聊天頁面崖疤,自己引一下頭文件
這里需要注意兩點:
1)conversationType:后面是個枚舉類型秘车,集成的時候可以點進去看一下,因為做的是移動客服劫哼,所以選擇EMConversationTypeChat(單聊)就行叮趴。
2)在跳轉(zhuǎn)到聊天控制界面之前,要實例化聊天控制器EaseMessageViewController权烧,但是實例化的時候一定不能這么寫:EaseMessageViewController *message = [[EaseMessageViewController alloc] init];這種寫法是錯誤的眯亦。這樣會生成一個新的聊天界面,之前的聊天記錄和信息是獲取不到的般码,一定要按照上面正確的寫法來寫妻率。
以上集成SDK的過程可以參考下面的視頻,視頻地址:http://www.imgeek.org/video/
昵稱板祝、頭像的設(shè)置
這里說一下頭像和昵稱獲取的方法:第一種是發(fā)送請求從后臺獲取宫静,第二種是從本地獲取,我是從本地取出來的
- (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è)置對方的頭像和昵稱
model.nickname = @"設(shè)置對方的昵稱";
model.avatarURLPath = @"設(shè)置對方的頭像";
}
model.failImageName = @"imageDownloadFail";
return model;
}
發(fā)送擴展消息
當(dāng)點擊進入聊天界面的時候孤里,默認是把商品的信息詳情給發(fā)過去,這時需要定義擴展消息橘洞。
這里說明一下:
? ? ? ? 1)commodityInfo是自己定義 的一個字典捌袜,為了接收從上一個控制器傳過來的商品信息。
? ? ? ? 2)messageExt中是想要發(fā)送的擴展消息炸枣,其中"msgtype"是在客服后臺的聊天界面要展示的內(nèi)容虏等,"weichat"是用戶要展示的詳細信息
? ? 3)在移動端展示的時候,問了客服抛虏,說是讓定義一個cell,繼承自EaseBaseMessageCell博其,可以自定義中的bubbleView來進行布局。我是定義了一個新的cell迂猴,繼承UITableViewCell慕淡,然后在聊天控制器的- (UITableViewCell *)messageViewController:(UITableView *)tableView cellForMessageModel:(id)model方法中,根據(jù)是否是擴展消息沸毁,來創(chuàng)建擴展消息的cell峰髓。
推送問題
在網(wǎng)上查資料的時候傻寂,發(fā)現(xiàn)大多數(shù)的人都是因為推送證書的問題而導(dǎo)致推送不成功。關(guān)于證書的詳細配置和上傳問題携兵,可以參考這個鏈接:http://www.imgeek.org/article/825307504
說一下本地通知的實現(xiàn):
具體原理可以參考這個鏈接: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ā)通知的時間
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 去掉注釋會顯示[本地]開頭, 方便在開發(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é):
? ? ? ? 在集成的過程中疾掰,會遇到很多問題。遇到問題的時候徐紧,一定要多和項目組的人溝通静檬,安卓和iOS集成的原理差不多,和安卓人員溝通可能會給你解決問題帶來思路并级。最主要的還是要在環(huán)信官網(wǎng)上咨詢客服拂檩,因為客服會根據(jù)你的實際情況來幫你解決問題。環(huán)信官網(wǎng)的大部分客服態(tài)度還是挺好的嘲碧,技術(shù)也蠻專業(yè)的稻励,會幫到你很多。在這里向他們表示感謝愈涩。
? ? ? ? 以上就是我在集成環(huán)信移動客服上的大致過程望抽,如果有哪里不對的地方歡迎指出,大家一起學(xué)習(xí)履婉,一起進步煤篙!