iOS

iOS 将环信历史消息保存到本地

2017-05-15  本文已影响69人  小神仙

直入主题,环信提供了即时通信的一个通道,并不会保存用户的聊天记录也不提供相关接口,如果付费可以从服务端获取聊天记录,前端是无法直接获取的。那么问题来了,用户切换设备之后聊天记录将无法看到(微信也是这样做的),但偏偏项目中要实现聊天记录的同步就需要开发者费点脑筋了。

环信在发送消息和接收消息成功后会将聊天记录自动保存到本地,并且直接从本地读取聊天记录显示在界面上。那么我们要做的就只有两步:从接口获取聊天记录,以标准格式保存到本地,然后调用刷新方法就可以实现聊天记录的显示了(环信会自动以时间顺序显示)。

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不同,可根据文档自行配置。

补充的相关技术点链接:

构造各种类型的消息,并保存本地

自定义消息cell定制

上一篇下一篇

猜你喜欢

热点阅读