一穷当、環(huán)信SDK的集
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 文件里,你導的頭文件 不是包在 #ifdef OBJC #endif 里面
到此孤钦,如果你是嚴格按照官方文檔的步驟一步不落的集成的話歧斟,應該是不會有什么問題的纯丸,是可以正常編譯運行的。
二静袖、賬號的登錄
1.看你們項目的要求觉鼻,筆者是在自己app登錄的時候,也把環(huán)信賬號登錄(登錄的用戶名和密碼規(guī)則看你們后臺是怎么配置的)队橙。環(huán)信SDK是有自動登錄的功能的坠陈,所以盡管用戶殺死app后,再次啟動app時捐康,不需要再次進入登錄界面再次登錄仇矾。
BOOL isAutoLogin = [EMClient sharedClient].options.isAutoLogin;
if (!isAutoLogin) {
EMError *error = [[EMClient sharedClient] loginWithUsername:HPString(@"%@",[InfoManage getEMLoginname]) password:HPString(@"%@",[InfoManage getEMPwd])];
if (!error) {
Dlog(@"環(huán)信登錄成功");
[[EMClient sharedClient] setApnsNickname:[InfoManage getNickname]];
EMPushOptions *emoptions = [[EMClient sharedClient] pushOptions];
//設置有消息過來時的顯示方式:1.顯示收到一條消息 2.顯示具體消息內(nèi)容.
//自己可以測試下
emoptions.displayStyle = EMPushDisplayStyleSimpleBanner;
[[EMClient sharedClient] updatePushOptionsToServer];
[[EMClient sharedClient].chatManager addDelegate:self delegateQueue:nil];
[[EMClient sharedClient].groupManager addDelegate:self delegateQueue:nil];
[self getUnreadMessage];
} else {
Dlog(@"【環(huán)信錯誤】%d == %@",error.code,error.errorDescription);
}
} else {
Dlog(@"已自動登錄");
}
2.賬號登錄的異常情況,比如說這個環(huán)信賬號在別的地方登錄了解总,那么就會出現(xiàn)登錄失效贮匕,鏈接不到服務器的情況。這個時候環(huán)信提供了方法和屬性來判斷花枫。 這屬性和方法的回調(diào)是在EMClientDelegate協(xié)議里面的刻盐,在你的控制器里面遵守協(xié)議就可以
三、會話列表
1.集成會話列表功能也十分簡單的劳翰,首先新建一個控制器繼承 EaseConversationListViewController敦锌,在viewDidLoad里面 設置delegate和dataSource遵守EaseConversationListViewControllerDelegate、EaseConversationListViewControllerDataSource協(xié)議磕道,并加上 [self tableViewDidTriggerHeaderRefresh]; 這句代碼(首次進入刷新數(shù)據(jù))供屉。
2.會話列表實時顯示未讀消息。也就是說在會話列表界面的時候溺蕉,有人發(fā)消息過來了伶丐,發(fā)消息來的那個人的頭像要有一個紅色的數(shù)字,并顯示未讀消息數(shù)量疯特,想要這個功能的話哗魂,就要遵守EMChatManagerDelegate 協(xié)議,并設置代理 [[EMClientsharedClient].chatManageraddDelegate:selfdelegateQueue:nil]; 漓雅,這個時候如果有消息來了录别,就會走消息的回調(diào)方法,在方法里面刷新界面即可邻吞。 下面的 refreshAndSortView 方法是刷新內(nèi)存中的消息
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
Dlog(@"%@",self.dataArray);
[self.navigationController.navigationBar setBarTintColor:HB_ThemeColor];
[self tableViewDidTriggerHeaderRefresh];
self.showRefreshHeader = YES;
}
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é)議,設置delegate和dataSource 即可
2.刪除底部更多菜單按鈕边翼,如果你不需要里面的視頻通話鱼响、語音通話等功能的話,可以刪除按鈕
當然组底,你也可以自己添加按鈕并設置圖片丈积。甚至可以去掉環(huán)信自帶的更多菜單,添加自己自定義的债鸡。相信大多數(shù)人還是不要自定義的桶癣,這里就不把添加按鈕和設置自定義更多菜單的方法贅述了,需要的可以去官方文檔查看娘锁,那里有詳細的講解牙寞。
3.如果在聊天界面點擊頭像需要跳轉(zhuǎn)到該用戶的個人信息界面或者其他界面的話,實現(xiàn)下面的方法添加跳轉(zhuǎn)的方法即可:
到此莫秆,即時通訊的 會話列表和聊天功能就已經(jīng)實現(xiàn)了间雀,就是一些UI 細節(jié)的調(diào)整了,比如镊屎,頭像設置成自己的用戶體系的頭像惹挟,昵稱設置成自己用戶體系的昵稱,下面我們來講講怎么實現(xiàn)頭像和昵稱的設置
五缝驳、昵稱和頭像的設置
1.先簡述下設置昵稱和頭像功能的實現(xiàn)方式:在用戶發(fā)送消息的時候连锯,在消息里面添加一些擴展消息,以此將消息發(fā)送者的昵稱和頭像附帶在消息里面發(fā)送過去用狱,接受消息的人运怖,通過消息里面的擴展消息(也就是昵稱和頭像)來將昵稱和頭像設置到界面上。
2.先找到發(fā)消息的方法夏伊,在發(fā)消息方法里面加擴展消息就可以不需要每次都去調(diào)他的發(fā)消息方法把擴展消息附帶出去摇展。所以,在環(huán)信的 EaseMessageViewController 里面的_sendMessage:方法里將發(fā)消息者的昵稱和頭像附帶在擴展消息里面溺忧。 順便提一下:不管是發(fā)送文本消息還是圖片消息咏连,語音消息都是會走該方法的。所以在登錄的時候應該調(diào)你們項目中獲取個人信息的接口鲁森,將昵稱和頭像存儲起來祟滴,并且在跟換頭像和昵稱地方跟新存儲的昵稱和頭像。
3.然后再聊天控制器里面實現(xiàn)下面的方法歌溉,將昵稱和頭像顯示出來
4.會話列表設置昵稱和頭像垄懂,需要注意的是,在用戶第一次和某個人聊天發(fā)消息的時候,在會話列表是無法從消息擴展里面拿到發(fā)給消息的那個人的昵稱和頭像的埠偿,所以你需要存儲聊天對象的昵稱和頭像,在你點擊進入聊天頁面的時候榜晦。
到此冠蒋,昵稱和頭像我們就已經(jīng)可以設置完成了。
當然數(shù)據(jù)庫就自己建立就好了,這里就不做講解
六乾胶、自定義聊天Cell
1.新建UITableViewCell文件抖剿,繼承 EaseBaseMessageCell 。為了方便閱讀者閱讀無障礙识窿,筆者就將自定義cell的所有代碼 以截圖的形式講解斩郎。
2.設置緩存cell的標識符,并添加子控件喻频。
3.設置氣泡和頭像
4.添加子控件
5.在氣泡里面添加label 以顯示消息
6.跟新氣泡約束缩宜,設置氣泡的frame
到此甥温,自定義cell 就已經(jīng)全部完成了锻煌。下面是在聊天控制器里面添加自定義cell和計算高度
7.添加自定義的cell,如果是部分顯示自定義的cell,部分是不需要顯示自定的cell的時候姻蚓,可以根據(jù)擴展消息來判斷
8.設置cell的高度
到此宋梧,自定義cell并顯示自定義cell的功能已完成