一台设备由于用户的使用习惯差异,可能导致设备的时间和实际收发消息的时间不同,这里与大家分享利用anIM收发消息时,如何根据数据中的msgId和timestamp来进行排序。
实现逻辑
发消息时,我们需要调用anIM的sendMessage方法(同类方法还有sendBinary, sendMessageToTopic等等),这个方法有一个返回数据为messageId,即当前这一条聊天消息的唯一标识,我们需要将这个messageId保存下来。
以iOS代码为例:
//msgId是消息的唯一标识 NSString *msgId = [anIM sendMessage:message customData:customData toClients:clientId needReceiveACK:YES];
调用完sendMessage方法后,SDK会统一回调messageSent方法,这个方法里的输入参数在Android SDK中是AnIMMessageSentCallbackData,里面包含两个主要字段分别为String类型的msgId和long型的timestame,而在iOS SDK中是NSString类型的msgId和NSNumber类型的timestamp。
(void)anIM:(AnIM *)anIM messageSent:(NSString *)messageId at:(NSNumber *)timestamp { //messageId即调用sendMessage等方法时返回的消息唯一标识 //在这里根据messageId进行消息的判断,然后保存聊天消息数据到本地数据库 };
收消息时,对不同类型的消息,会执行不同的方法,不管是哪个方法,方法的输入参数里都会有2个和发消息时同样的字段msgId和timestamp。
(void)anIM:(AnIM *)anIM didReceiveMessage:(NSString *)message customData:(NSDictionary *)customData from:(NSString *)from parties:(NSSet *)parties messageId:(NSString *)messageId at:(NSNumber *)timestamp { //messageId即对方发送消息时的消息唯一标识 }
timestamp是13位的时间戳格式,都是从服务器返回的,而不是设备本地产生的,这样就避免了因为用户本身的使用习惯而导致收发消息时的顺序错乱了。最后,根据timestamp字段进行排序,但是别忘了界面显示时需要转换一下。
如何在App中实现IM功能系列文章:
之一离线消息常见浅析
之二快速实现离线消息模块
之三快速实现离线消息推送模块
之四创建稳健的消息发送模块
之五快速实现图片接收和发送
之六快速实现群聊的高级功能
之七快速实现聊天列表排序模块