最近项目结束了很无聊,想起一直看别人的技术贴自己还不曾写过什么东西,就打算写篇文章。思前想后觉得本人没啥技术(诶、、、这才是真正的码农Y(^_^)Y)但是又想写点什么。所以就把集成环信遇到的一些问题写出来和大家分享。
下面开始 思路有点混乱(毕竟是菜鸡、、、)大家见谅
1.聊天界面中不想要红包、分享位置、视频等功能怎办?
在EaseChatBarMoreView.m中你就可以看到相关的代码(命名很直白相信小伙伴们都能看的明白)
2.监听好友申请
EMContactManagerDelegate这个代理方法中有各种监听的方法即看即用(别忘了遵守协议0哦)。最好的跟控制器写。
在获取当前有几个好友请求通知的时候可能或出现问题如下方法即可()
- (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、软件集成环信之后退到后台三分钟左右被杀死
解决很简单就是在软件进入后台、进入前台中不要操作环信的方法。目前我去掉没什么影响
[[EMClient sharedClient] applicationDidEnterBackground:application];
当时我就是按照环信文档写的,这个比较坑。
4、统计消息未读数
统计消息未读数
for (EMConversation *conversation in conversations) {
unreadCount += conversation.unreadMessagesCount;
}
这个要和实时监听收到消息的监听方法一起用 是在EMChatManagerDelegate代理方法中
- (void)didReceiveMessages:(NSArray *)aMessages
{}
5、环信的推送
环信的推送分为俩种,本地推送、离线推送。集成环信后,当app推到后台没被杀死的时候,接收消息会走本地推送,很多开发者误以为这时候走APNs,其实这时候app长连接未断开,调用苹果的本地通知即可。
本地推送方法传送门
环信接收消息本地推送的实现 - EaseMob.沈冲 - 博客频道 - CSDN.NET
APNs参考开发文档即可,
做好推送了你会发现收到的推送消息是”您有一条新消息“而不是我们想要显示的消息内容,设置如下即可
EMPushOptions *pushOptions = [[EMClient sharedClient] pushOptions];
pushOptions.displayStyle = EMPushDisplayStyleMessageSummary;
[[EMClient sharedClient] updatePushOptionsToServer];
[[EMClient sharedClient] initializeSDKWithOptions:options];
6、利用环信做单点登录
调用如下方法即可
/*!
* \~chinese
* 当前登录账号在其它设备登录时会接收到该回调
*
* \~english
* Current login account to log in on other devices will receive the callback
*/
- (void)didLoginFromOtherDevice;
7、设置群组会话名称
在创建群组后再会话列表看到的可能是此群组的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、设置用户的头像、昵称
环信并未保存用户的头像、昵称所以这里要我们自己处理,相信支持各位看官看下来的动力(了解如何设置用户头像、昵称)就是这个吧。
环信为我们提供了俩种解决方案并详细的说明了各自的优缺点。这里我使用的是方法一:从APP服务器获取昵称和头像
使用这种办法的必要条件是自己用户体系的某个字段(可以标识用户的唯一性)必须与环信的用户id保持一致。这样我们才能拿到该用户存在在我们服务器上的昵称、头像及各种信息。
为了节省用户的流量我们应该做一个本地数据库,获取环信用户id现在本地数据库查询,有即使用、无即下载保存本地数据库在使用。
说了辣么多废话,下面我们来点实际的
a、设置会话列表单聊的头像、名称
与设置群组聊天的会话名称一样在EaseConversationListViewController.m文件中的tableViewDidTriggerHeaderRefresh方法中对model进行判断赋值代码如下
if (model.conversation.type == EMConversationTypeChat) {
//数据库查询数据赋值
[[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查询数据困
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) {
注:如果完成后如果出现用A号跟B号聊天 什么都正常,但是换C号,D号跟B号聊天显示的都是A号的名、聊天记录都是A,B的话。极有可能就是用户退出的时候在环信的服务上没有正常的退出,在用户退出的时候点用环信的退出即可
本人菜鸡一个写下这个:一是为了帮助像我这样的小白。二是好记性不如烂笔头(烂笔头都买不起)就写在这里。有什么不对的请指教!勿喷!!!