iOS開發(fā)(環(huán)信及時(shí)通訊)-獲取聊天記錄

之前公司集成環(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)該有些幫助,堆字水平不咋地,還希望大家多多溝通,共同交流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容