前言
撤回消息,红包,昵称头像,输入状态提示
昵称和头像
昵称和头像的显示流程:
- a用户发一条消息给b
- b从服务器收到消息
- 本地有a用户的数据,直接显示
- 本地没有a用户的数据,向服务器请求a的数据,成功后显示
方法一:从服务器获取昵称和头像
获取:昵称和头像的获取:当收到一条消息(群消息),得到发送者的用户id,然后查找手机本地数据库是否有此用户的信息,如果没有就通过用户id查出来,然后进行本地数据缓存,下次用户来信息直接从本地缓存中抓取
更新:点击个人资料的时候更新数据缓存
方法二:从扩展中获取昵称和头像
获取:把用户的昵称和头像放到消息扩展中,通过消息发送给对方,并进行数据缓存,在聊天里面判断扩展字段显示,在会话列表取出最后一条消息判断扩展字段显示,第二次从数据缓存中读取
@property (nonatomic,copy) NSString *userId; //用户id(自己的用户id)
@property (nonatomic,copy) NSString *nickname; //昵称(自己的)
@property (nonatomic,copy) NSString *avatarUrl; //地址(自己的)
@property (nonatomic,copy) NSString *othernickname; //昵称(别人的或者群的)
@property (nonatomic,copy) NSString *otheravatarUrl; //头像地址(别人的或者群的)
@property (nonatomic,copy) NSString *otherUserId; //用户id(对方的用户id)
更新:当消息扩展里面的信息变化的时候更新数据缓存
撤回消息
用户A消息给用户B,用户a当需要撤回的时候,使用透传消息,将要撤回的消息id传给用户b,用户b搜到这条消息,将该id的消息从数据库中删除
- A用户发送消息
- A用户需要撤回某条消息,将消息id通过扩展消息发送到用户B
- B用户收到扩展消息,解析其中的messageid,从数据库删除对应消息
- 如果需要显示撤回的ui,则删除成功之后发送一条‘撤回消息’cell
- qq能撤回消息的限制是2分钟
@功能
分析
群组中,@某人的和群组普通消息没有区别,只是针对被@的用户在 UI 上显示会有不同。可以通过环信的扩展消息来实现。
流程
- 发送方将想要@的人的环信 ID 通过扩展字段放到扩展消息中,并把消息发到群里。
- 群中成员在收到消息时,先检查扩展字段中是否有对应的字段,如果有,取出其中的环信 ID。
- 检查取出的环信 ID 与当前登录的环信 ID 是否一致。
- 如果检测一致,需要在 UI 上做特殊处理,显示出对应的提示信息,如“[有人@我]“,如不一致,不做处理。
发送时
// @某些人
message.ext = @{@"em_at_list":@[@"6001",@"6002"]}; // @6001,6002
接受时
-(void)didReceiveMessages:(NSArray *)messages{
// 获取当前登录用户环信ID
NSString *currentUserId = [[[EaseMob sharedInstance].chatManager loginInfo] objectForKey: kSDKUsername];
// 被@用户环信ID
for(EMMessage *msg in messages){
NSArray *atList = [message.ext objectForKey:@"em_at_list"];
for (NSString *atName in atList) {
if (atName isEqualToString:currentUserId) {
// 当前用户被@,需要单独处理UI
}
}
}
}
红包流程
分析
主要分为发送红包,消息列表中的展示,检测是否被拆开,红包拆开(详情)界面,红包领取过后的红包领取消息
发送
A3268DCB2124C32899DB11229FCBDEEE.png
- 网络请求发送红包获取第三方支付的支付参数
- 调用第三方支付
- 成功后发送一条消息增加红包扩展字段
红包扩展字段
红包ID,文字内容,是否是红包,
请求红包参数
发送者的id,接受者的id,发送的金额(单位分),第三方平台类型,发送的内容
消息列表展示
BB5963F34C2321A0129FDF14BF586638.png
- 获取红包的扩展字段使用文本类型展示出来
点击红包
5E09D56439D2667925F19D3126B79E7F.png
- 通过红包ID和用户ID请求服务器红包详情
- 判断是不是发红包的用户,如果是发红包的用户直接进入详情
- 如果是接受红包的用户,根据返回的拆开状态判定
- 如果未拆开进行拆红包操作,如果已经拆开,直接进入红包详情
- 拆开红包之后要发送一条红包已经领取消息(自定义cell)
红包领取消息扩展字段
是否是领取红包,领取人的名字
红包详情
红包的状态
- 红包已过期
- 红包已抢完
- 红包不存在
- 红包已领取
- 红包已退还
- 自己不能拆自己的红白
- 红包未支付成功
- 红包未领取
显示出领取人的一些信息和自己的信息
输入状态提示
功能:输入状态提示,当A用户正在输入文字的时候,聊天的对方可以收到用户A正在输入的提示。
监听用户a的输入,一旦有文字输入,每隔几秒,将消息输入状态发送给b,b客户端收到消息的时候提示a正在输入消息
顺序:
- 用户a向用户b发送一条状态消息
- 用户b在收到消息的时候,判断当前是否在和a的聊天界面,如果在就显示输入状态
- 当隔了几秒没有收到a的状态消息,状态自动消失
注意:
- 两边需要约束时间间隔
- 这种消息不进行数据库的存储
环信的解决方案:
http://docs.easemob.com/im/490integrationcases/input-status