環信SDK3.2.3和EaseUI消息列表和聊天的簡單實現

這幾天趁著比較閑,就整理了下項目中的環信。貌似還是2.x,看著不爽,果斷要升級啊。

但是以前沒集成過環信,第一次集成遇到了好多坑,特寫下記下

好,開始了。

因為項目以前的環信,是要用到環信的EaseUI的。所以集成的時候,只能手動導入(原因下面會說到),這里介紹的也是手動導入。

從環信官網上下來的包如圖

環信開發包
然后目錄解釋環信文檔上也有解釋

從官網上下載下來的包中分為如下五部分:

環信 iOS HyphenateSDK 開發使用(不包含實時通話功能)

環信 iOS HyphenateFullSDK 開發使用(包含實時通話功能)

環信 iOS doc SDK 相關API文檔

環信 iOS ChatUIDemo3.0 工程源碼

環信 iOS EaseUI 工程源碼

環信 iOS chatdemo-ui-3.x.x.ipa 打包的 spa

上面提過,項目中要用EaseUI,所以別看環信給了你兩個選擇,可以導入一個不包含實時通話的,可以小一點。但是環信封裝的EaseUI里面,引用的庫是包含實時通話的HyphenateFullSDK,所以 ,只能導入HyphenateFullSDK庫。。。蛋疼。

這時候有小伙伴就說,那我可以cocopod導入HyphenateFullSDK庫,然后手動導入EaseUI啊。


本人試過,結果就是,EaseUI內部會報錯方法找不到,然后你對比一下cocopod導入的HyphenateFullSDK庫比手動導入的HyphenateFullSDK庫會少幾個方法。。。少的就是那幾個報錯的方法。。。

本人pod search了一下 看了一下版本 Hyphenate 的版本是3.1.5,但是下載下來的是3.2.3。。。我有點方了。。。

然后想了一種方法,手動導入Hyphenate 但是pod EaseUI。但是有朋友說,EaseUI最好手動導入,因為有可能你會修改EaseUI,所以不建議pod。環信默認的聊天界面環信默認的聊天界面


好吧,我認命了,按環信文檔手動導入Hyphenate和EaseUI,并添加系統依賴庫。

然后,編譯失敗。。。

你可以看一下錯誤,基本就是找不到UIKit,

解決方法:在pch文件中加入UIKit,注意,OBJC千萬不要忘。

#ifdef __OBJC__
#import<UIKit/UIKit.h>
#endif

然后再編譯,又失敗。。。

看了一下,跟項目中本身的MJ庫沖突,沒辦法,只能刪了。

然后再編譯,又錯。。。這次是我的錯,環信不支持Bitcode,記得Bitcode為NO

然后在編譯,過了,恩,Nice。

運行,然后崩了。。。

臥槽,我只是導入啊,代碼還沒開始寫那。難道是我打開的方式不對?

試了幾次,發現連Appdelegate都沒進去。。。

崩潰的地方和打印
然后上網找了一圈,看到了一位大哥說的,說出現Reason: image not found錯誤,把Hyphenate.Framework庫要改成Optional就好了,如圖下。


示例圖
改完以后,果然好了,當時心里各種感覺大哥啊。然后就開始寫代碼,但是出現一個問題,登錄的block一直不回調,但是也沒有錯誤。環信也沒有日志。。。我感覺我貌似被坑了。。。

對照了一下環信的示例demo,人家的Hyphenate.Framework也不是Optional啊。但是在Build Phases里多了一行

環信demo的Build Phases
尼瑪,坑爹啊,多的這個為毛文檔里沒有。

加上了這個,果然好了。

那位大哥,我很好奇,你是怎么用那個方法解決的。。。

對于SDK的初始化,登錄,注冊什么的 就不說了,自己看文檔去吧。

2017.7.13更新
不知道是不是環信更新了還是怎么了,這次的項目中用pod管理環信,一點問題也沒有,棒棒的順利啊
podfile中
pod 'Hyphenate' #環信聊天Full版本
pod 'EaseUI', :git => 'https://github.com/easemob/easeui-ios-hyphenate-cocoapods.git' #環信自定義UI

然后直接pod install就好了
注意:先確定你項目中有沒有MJRefresh 如果有 請注釋掉,要不install的時候,pod會提示你沖突,install失敗

這里主要說下基于EaseUI,實現消息列表頁和聊天界面

C91EECE0-F857-42C2-B1BA-EE72DED6735E.png

環信默認的聊天界面
因為環信提供的聊天界面和消息列表界面,是沒有昵稱和頭像的,一般的用戶的圖片和用戶名,都是存在自己服務器的,那怎么把聊天界面中的頭像和用戶名換成自己的服務器上的數據?

方法一:從APP服務器獲取昵稱和頭像昵稱和頭像的獲取:當收到一條消息(群消息)時,得到發送者的用戶ID,然后查找手機本地數據庫是否有此用戶ID的昵稱和頭像,如沒有則調用APP服務器接口通過用戶ID查詢出昵稱和頭像,然后保存到本地數據庫和緩存,下次此用戶發來信息即可直接查詢緩存或者本地數據庫,不需要再次向APP服務器發起請求。

昵稱和頭像的更新:當點擊發送者頭像時加載用戶詳情時從APP服務器查詢此用戶的具體信息然后更新本地數據庫和緩存。當用戶自己更新昵稱或頭像時,也可以發送一條透傳消息到其他用戶和用戶所在的群,來更新該用戶的昵稱和頭像。

方法二:從消息擴展中獲取昵稱和頭像

昵稱和頭像的獲取:把用戶基本的昵稱和頭像的URL放到消息的擴展中,通過消息傳遞給接收方,當收到一條消息時,則能通過消息的擴展得到發送者的昵稱和頭像URL,然后保存到本地數據庫和緩存。當顯示昵稱和頭像時,請從本地或者緩存中讀取,不要直接從消息中把賦值拿給界面(否則當用戶昵稱改變后,同一個人會顯示不同的昵稱)。

昵稱和頭像的更新:當擴展消息中的昵稱和頭像 URI 與當前本地數據庫和緩存中的相應數據不同的時候,需要把新的昵稱保存到本地數據庫和緩存,并下載新的頭像并保存到本地數據庫和緩存。
上面是兩種環信文檔中介紹的,我采用的算是第一種(其實我感覺那種都不算。。。),就是把服務器上的昵稱和頭像填到聊天界面和消息列表界面中,表示本地數據庫什么的,一點都不知道,環信你提供了么?在demo中倒是看到了,但是那個又不在EaseUI中,而且還涉及到另一個.framework,就沒有導入。如果小伙伴有更好的方法,也可以簡信告訴我。

所以大體的思路就是,服務器請求到的數據,填到消息列表和聊天界面上。

在EaseUI中,負責消息列表的是EaseConversationListViewController這個類

負責聊天界面的是EaseMessageViewController這個類

我的做法是分別用兩個類繼承他們兩個,ChatViewController繼承EaseMessageViewController,ChatListViewController繼承EaseConversationListViewController。
然后在我繼承的這個兩個類中實現環信提供的代理方法,盡量不去改環信的EaseUI代碼(里面那代碼改起來也的瘋啊,而且那么多,以后自己改的那些你還記得么?,還不如整一個新類)。

先說消息列表,有這幾需求

需求:

1、昵稱和頭像

2、消息的時間,因為EaseUI默認的是日期,而不是幾點幾分

3、下拉刷新和空視圖

4、點擊推出的聊天詳情

解決方案:

1、昵稱和頭像

EaseUI已經給我們提供了代理方法,只要實現代理方法,就可以自定義cell的樣式了。方法名:

- (id<IConversationModel>)conversationListViewController:(EaseConversationListViewController *)conversationListViewController modelForConversation:(EMConversation *)conversation

此代理是在EaseConversationListViewControllerDataSource協議中的,所以ChatListViewController(繼承EaseConversationListViewController的類)要遵從協議,并且self.dataSource = self;
此方法是返回一個遵從IConversationModel代理的model,這個model就是cell的數據源,EaseUI已經幫我們寫好了一個model,我們直接創建,然后賦值就好了

- (id<IConversationModel>)conversationListViewController:(EaseConversationListViewController *)conversationListViewController
                                    modelForConversation:(EMConversation *)conversation{
    //用環信提供的model就可以了
    EaseConversationModel *model = [[EaseConversationModel alloc] initWithConversation:conversation];
    //然后根據用戶名  往上面賦值
    //self.imageAndNameArray為自定義的數組,其中存儲的是從自己服務器上請求下來的數據
    //數據包括,昵稱,頭像和默認圖片
    for (HPChatListDataModel *dataModel in self.imageAndNameArray) {
        if ([dataModel.mobile isEqualToString:model.conversation.conversationId]) {//根據用戶名對應起來
            model.avatarURLPath = dataModel.pic;//頭像的網絡圖片
            model.avatarImage = [dataModel getDefaultImage];//頭像的默認圖片
            model.title = dataModel.name;//昵稱
        }
    }
    return model;
}

主要是在那個for循環中,給model賦值,就好了
但是這里有個問題,如果你們服務器返回的頭像是圓的,那么會看起來頭像四角是灰色的,這是因為環信的消息列表中,頭像的imageView的背景顏色,設置成灰色的,所以,只能在EaseConversationListViewController類的

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

方法中加上,

cell.avatarView.imageView.backgroundColor = [UIColor whiteColor];

2、消息的時間

環信提供的方法:

- (NSString *)conversationListViewController:(EaseConversationListViewController *)conversationListViewController

方法的實現:

//時間
- (NSString *)conversationListViewController:(EaseConversationListViewController *)conversationListViewController
       latestMessageTimeForConversationModel:(id<IConversationModel>)conversationModel{
    NSString *latestMessageTime = @"";
    EMMessage *lastMessage = [conversationModel.conversation latestMessage];;
    if (lastMessage) {
        //這個方法是環信提供的
        latestMessageTime = [NSDate formattedTimeFromTimeInterval:lastMessage.timestamp];
    }
    return latestMessageTime;
}

其中方法formattedTimeFromTimeInterva是環信EaseUI中提供的,要包含頭文件

#import "NSDate+Category.h"http://環信時間分類

3、下拉刷新和空視圖

//打開下來刷新
    self.showRefreshHeader = YES;

實現下拉刷新的方法,

//下拉刷新  實現以下
- (void)tableViewDidTriggerHeaderRefresh{
//super必須要有  要不會有問題
    [super tableViewDidTriggerHeaderRefresh];
    //這里寫下拉的方法
}

空視圖

判斷是否為空視圖的話,直接判斷self.dataArray.count就好了,父類的數據源數組就是這個。

4、點擊推出的聊天詳情

因為聊天詳情要用我們自定義的ChatViewController(繼承于EaseMessageViewController),所以點擊推出的應該是我們自定義的,所以要實現代理方法:

- (void)conversationListViewController:(EaseConversationListViewController *)conversationListViewController
            didSelectConversationModel:(id<IConversationModel>)conversationModel;

實現:

- (void)conversationListViewController:(EaseConversationListViewController *)conversationListViewController
            didSelectConversationModel:(id<IConversationModel>)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、去掉多余的功能按鈕

環信EaseUI提供的方法

- (id<IMessageModel>)messageViewController:(EaseMessageViewController *)viewController
                           modelForMessage:(EMMessage *)message

實現:

- (id<IMessageModel>)messageViewController:(EaseMessageViewController *)viewController
                           modelForMessage:(EMMessage *)message
{
    //用戶可以根據自己的用戶體系,根據message設置用戶昵稱和頭像
    id<IMessageModel> model = nil;
//EaseMessageModel是環信EaseUI提供的model  直接引用就好了
    model = [[EaseMessageModel alloc] initWithMessage:message];
    //分兩種情況  一種是當為當前用戶的時候
    if ([model.nickname isEqualToString:[EMClient sharedClient].currentUsername]) {
        //默認圖
        model.avatarImage = [UIImage imageNamed:@"DefaultImg"]
        //網絡圖
        model.avatarURLPath = accInfo.pic;
    }else{//當為對方的時候
        model.avatarURLPath = _imageUrl;//網絡圖
        model.avatarImage =  [UIImage imageNamed:@"DefaultImg"];
    }
    model.nickname = nil;//用戶昵稱
    return model;
}

2、去掉多余的功能按鈕

    //刪除電話和視頻
   //這里為什么要移除3兩次,因為執行第一次后,后一個的索引變成了3
    [self.chatBarMoreView removeItematIndex:3];
    [self.chatBarMoreView removeItematIndex:3];

好了 完成

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容