今天突然好奇撤回功能是怎么实现的,因此查阅了一些资料。
其中,有一篇资料详细的解说了微信撤回功能的实现,在此复述一下。
微信的每一条消息,即我们所发出的消息中会自带UniqueMsgID,据说这个消息ID是全球唯一的ID(全球唯一的消息ID其实不难哈,可以通过时间戳+发送者ID+接受者ID,由于发送者ID与接受者ID的长度也是不一致的,因此消息ID也是完全不一样的,包括长度也有可能是不一样的。以上纯属个人YY)。因此,发送消息实质上会发送两个内容,即消息体+UniqueMsgID。用户A发送了一条消息给用户B,思虑一番感觉有不合适的地方,决定撤回消息,长按选择撤回功能,撤回功能被触发,用户A手机端给服务器发送了UniqueMsgID,服务器要对比一下时间戳,是不是超过了两分钟,超过了就不再转发该指令,而是返回一条消息给用户A;要是没有超过两分钟,服务器转发指令到用户B手机端,比对了UniqueMsgID,获取了要撤回的消息之后就实现撤回的效果...下面是一张盗来的图...
说到这里,大致的逻辑已经出来了,但是我似乎还有没弄懂的地方hhh,用户B手机端接收到了指令是如何执行“撤回”效果的?在UI上对该消息进行隐藏并且替换成“对方撤回了一条消息”吗?emmm,明天问一下做开发的同事好了hhh。
我所看的文章后面还有提及,撤回的时间长度为啥是两分钟,我感觉分析得比较有道理,两分钟之内尚未查看消息的可能性是比较大的,随着时间长度的增加,消息被阅读的可能性则更大,如果对方已经看到了消息而自己还执行了撤回操作,可能会尴尬...其实2分钟之内,消息被阅读的可能性也很大,这个时间长度的选取,是不是有大数据的功劳在呢...
关于撤回了消息还留下了痕迹,即:对方撤回了一条消息,有很多人好奇:既然都执行了撤回,为什么不毫无痕迹的撤回还要留下这么一句话呢,有解读说比起发送者,产品更注重阅读者的用户体验~与此同时,撤回消息如果没有痕迹的话,会破坏上下文的完整性,这个解读我还是很赞同的。
用户体验的重要性已经深入人心了,在此我只想说,用户体验至上的产品,请在给我来一打!对鹅厂的喜爱一天比一天严重。