直入主题,环信提供了即时通信的一个通道,并不会保存用户的聊天记录也不提供相关接口,如果付费可以从服务端获取聊天记录,前端是无法直接获取的。那么问题来了,用户切换设备之后聊天记录将无法看到(微信也是这样做的),但偏偏项目中要实现聊天记录的同步就需要开发者费点脑筋了。
环信在发送消息和接收消息成功后会将聊天记录自动保存到本地,并且直接从本地读取聊天记录显示在界面上。那么我们要做的就只有两步:从接口获取聊天记录,以标准格式保存到本地,然后调用刷新方法就可以实现聊天记录的显示了(环信会自动以时间顺序显示)。
1、聊天记录数据获取
扩展消息字段Ext可以存放任何格式的数据,一些自定义的消息格式都会用到这个字段"ext": { //自定义扩展属性
"key1": "value1", //你设置的key和value的值
...
}
服务器端在接口中返回的数据格式最好按照以上格式返回,即使不按这个返回关键字段也不能有缺省。
2、聊天记录保存到本地
{
"msg_id": "5I02W-16-8278a", //消息ID
"timestamp": 1403099033211, //消息发送时间
"direction":"outgoing",
"to": "1402541206787", //接收人的username或者接收group的ID
"from": "zw123", //发送人username
"chat_type": "chat", //用来判断单聊还是群聊。chat: 单聊;groupchat: 群聊
"payload": {
"bodies": [ //消息bodies
{
//不同的消息类型,bodies数据格式见如下几条
}
],
"ext": { //自定义扩展属性
"key1": "value1", //你设置的key和value的值
...
},
"from":"zw123",
"to":"1402541206787"
}
}
NSMutableArray * arr=jsonData[@"entities"];
for (NSDictionary * dicc in arr) {
NSArray * xiaoxiArr = [NSArray arrayWithArray:dicc [@"payload"][@"bodies"]];
if ([[xiaoxiArr lastObject][@"type"]isEqualToString:@"txt"]) {//纯文字
EMTextMessageBody *textBody = [[EMTextMessageBody alloc] initWithText:[xiaoxiArr lastObject][@"msg"]];
EMMessage * message = [[EMMessage alloc] initWithConversationID:self.conversation.conversationId from:dicc[@"from"] to:dicc[@"to"] body:textBody ext:dicc [@"payload"][@"ext"]];
message.messageId = dicc[@"msg_id"];//消息ID,相同ID的消息不会被重复插入数据库
message.isRead = YES;//是否已读
message.status = EMMessageStatusSuccessed;//发送,接收状态 成功、失败
message.chatType = EMChatTypeGroupChat;//聊天类型 单聊、群聊、聊天室
if ([dicc[@"from"] isEqualToString:[SDHSDataCache getCustId]]) {
message.direction = EMMessageDirectionSend;//自己发送的,右侧显示
}else{
message.direction = EMMessageDirectionReceive;//他人发送的,左侧显示
}
message.timestamp = [dicc[@"timestamp"] longLongValue];
//插入消息
[[EMClient sharedClient].chatManager importMessages:@[message] completion:^(EMError *aError) {
}];
以上为纯文本格式的数据保存,其他格式的数据只是EMMessageBody不同,可根据文档自行配置。
补充的相关技术点链接: