最近項目結束了很無聊,想起一直看別人的技術貼自己還不曾寫過什么東西,就打算寫篇文章。思前想后覺得本人沒啥技術(誒、、、這才是真正的碼農Y(^_^)Y)但是又想寫點什么。所以就把集成環(huán)信遇到的一些問題寫出來和大家分享。
下面開始 ?思路有點混亂(畢竟是菜雞、、、)大家見諒
1.聊天界面中不想要紅包、分享位置、視頻等功能怎辦?
在EaseChatBarMoreView.m中你就可以看到相關的代碼(命名很直白相信小伙伴們都能看的明白)
2.監(jiān)聽好友申請
EMContactManagerDelegate這個代理方法中有各種監(jiān)聽的方法即看即用(別忘了遵守協(xié)議0哦)。最好的跟控制器寫。
在獲取當前有幾個好友請求通知的時候可能或出現(xiàn)問題如下方法即可()
- (void)didReceiveFriendInvitationFromUsername:(NSString *)aUsername
message:(NSString *)aMessage{
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:@{@"title":aUsername, @"username":aUsername, @"applyMessage":aMessage, @"applyStyle":[NSNumber numberWithInteger:ApplyStyleFriend]}];
[[ApplyViewController shareController] addNewApply:dic];
[self reloadApplyView];
}
3、軟件集成環(huán)信之后退到后臺三分鐘左右被殺死
解決很簡單就是在軟件進入后臺、進入前臺中不要操作環(huán)信的方法。目前我去掉沒什么影響
[[EMClient sharedClient] applicationDidEnterBackground:application];
當時我就是按照環(huán)信文檔寫的,這個比較坑。
4、統(tǒng)計消息未讀數(shù)
統(tǒng)計消息未讀數(shù)
for (EMConversation *conversation in conversations) {
unreadCount += conversation.unreadMessagesCount;
}
這個要和實時監(jiān)聽收到消息的監(jiān)聽方法一起用 是在EMChatManagerDelegate代理方法中
- (void)didReceiveMessages:(NSArray *)aMessages
{}
5、環(huán)信的推送
環(huán)信的推送分為倆種,本地推送、離線推送。集成環(huán)信后,當app推到后臺沒被殺死的時候,接收消息會走本地推送,很多開發(fā)者誤以為這時候走APNs,其實這時候app長連接未斷開,調用蘋果的本地通知即可。
本地推送方法傳送門
環(huán)信接收消息本地推送的實現(xiàn) - EaseMob.沈沖 - 博客頻道 - CSDN.NET
APNs參考開發(fā)文檔即可,
做好推送了你會發(fā)現(xiàn)收到的推送消息是”您有一條新消息“而不是我們想要顯示的消息內容,設置如下即可
EMPushOptions *pushOptions = [[EMClient sharedClient] pushOptions];
pushOptions.displayStyle = EMPushDisplayStyleMessageSummary;
[[EMClient sharedClient] updatePushOptionsToServer];
[[EMClient sharedClient] initializeSDKWithOptions:options];
6、利用環(huán)信做單點登錄
調用如下方法即可
/*!
*? \~chinese
*? 當前登錄賬號在其它設備登錄時會接收到該回調
*
*? \~english
*? Current login account to log in on other devices will receive the callback
*/
- (void)didLoginFromOtherDevice;
7、設置群組會話名稱
在創(chuàng)建群組后再會話列表看到的可能是此群組的ID并不是群組的名稱。
解決辦法是在EaseConversationListViewController.m文件中的tableViewDidTriggerHeaderRefresh方法中對model進行判斷賦值代碼如下
//設置群組的會話名稱
if (model.conversation.type == EMConversationTypeGroupChat) {
NSArray *groupArray = [[EMClient sharedClient].groupManager getAllGroups];
for (EMGroup *group in groupArray) {
if ([group.groupId isEqualToString:converstion.conversationId]) {
model.title = group.subject;
}
}
}
8、設置用戶的頭像、昵稱
環(huán)信并未保存用戶的頭像、昵稱所以這里要我們自己處理,相信支持各位看官看下來的動力(了解如何設置用戶頭像、昵稱)就是這個吧。
環(huán)信為我們提供了倆種解決方案并詳細的說明了各自的優(yōu)缺點。這里我使用的是方法一:從APP服務器獲取昵稱和頭像
昵稱和頭像的顯示與更新 [環(huán)信開發(fā)文檔]
使用這種辦法的必要條件是自己用戶體系的某個字段(可以標識用戶的唯一性)必須與環(huán)信的用戶id保持一致。這樣我們才能拿到該用戶存在在我們服務器上的昵稱、頭像及各種信息。
為了節(jié)省用戶的流量我們應該做一個本地數(shù)據庫,獲取環(huán)信用戶id現(xiàn)在本地數(shù)據庫查詢,有即使用、無即下載保存本地數(shù)據庫在使用。
說了辣么多廢話,下面我們來點實際的
a、設置會話列表單聊的頭像、名稱
與設置群組聊天的會話名稱一樣在EaseConversationListViewController.m文件中的tableViewDidTriggerHeaderRefresh方法中對model進行判斷賦值代碼如下
if (model.conversation.type == EMConversationTypeChat) {
//數(shù)據庫查詢數(shù)據賦值
[[BGFMDB intance]queryWithTableName:TableName keys:nil where:@[@"loginName",@"=",String(converstion.conversationId)] complete:^(NSArray *array) {
model.title = array[0][@"nickName"];
model.avatarURLPath =[NSString stringWithFormat:@"%@%@",PhotoUrl,array[0][@"iconUrl"]];
}];
}
b、設置聊天界面(單聊、群聊)的頭像、昵稱
在EaseBaseMessageCell.m文件中的- (void)setModel:(id)model方法中對model進行判斷賦值代碼如下
[super setModel:model];
//消息來自哪個人 用這個id查詢數(shù)據困
NSLog(@"%@",model.message.from);
[[BGFMDB intance] queryWithTableName:TableName keys:nil where:@[@"loginName",@"=",String(model.message.from)] complete:^(NSArray *array) {
if (array[0][@"iconUrl"]) {
[self.avatarView sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",PhotoUrl,array[0][@"iconUrl"]]] placeholderImage:model.avatarImage];
} else {
self.avatarView.image = model.avatarImage;
}
_nameLabel.text = array[0][@"nickName"];
if (self.model.isSender) {
注:如果完成后如果出現(xiàn)用A號跟B號聊天? 什么都正常,但是換C號,D號跟B號聊天顯示的都是A號的名、聊天記錄都是A,B的話。極有可能就是用戶退出的時候在環(huán)信的服務上沒有正常的退出,在用戶退出的時候點用環(huán)信的退出即可
本人菜雞一個寫下這個:一是為了幫助像我這樣的小白。二是好記性不如爛筆頭(爛筆頭都買不起)就寫在這里。有什么不對的請指教!勿噴?。?!