因為項目以前的環(huán)信嘹裂,是要用到環(huán)信的EaseUI的芙代。所以集成的時候鼓黔,只能手動導(dǎo)入(原因下面會說到),這里介紹的也是手動導(dǎo)入谎脯。
從環(huán)信官網(wǎng)上下來的包如圖
環(huán)信開發(fā)包
然后目錄解釋環(huán)信文檔上也有解釋
從官網(wǎng)上下載下來的包中分為如下五部分:
環(huán)信 iOS HyphenateSDK 開發(fā)使用(不包含實時通話功能)
環(huán)信 iOS HyphenateFullSDK 開發(fā)使用(包含實時通話功能)
環(huán)信 iOS doc SDK 相關(guān)API文檔
環(huán)信 iOS ChatUIDemo3.0 工程源碼
環(huán)信 iOS EaseUI 工程源碼
環(huán)信 iOS chatdemo-ui-3.x.x.ipa 打包的 spa
上面提過葱跋,項目中要用EaseUI,所以別看環(huán)信給了你兩個選擇源梭,可以導(dǎo)入一個不包含實時通話的娱俺,可以小一點。但是環(huán)信封裝的EaseUI里面废麻,引用的庫是包含實時通話的HyphenateFullSDK矢否,所以 ,只能導(dǎo)入HyphenateFullSDK庫脑溢。。。蛋疼屑彻。
這時候有小伙伴就說验庙,那我可以cocopod導(dǎo)入HyphenateFullSDK庫,然后手動導(dǎo)入EaseUI啊社牲。
本人試過粪薛,結(jié)果就是,EaseUI內(nèi)部會報錯方法找不到搏恤,然后你對比一下cocopod導(dǎo)入的HyphenateFullSDK庫比手動導(dǎo)入的HyphenateFullSDK庫會少幾個方法违寿。。熟空。少的就是那幾個報錯的方法藤巢。。息罗。
本人pod search了一下 看了一下版本 Hyphenate 的版本是3.1.5掂咒,但是下載下來的是3.2.3。迈喉。绍刮。我有點方了。挨摸。孩革。
然后想了一種方法,手動導(dǎo)入Hyphenate 但是pod EaseUI得运。但是有朋友說膝蜈,EaseUI最好手動導(dǎo)入,因為有可能你會修改EaseUI澈圈,所以不建議pod彬檀。
好吧,我認(rèn)命了瞬女,按環(huán)信文檔手動導(dǎo)入Hyphenate和EaseUI窍帝,并添加系統(tǒng)依賴庫。
然后诽偷,編譯失敗坤学。。报慕。
你可以看一下錯誤深浮,基本就是找不到UIKit,
解決方法:在pch文件中加入UIKit眠冈,注意飞苇,OBJC千萬不要忘菌瘫。
#ifdef __OBJC__#import#endif
然后再編譯,又失敗布卡。雨让。。
看了一下忿等,跟項目中本身的MJ庫沖突栖忠,沒辦法,只能刪了贸街。
然后再編譯庵寞,又錯。薛匪。捐川。這次是我的錯,環(huán)信不支持Bitcode蛋辈,記得Bitcode為NO
然后在編譯属拾,過了,恩冷溶,Nice渐白。
運行,然后崩了逞频。纯衍。。
臥槽苗胀,我只是導(dǎo)入啊襟诸,代碼還沒開始寫那。難道是我打開的方式不對基协?
試了幾次歌亲,發(fā)現(xiàn)連Appdelegate都沒進(jìn)去。澜驮。陷揪。
崩潰的地方和打印
然后上網(wǎng)找了一圈,看到了一位大哥說的杂穷,說出現(xiàn)Reason: image not found錯誤悍缠,把Hyphenate.Framework庫要改成Optional就好了,如圖下耐量。
示例圖
改完以后飞蚓,果然好了,當(dāng)時心里各種感覺大哥啊廊蜒。然后就開始寫代碼趴拧,但是出現(xiàn)一個問題溅漾,登錄的block一直不回調(diào),但是也沒有錯誤著榴。環(huán)信也沒有日志樟凄。。兄渺。我感覺我貌似被坑了。汰现。挂谍。
對照了一下環(huán)信的示例demo,人家的Hyphenate.Framework也不是Optional啊瞎饲。但是在Build Phases里多了一行
環(huán)信demo的Build Phases
尼瑪口叙,坑爹啊,多的這個為毛文檔里沒有嗅战。
加上了這個妄田,果然好了。
那位大哥驮捍,我很好奇疟呐,你是怎么用那個方法解決的。东且。。
對于SDK的初始化,登錄扣讼,注冊什么的 就不說了猜极,自己看文檔去吧。
這里主要說下基于EaseUI色查,實現(xiàn)消息列表頁和聊天界面
環(huán)信默認(rèn)的聊天界面
因為環(huán)信提供的聊天界面和消息列表界面薯演,是沒有昵稱和頭像的,一般的用戶的圖片和用戶名秧了,都是存在自己服務(wù)器的跨扮,那怎么把聊天界面中的頭像和用戶名換成自己的服務(wù)器上的數(shù)據(jù)?
方法一:從APP服務(wù)器獲取昵稱和頭像昵稱和頭像的獲仁揪:當(dāng)收到一條消息(群消息)時好港,得到發(fā)送者的用戶ID,然后查找手機本地數(shù)據(jù)庫是否有此用戶ID的昵稱和頭像米罚,如沒有則調(diào)用APP服務(wù)器接口通過用戶ID查詢出昵稱和頭像钧汹,然后保存到本地數(shù)據(jù)庫和緩存,下次此用戶發(fā)來信息即可直接查詢緩存或者本地數(shù)據(jù)庫录择,不需要再次向APP服務(wù)器發(fā)起請求拔莱。
昵稱和頭像的更新:當(dāng)點擊發(fā)送者頭像時加載用戶詳情時從APP服務(wù)器查詢此用戶的具體信息然后更新本地數(shù)據(jù)庫和緩存碗降。當(dāng)用戶自己更新昵稱或頭像時,也可以發(fā)送一條透傳消息到其他用戶和用戶所在的群塘秦,來更新該用戶的昵稱和頭像讼渊。
方法二:從消息擴展中獲取昵稱和頭像
昵稱和頭像的獲取:把用戶基本的昵稱和頭像的URL放到消息的擴展中尊剔,通過消息傳遞給接收方爪幻,當(dāng)收到一條消息時,則能通過消息的擴展得到發(fā)送者的昵稱和頭像URL须误,然后保存到本地數(shù)據(jù)庫和緩存挨稿。當(dāng)顯示昵稱和頭像時,請從本地或者緩存中讀取京痢,不要直接從消息中把賦值拿給界面(否則當(dāng)用戶昵稱改變后奶甘,同一個人會顯示不同的昵稱)。
昵稱和頭像的更新:當(dāng)擴展消息中的昵稱和頭像 URI 與當(dāng)前本地數(shù)據(jù)庫和緩存中的相應(yīng)數(shù)據(jù)不同的時候祭椰,需要把新的昵稱保存到本地數(shù)據(jù)庫和緩存臭家,并下載新的頭像并保存到本地數(shù)據(jù)庫和緩存。
上面是兩種環(huán)信文檔中介紹的方淤,我采用的算是第一種(其實我感覺那種都不算钉赁。。臣淤。)橄霉,就是把服務(wù)器上的昵稱和頭像填到聊天界面和消息列表界面中,表示本地數(shù)據(jù)庫什么的邑蒋,一點都不知道姓蜂,環(huán)信你提供了么?在demo中倒是看到了医吊,但是那個又不在EaseUI中钱慢,而且還涉及到另一個.framework,就沒有導(dǎo)入卿堂。如果小伙伴有更好的方法束莫,也可以簡信告訴我。
所以大體的思路就是草描,服務(wù)器請求到的數(shù)據(jù)览绿,填到消息列表和聊天界面上。
在EaseUI中穗慕,負(fù)責(zé)消息列表的是EaseConversationListViewController這個類
負(fù)責(zé)聊天界面的是EaseMessageViewController這個類
我的做法是分別用兩個類繼承他們兩個饿敲,ChatViewController繼承EaseMessageViewController,ChatListViewController繼承EaseConversationListViewController逛绵。
然后在我繼承的這個兩個類中實現(xiàn)環(huán)信提供的代理方法怀各,盡量不去改環(huán)信的EaseUI代碼(里面那代碼改起來也的瘋啊倔韭,而且那么多,以后自己改的那些你還記得么瓢对?寿酌,還不如整一個新類)。
先說消息列表硕蛹,有這幾需求
需求:
1醇疼、昵稱和頭像
2、消息的時間法焰,因為EaseUI默認(rèn)的是日期僵腺,而不是幾點幾分
3、下拉刷新和空視圖
4壶栋、點擊推出的聊天詳情
解決方案:
1、昵稱和頭像
EaseUI已經(jīng)給我們提供了代理方法普监,只要實現(xiàn)代理方法贵试,就可以自定義cell的樣式了。方法名:
- (id)conversationListViewController:(EaseConversationListViewController *)conversationListViewController modelForConversation:(EMConversation *)conversation
此代理是在EaseConversationListViewControllerDataSource協(xié)議中的凯正,所以ChatListViewController(繼承EaseConversationListViewController的類)要遵從協(xié)議毙玻,并且self.dataSource = self;
此方法是返回一個遵從IConversationModel代理的model,這個model就是cell的數(shù)據(jù)源廊散,EaseUI已經(jīng)幫我們寫好了一個model桑滩,我們直接創(chuàng)建,然后賦值就好了
- (id)conversationListViewController:(EaseConversationListViewController *)conversationListViewController? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? modelForConversation:(EMConversation *)conversation{? ? //用環(huán)信提供的model就可以了? ? EaseConversationModel *model = [[EaseConversationModel alloc] initWithConversation:conversation];? ? //然后根據(jù)用戶名? 往上面賦值? ? //self.imageAndNameArray為自定義的數(shù)組允睹,其中存儲的是從自己服務(wù)器上請求下來的數(shù)據(jù)? ? //數(shù)據(jù)包括运准,昵稱,頭像和默認(rèn)圖片for(HPChatListDataModel *dataModelinself.imageAndNameArray) {if([dataModel.mobile isEqualToString:model.conversation.conversationId]) {//根據(jù)用戶名對應(yīng)起來? ? ? ? ? ? model.avatarURLPath = dataModel.pic;//頭像的網(wǎng)絡(luò)圖片? ? ? ? ? ? model.avatarImage = [dataModel getDefaultImage];//頭像的默認(rèn)圖片? ? ? ? ? ? model.title = dataModel.name;//昵稱? ? ? ? }? ? }returnmodel;}
主要是在那個for循環(huán)中缭受,給model賦值胁澳,就好了
但是這里有個問題,如果你們服務(wù)器返回的頭像是圓的米者,那么會看起來頭像四角是灰色的韭畸,這是因為環(huán)信的消息列表中,頭像的imageView的背景顏色蔓搞,設(shè)置成灰色的胰丁,所以,只能在EaseConversationListViewController類的
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
方法中加上喂分,
cell.avatarView.imageView.backgroundColor = [UIColor whiteColor];
2锦庸、消息的時間
環(huán)信提供的方法:
- (NSString *)conversationListViewController:(EaseConversationListViewController *)conversationListViewController
方法的實現(xiàn):
//時間- (NSString *)conversationListViewController:(EaseConversationListViewController *)conversationListViewController? ? ? latestMessageTimeForConversationModel:(id)conversationModel{? ? NSString *latestMessageTime = @"";? ? EMMessage *lastMessage = [conversationModel.conversation latestMessage];;if(lastMessage) {? ? ? ? //這個方法是環(huán)信提供的? ? ? ? latestMessageTime = [NSDate formattedTimeFromTimeInterval:lastMessage.timestamp];? ? }returnlatestMessageTime;}
其中方法formattedTimeFromTimeInterva是環(huán)信EaseUI中提供的,要包含頭文件
#import "NSDate+Category.h"http://環(huán)信時間分類
3妻顶、下拉刷新和空視圖
//打開下來刷新
self.showRefreshHeader = YES;
實現(xiàn)下拉刷新的方法酸员,
//下拉刷新? 實現(xiàn)以下
- (void)tableViewDidTriggerHeaderRefresh{
//super必須要有? 要不會有問題
[super tableViewDidTriggerHeaderRefresh];
//這里寫下拉的方法
}
空視圖
判斷是否為空視圖的話蜒车,直接判斷self.dataArray.count就好了,父類的數(shù)據(jù)源數(shù)組就是這個幔嗦。
4酿愧、點擊推出的聊天詳情
因為聊天詳情要用我們自定義的ChatViewController(繼承于EaseMessageViewController),所以點擊推出的應(yīng)該是我們自定義的邀泉,所以要實現(xiàn)代理方法:
- (void)conversationListViewController:(EaseConversationListViewController *)conversationListViewController
didSelectConversationModel:(id)conversationModel嬉挡;
實現(xiàn):
- (void)conversationListViewController:(EaseConversationListViewController *)conversationListViewController
didSelectConversationModel:(id)conversationModel{
EaseConversationModel *model = (EaseConversationModel *)conversationModel;
//自定義點擊cell推出的viewcontroller
ChatViewController *viewController = [HPChatViewController chatViewControllerWithConversationChatter:model.conversation.conversationId title:model.title imageUrl:model.avatarURLPath defaultImage:model.avatarImage];
[self.navigationController pushViewController:viewController animated:YES];
}
聊天界面
需求:
1、替換昵稱和頭像
2汇恤、去掉多余的功能按鈕
環(huán)信EaseUI提供的方法
- (id)messageViewController:(EaseMessageViewController *)viewController
modelForMessage:(EMMessage *)message
實現(xiàn):
- (id)messageViewController:(EaseMessageViewController *)viewController? ? ? ? ? ? ? ? ? ? ? ? ? modelForMessage:(EMMessage *)message{//用戶可以根據(jù)自己的用戶體系庞钢,根據(jù)message設(shè)置用戶昵稱和頭像id model = nil;//EaseMessageModel是環(huán)信EaseUI提供的model? 直接引用就好了model = [[EaseMessageModel alloc] initWithMessage:message];//分兩種情況? 一種是當(dāng)為當(dāng)前用戶的時候if([model.nickname isEqualToString:[EMClient sharedClient].currentUsername]) {//默認(rèn)圖model.avatarImage = [UIImage imageNamed:@"DefaultImg"]//網(wǎng)絡(luò)圖model.avatarURLPath = accInfo.pic;? ? }else{//當(dāng)為對方的時候model.avatarURLPath = _imageUrl;//網(wǎng)絡(luò)圖model.avatarImage =? [UIImage imageNamed:@"DefaultImg"];? ? }? ? model.nickname = nil;//用戶昵稱returnmodel;}
2、去掉多余的功能按鈕
//刪除電話和視頻//這里為什么要移除3兩次因谎,因為執(zhí)行第一次后基括,后一個的索引變成了3[self.chatBarMoreView removeItematIndex:3];? ? [self.chatBarMoreView removeItematIndex:3];
好了 完成
對了,我這里的聊天界面财岔,只是支持單聊风皿,以后項目如果支持群組的話 ,那再來更新