之前公司集成環(huán)信聊天SDK,在聊天室開發(fā)開發(fā)過程中歷史聊天記錄獲取卡了一點(diǎn)時(shí)間,現(xiàn)在將歷史聊天記錄的開發(fā)方法簡(jiǎn)單的記錄一下,分享給大家

第一步:服務(wù)端獲取環(huán)信聊天記錄,提供接口返回?cái)?shù)據(jù)
第二步:前端做消息類型判斷,做處理
盡量將代碼修改的很通俗易懂,大神不要噴,簡(jiǎn)單的東西容易理解,也是摸索中總結(jié)出來的
一:
服務(wù)端提供的查詢接口,需要提供一些參數(shù),以我的項(xiàng)目為例,有三個(gè)參,最重要的是一個(gè)分頁(yè)字符,初次提供為一個(gè)空的字符串
所以在viewDidLoad 里的賦予一個(gè)記錄分頁(yè)的字符串為空值,
記錄:cursorStr = @"";
請(qǐng)求:[self getInfoMoreMeassageRquest];
請(qǐng)求后,服務(wù)端返回的json數(shù)據(jù)大致如下:
{
action = get;
count = 50;
cursor = MTYxOTcyOTYyNTpnR2tBQVFNQWdHa0FCZ0ZUOU1SOWF3Q0FkUUFRVHg5dzZ2MWJFZVd2Rk9NRXJhdmxCQUNBZFFBUVR4OXc0UDFiRWVXMVBSR1FSeERuOXdB;
duration = 3990;
entities =? ? (
{
"chat_type" = groupchat;
created = 1460513153714;
from = 100000013;
groupId = 135220650137616892;
modified = 1460513153714;
"msg_id" = 184461770679649224;
payload =? ? ? ? ? ? {
bodies =? ? ? ? ? ? ? ? (
{
msg = "\U5fae\U7b11\U30fb\U00b0\U9633\U5149\U52a0\U5165\U804a\U5929\U5ba4";
type = txt;
}
);
ext =? ? ? ? ? ? ? ? {
"dasgang_type" = 0;
friendHeaderImage = "";
headurl = "http://chenggua.com/imagesUrl/20160407/201604070957593310.png";
"is_dashang" = 0;
"is_join_notice" = 1;
nickName = "\U5fae\U7b11\U30fb\U00b0\U9633\U5149";
roleName = "\U4f1a\U957f";
sex = 1;
userid = 100000013;
wealthGrade = 1;
};
};
timestamp = 1460513152817;
to = 135220650137616892;
type = chatmessage;
uuid = "40ac892a-011c-11e6-b8d6-89c365e78de2";
},
params =? ? {
cursor =? ? ? ? (
""
);
limit =? ? ? ? (
50
);
ql =? ? ? ? (
"select * where to='135220650137616892' order by timestamp desc "
);
};
path = "/chatmessages";
timestamp = 1460518366731;
uri = "http://a1.easemob.com/daowen/chenggua/chatmessages";
}
可以看到返回的數(shù)據(jù)里包含一個(gè)cursor = MTYxOTcyOTYyNTpnR2tBQVFNQWdHa0FCZ0ZUOU1SOWF3Q0FkUUFRVHg5dzZ2MWJFZVd2Rk9NRXJhdmxCQUNBZFFBUVR4OXc0UDFiRWVXMVBSR1FSeERuOXdB;
這個(gè)分頁(yè)就是再次下拉的時(shí)候,加載第二頁(yè)數(shù)據(jù)的時(shí)候需要提交到服務(wù)端請(qǐng)求
所以在請(qǐng)求中將此字符串賦值給 之前定義的記錄字符串
cursorStr=jsonData[@"cursor"];
需要注意的是,如果聊天記錄加載完畢之后,cursor會(huì)返回為空,所以在slimeRefresh delegate做了一下判斷
if (_conversationType == eConversationTypeChatRoom){//這里我是判斷聊天室才要?dú)v史記錄,單聊不需要,可以忽略不管
if ([self isBlankString:cursorStr]) {//這個(gè)方法是判斷是否為空
[_slimeView endRefresh];
return;
}else{
[self getInfoMoreMeassageRquest];
}
-----------------判斷字符竄是否為空的方法
- (BOOL) isBlankString:(NSString *)string {
if (string == nil || string == NULL) {
return YES;
}
if ([string isKindOfClass:[NSNull class]]) {
return YES;
}
if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]==0) {
return YES;
}
return NO;
}
以上就是請(qǐng)求歷史聊天記錄部分
二:根據(jù)返回?cái)?shù)據(jù)的消息類型做處理
簡(jiǎn)單的說就是根據(jù)不同的消息類型構(gòu)建消息,然后插入到數(shù)據(jù)庫(kù)就好了,直接上代碼,我做了四中消息類型的判斷,是可以直接復(fù)制拿去用的,:純文字、圖片、錄音、地圖位置
cursorStr=jsonData[@"cursor"];
NSMutableArray * arr=jsonData[@"entities"];
for (NSDictionary * dicc in arr) {
NSArray * xiaoxiArr = [NSArray arrayWithArray:dicc [@"payload"][@"bodies"]];
if ([[xiaoxiArr lastObject][@"type"]isEqualToString:@"txt"]) {//純文字
EMChatText *chatText = [[EMChatText alloc] initWithText:[xiaoxiArr lastObject][@"msg"]];
EMTextMessageBody *textBody = [[EMTextMessageBody alloc] initWithChatObject:chatText];
EMMessage * message = [[EMMessage alloc]initMessageWithID:dicc[@"msg_id"] sender:dicc[@"from"] receiver:_conversation.chatter bodies:@[textBody]];
message.isRead = YES;
message.deliveryState = eMessageDeliveryState_Delivered;
message.ext = dicc [@"payload"][@"ext"];
message.messageType = eMessageTypeChatRoom;
message.timestamp = [dicc [@"timestamp"] longLongValue];
[[EaseMob sharedInstance].chatManager insertMessageToDB:message append2Chat:YES];
}else if ([[xiaoxiArr lastObject][@"type"]isEqualToString:@"img"]){//圖片
NSDictionary * diccSize = [xiaoxiArr lastObject][@"size"];
NSDictionary *imageDic = @{EMMessageBodyAttrKeySecret:[xiaoxiArr lastObject][@"secret"],
EMMessageBodyAttrKeySize:@{EMMessageBodyAttrKeySizeWidth:[NSNumber numberWithFloat:[diccSize[@"width"] floatValue]],EMMessageBodyAttrKeySizeHeight:[NSNumber numberWithFloat:[diccSize[@"height"] floatValue]]},
EMMessageBodyAttrKeyFileName:@"image.jpg",
EMMessageBodyAttrKeyType:EMMessageBodyAttrTypeImag,
EMMessageBodyAttrKeyUrl:[xiaoxiArr lastObject][@"url"],
EMMessageBodyAttrKeyFileLength:[NSNumber numberWithInteger:[[xiaoxiArr lastObject][@"file_length"] integerValue]]};
EMImageMessageBody *imageBody = [EMImageMessageBody imageMessageBodyFromBodyDict:imageDic forChatter:_chatter];
EMMessage * image = [[EMMessage alloc]initMessageWithID:dicc[@"msg_id"] sender:dicc[@"from"] receiver:_conversation.chatter bodies:@[imageBody]];
image.timestamp = [dicc [@"timestamp"] longLongValue];
image.isReadAcked = YES;
image.messageType = eMessageTypeChatRoom;
image.deliveryState = eMessageDeliveryState_Delivered;
image.isRead = YES;
image.ext = dicc [@"payload"][@"ext"];
[[EaseMob sharedInstance].chatManager insertMessageToDB:image append2Chat:YES];
}else if ([[xiaoxiArr lastObject][@"type"]isEqualToString:@"audio"]){//音頻
NSDictionary *voiceDic = @{EMMessageBodyAttrKeySecret:[xiaoxiArr lastObject][@"secret"],
EMMessageBodyAttrKeyFileName:[xiaoxiArr lastObject][@"filename"],
EMMessageBodyAttrKeyDuration:[NSNumber numberWithInteger:[[xiaoxiArr lastObject][@"length"] integerValue]],
EMMessageBodyAttrKeyType:EMMessageBodyAttrTypeAudio,
EMMessageBodyAttrKeyUrl:[xiaoxiArr lastObject][@"url"],
EMMessageBodyAttrKeyFileLength:@8870};
EMVoiceMessageBody *voiceBody = [EMVoiceMessageBody voiceMessageBodyFromBodyDict:voiceDic forChatter:_chatter];
EMMessage *voice = [[EMMessage alloc] initMessageWithID:dicc[@"msg_id"] sender:dicc[@"from"] receiver:_conversation.chatter bodies:@[voiceBody]];
voice.timestamp = [dicc [@"timestamp"] longLongValue];
voice.isReadAcked = YES;
voice.deliveryState = eMessageDeliveryState_Delivered;
voice.isRead = YES;
voice.ext = dicc [@"payload"][@"ext"];
voice.messageType = eMessageTypeChatRoom;
[[EaseMob sharedInstance].chatManager insertMessageToDB:voice append2Chat:YES];
}
else if ([[xiaoxiArr lastObject][@"type"]isEqualToString:@"loc"]){//地理位置
EMChatLocation * location? = [[EMChatLocation alloc]initWithLatitude:[[xiaoxiArr lastObject][@"lat"] doubleValue] longitude:[[xiaoxiArr lastObject][@"lng"] doubleValue] address:[xiaoxiArr lastObject][@"addr"]];
EMLocationMessageBody * locBodiy = [[EMLocationMessageBody alloc]initWithChatObject:location];
EMMessage * loocc = [[EMMessage alloc]initMessageWithID:dicc[@"msg_id"] sender:dicc[@"from"] receiver:_conversation.chatter bodies:@[locBodiy]];
loocc.timestamp = [dicc [@"timestamp"] longLongValue];
loocc.isReadAcked = YES;
loocc.ext = dicc [@"payload"][@"ext"];
loocc.isRead = YES;
loocc.messageType = eMessageTypeChatRoom;
[[EaseMob sharedInstance].chatManager insertMessageToDB:loocc append2Chat:YES];
}
}
簡(jiǎn)單的小需求,對(duì)于第一次做環(huán)信的小白來說應(yīng)該有些幫助,堆字水平不咋地,還希望大家多多溝通,共同交流