一、環(huán)信SDK的集成
0.先附一張項目聊天界面的截圖格侯,昵稱和頭像鼻听,還有自定義cell都有,會話列表就不貼圖了联四,跟平時我們用QQ 撑碴、微信差不多
1.去環(huán)信官網(wǎng)下載iOS版的SDK ,下載地址:環(huán)信iOS_SDK下載地址 ?朝墩,接口文檔地址:環(huán)信iOS_SDK集成文檔
2.按照接口文檔一步一步將環(huán)信SDK集成到項目中醉拓,制作證書、添加依賴... 這些就不贅述了,官網(wǎng)的文檔十分詳細亿卤,這里我就講一些注意點
集成環(huán)信SDK過程可能遇到的一些情況和解決辦法:
(1)環(huán)信用到的第三方框架有:MWPhotoBrowser愤兵、MJRefresh、MBProgressHUD排吴、SDWebImage(環(huán)信是自己在SDWebImage里面加一些功能并命名為:EMSDWebImage)秆乳,所以你需要把跟你項目相同的框架刪除一個,可以刪除自己的或者刪除環(huán)信的傍念。其中SDWebImage矫夷,個人建議刪除環(huán)信的EMSDWebImage葛闷,然后編譯憋槐,這個時候肯定是編譯失敗,出現(xiàn)失敗的原因是:少了一些sd里面的頭文件和一些方法找不到淑趾,你直接將頭文件刪除阳仔,換成SDWebImage的,方法也是替換成SDWebImage的就行了
(2)可能遇到的情況 :編譯的時候報 "could not build module 'UIKit'" 或者是“could not build module 'Foundation'”扣泊,這種情況就是 你的pch 文件里近范,你導(dǎo)的頭文件 不是包在 ?#ifdef __OBJC__ ? ?#endif ?里面
到此,如果你是嚴格按照官方文檔的步驟一步不落的集成的話延蟹,應(yīng)該是不會有什么問題的评矩,是可以正常編譯運行的。
二阱飘、賬號的登錄
1.看你們項目的要求斥杜,筆者是在自己app登錄的時候,也把環(huán)信賬號登錄(登錄的用戶名和密碼規(guī)則看你們后臺是怎么配置的)沥匈。環(huán)信SDK是有自動登錄的功能的蔗喂,所以盡管用戶殺死app后,再次啟動app時高帖,不需要再次進入登錄界面再次登錄缰儿。
2.賬號登錄的異常情況,比如說這個環(huán)信賬號在別的地方登錄了散址,那么就會出現(xiàn)登錄失效乖阵,鏈接不到服務(wù)器的情況。這個時候環(huán)信提供了方法和屬性來判斷预麸。 這屬性和方法的回調(diào)是在EMClientDelegate協(xié)議里面的义起,在你的控制器里面遵守協(xié)議就可以
這是環(huán)信賬號在你其他地方登錄的時候的回調(diào)方法:
三、會話列表
1.集成會話列表功能也十分簡單的师崎,首先新建一個控制器繼承 EaseConversationListViewController默终,在viewDidLoad里面 設(shè)置delegate和dataSource遵守EaseConversationListViewControllerDelegate、EaseConversationListViewControllerDataSource協(xié)議,并加上 [self ?tableViewDidTriggerHeaderRefresh]; 這句代碼(首次進入刷新數(shù)據(jù))齐蔽。
2.會話列表實時顯示未讀消息两疚。也就是說在會話列表界面的時候,有人發(fā)消息過來了含滴,發(fā)消息來的那個人的頭像要有一個紅色的數(shù)字诱渤,并顯示未讀消息數(shù)量,想要這個功能的話谈况,就要遵守EMChatManagerDelegate 協(xié)議勺美,并設(shè)置代理 [[EMClientsharedClient].chatManageraddDelegate:selfdelegateQueue:nil]; ,這個時候如果有消息來了碑韵,就會走消息的回調(diào)方法赡茸,在方法里面刷新界面即可。 下面的 refreshAndSortView 方法是刷新內(nèi)存中的消息
3.最后一條消息的顯示格式:在你的控制器里面添加下面代碼 :
- (NSAttributedString*)conversationListViewController:(EaseConversationListViewController*)conversationListViewController
latestMessageTitleForConversationModel:(id)conversationModel
{
NSString*latestMessageTitle =@"";
EMMessage*lastMessage = [conversationModel.conversationlatestMessage];
if(lastMessage) {
EMMessageBody*messageBody = lastMessage.body;
switch(messageBody.type) {
caseEMMessageBodyTypeImage:{
latestMessageTitle =@"[圖片]";
}break;
caseEMMessageBodyTypeText:{
//表情映射占卧。
NSString*didReceiveText = [EaseConvertToCommonEmoticonsHelper
convertToSystemEmoticons:((EMTextMessageBody*)messageBody).text];
latestMessageTitle = didReceiveText;
if([lastMessage.extobjectForKey:MESSAGE_ATTR_IS_BIG_EXPRESSION]) {
latestMessageTitle =@"[動畫表情]";
}
}break;
caseEMMessageBodyTypeVoice:{
latestMessageTitle =@"[音頻]";
}break;
caseEMMessageBodyTypeLocation: {
latestMessageTitle =@"[位置]";
}break;
caseEMMessageBodyTypeVideo: {
latestMessageTitle =@"[視頻]";
}break;
caseEMMessageBodyTypeFile: {
latestMessageTitle =@"[文件]";
}break;
default: {
}break;
}
}
NSMutableAttributedString*attStr = [[NSMutableAttributedStringalloc]initWithString:latestMessageTitle];
returnattStr;
}
3.如果需要加搜索功能的話,就去官方的demo里面 拷貝以下文件:
在控制器里面遵守 EMSearchControllerDelegate協(xié)議联喘,把demo里面的這三個方法里面的東西拷貝過來华蜒,刪減掉一些不需要的代碼就行了
4.會話列表點擊事件:
四、聊天功能
1.新建一個控制器豁遭,繼承 EaseMessageViewController 叭喜,遵守EaseMessageViewControllerDelegate、EaseMessageViewControllerDataSource協(xié)議蓖谢,設(shè)置delegate和dataSource 即可
2.刪除底部更多菜單按鈕捂蕴,如果你不需要里面的視頻通話、語音通話等功能的話蜈抓,可以刪除按鈕
當然启绰,你也可以自己添加按鈕并設(shè)置圖片。甚至可以去掉環(huán)信自帶的更多菜單沟使,添加自己自定義的委可。相信大多數(shù)人還是不要自定義的,這里就不把添加按鈕和設(shè)置自定義更多菜單的方法贅述了腊嗡,需要的可以去官方文檔查看着倾,那里有詳細的講解。
3.如果在聊天界面點擊頭像需要跳轉(zhuǎn)到該用戶的個人信息界面或者其他界面的話燕少,實現(xiàn)下面的方法添加跳轉(zhuǎn)的方法即可:
到此卡者,即時通訊的 會話列表和聊天功能就已經(jīng)實現(xiàn)了,就是一些UI 細節(jié)的調(diào)整了客们,比如崇决,頭像設(shè)置成自己的用戶體系的頭像材诽,昵稱設(shè)置成自己用戶體系的昵稱,下面我們來講講怎么實現(xiàn)頭像和昵稱的設(shè)置
五恒傻、昵稱和頭像的設(shè)置
1.先簡述下設(shè)置昵稱和頭像功能的實現(xiàn)方式:在用戶發(fā)送消息的時候脸侥,在消息里面添加一些擴展消息,以此將消息發(fā)送者的昵稱和頭像附帶在消息里面發(fā)送過去盈厘,接受消息的人睁枕,通過消息里面的擴展消息(也就是昵稱和頭像)來將昵稱和頭像設(shè)置到界面上。
2.先找到發(fā)消息的方法沸手,在發(fā)消息方法里面加擴展消息就可以不需要每次都去調(diào)他的發(fā)消息方法把擴展消息附帶出去外遇。所以,在環(huán)信的 EaseMessageViewController 里面的_sendMessage:方法里將發(fā)消息者的昵稱和頭像附帶在擴展消息里面契吉。 順便提一下:不管是發(fā)送文本消息還是圖片消息跳仿,語音消息都是會走該方法的。所以在登錄的時候應(yīng)該調(diào)你們項目中獲取個人信息的接口栅隐,將昵稱和頭像存儲起來塔嬉,并且在跟換頭像和昵稱地方跟新存儲的昵稱和頭像玩徊。
3.然后再聊天控制器里面實現(xiàn)下面的方法租悄,將昵稱和頭像顯示出來
4.會話列表設(shè)置昵稱和頭像,需要注意的是恩袱,在用戶第一次和某個人聊天發(fā)消息的時候泣棋,在會話列表是無法從消息擴展里面拿到發(fā)給消息的那個人的昵稱和頭像的,所以你需要存儲聊天對象的昵稱和頭像畔塔,在你點擊進入聊天頁面的時候潭辈。
到此,昵稱和頭像我們就已經(jīng)可以設(shè)置完成了。
六、自定義聊天Cell
1.新建UITableViewCell文件蛔垢,繼承 EaseBaseMessageCell 闹啦。為了方便閱讀者閱讀無障礙,筆者就將自定義cell的所有代碼 以截圖的形式講解远舅。
2.設(shè)置緩存cell的標識符,并添加子控件。
3.設(shè)置氣泡和頭像
4.添加子控件
5.在氣泡里面添加label 以顯示消息
6.跟新氣泡約束柏副,設(shè)置氣泡的frmae
到此蚣录,自定義cell 就已經(jīng)全部完成了割择。下面是在聊天控制器里面添加自定義cell和計算高度
7.添加自定義的cell,如果是部分顯示自定義的cell,部分是不需要顯示自定的cell的時候萎河,可以根據(jù)擴展消息來判斷
8.設(shè)置cell的高度
到此荔泳,自定義cell并顯示自定義cell的功能已完成
七蕉饼、遠程推送和本地通知
1.首先需要知道的是:只有在app殺死的時候才會走遠程推送,其他時候走本地通知玛歌。也就是說椎椰,app在后臺的時候是走本地通知的,app在被用戶殺死的時候才會走遠程推送沾鳄。
2.遠程推送(這里就講一些細節(jié)注意點慨飘,代碼的話,可以去拷貝官方demo译荞,不管是遠程推送還是本地通知都寫的很清晰明了):
(1)app在沒有被殺死的時候瓤的,收到遠程推送,在- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo有回調(diào)吞歼,如果app被殺死了用戶是點擊了通知啟動程序的是不會走上面的 didReceiveRemote......方法的而是走- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions圈膏,所以你需要在該方法里面根據(jù)launchOptions里面是否有UIApplicationLaunchOptionsRemoteNotificationKey 這個key來判斷是不是收到了遠程推送點擊通知啟動程序的,然后在里面添加跳轉(zhuǎn)代碼篙骡,如:
(2)遠程推送APNs需要配置推送證書稽坤,可以參考官方文檔來配置,制作推送證書文檔地址:制作推送證書
2.本地推送
(1)注冊本地通知:在application didFinishLaunchingWithOptions方法里面注冊本地通知糯俗,iOS 8以后需要自己注冊本地通知
(2)使用UNUserNotificationCenter發(fā)送本地通知需要注意這個方法是iOS 10 才有的方法尿褪,所以需要適配判斷,否則iOS 10以下系統(tǒng)的用戶會閃退得湘。
(3)關(guān)于接受到通知杖玲,用戶點擊通知啟動程序的回調(diào)看下面的截圖
如果文章中有什么錯誤或者更好的實現(xiàn)方式,歡迎各位留言指點淘正,謝謝~