環(huán)信SDK3.2.3和EaseUI消息列表和聊天的簡單實現(xiàn)

因為項目以前的環(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];

好了 完成

對了,我這里的聊天界面财岔,只是支持單聊风皿,以后項目如果支持群組的話 ,那再來更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匠璧,一起剝皮案震驚了整個濱河市桐款,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夷恍,老刑警劉巖魔眨,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酿雪,居然都是意外死亡遏暴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門指黎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拓挥,“玉大人,你說我怎么就攤上這事袋励〗钠。” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵茬故,是天一觀的道長盖灸。 經(jīng)常有香客問我,道長磺芭,這世上最難降的妖魔是什么赁炎? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上徙垫,老公的妹妹穿的比我還像新娘讥裤。我一直安慰自己,他們只是感情好姻报,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布己英。 她就那樣靜靜地躺著,像睡著了一般吴旋。 火紅的嫁衣襯著肌膚如雪损肛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天荣瑟,我揣著相機與錄音治拿,去河邊找鬼。 笑死笆焰,一個胖子當(dāng)著我的面吹牛劫谅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嚷掠,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼同波,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叠国?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤戴尸,失蹤者是張志新(化名)和其女友劉穎粟焊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孙蒙,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡项棠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挎峦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片香追。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坦胶,靈堂內(nèi)的尸體忽然破棺而出透典,到底是詐尸還是另有隱情,我是刑警寧澤顿苇,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布峭咒,位于F島的核電站,受9級特大地震影響纪岁,放射性物質(zhì)發(fā)生泄漏凑队。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一幔翰、第九天 我趴在偏房一處隱蔽的房頂上張望漩氨。 院中可真熱鬧西壮,春花似錦、人聲如沸叫惊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赋访。三九已至可都,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚓耽,已是汗流浹背渠牲。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留步悠,地道東北人签杈。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像鼎兽,于是被迫代替她去往敵國和親答姥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容