1.介绍

 

 我相信每个人都有过这样的经历:一个特殊的文本可以让iOS设备上的所有应用程序都回闪。不久前的元旦,一个印度角色再次出现,导致iOS11系统崩溃。幸运的是,对iOS版微信客户端的保护并没有造成太大问题(字符处理等技术问题实际上造成了安卓版微信的严重用户体验危机,有兴趣的人可以阅读文章《微信团队揭秘:微信界面卡住超级bug》15。。。。《前因后果》)。

 

 一般来说,特殊字符闪回是由系统漏洞引起的,只要系统被更新。然而,大多数用户不愿意更新系统,苹果可能不会尽快解决这个问题。此外,后台可以拦截恶意文本的传递,但后台不能删除本地发送的消息。因此,客户应该做一些保护,以防止特殊字符闪烁回来。

 

 

 最新消息:2018年9月底,微信团队正式开通MMKV组件解决方案,解决本文涉及的问题。源代码地址:https://github.com/Tencent/MMKV,中文描述:https://github.com/Tencent/MMKV/blob/master/readme_cn.md

 2.微信的理念

 

 因为不可能事先知道字符串包含特殊字符,所以只能先进行排版/绘制,看看是否有问题。该方法是在排版/绘制字符串之前设置标记位,并在排版/绘制之后移除标记位。

 

 一旦发现标志位存在,这意味着该字符串可能有问题,下次将不会显示该字符串:

 微信团队分享:iOS版本的微信如何防止由特殊字符引起的群体爆炸和应用崩溃?_1.png

 

 这里有几个问题:

 

 在排版/绘图过程中,其他线程可能会崩溃,导致标记位的异常删除。因此,有必要在崩溃时判断崩溃线程是否是排版/绘图线程。

 

 有多少次碰撞可以判断出这根绳子有问题?最早的做法是崩溃直接阻止它一次,但许多用户反馈说一些朋友的昵称不能显示。事实上,iOS绘制字符串的闪回概率很小,这导致了误判。但是,如果崩溃屏蔽它两次,如果用户连续收到N条恶意消息,那么崩溃可以完全屏蔽所有有问题的消息至少2n次。

 

 因此,第一个字符串崩溃不会首先被屏蔽,随后的字符串崩溃会被直接屏蔽。这样,崩溃可以被处理n+1次。

 3.特定的iOS代码实现

 

 就像第二部分的想法一样。整个逻辑代码大致如下。

 

 MessageItemView.mm:

 010203040506070809101121314151617//CP是CrashProtected @im实现消息项视图-(void)init content label { m _ label =[[mmcplabelalloc]init]的缩写;m _ label . CPKey =[MMCPutil GenerateKeyWithObject:self . MessageModel];如果{//消息模型消息的内容有问题,并且m_label.text = @“内容无法显示”被阻止;}否则{ m _ label . text = self . MessageModel . content;} } @结束

 

 

 MMCPLabel.mm:

 010203040506070809101112131415161718192021 @im实现MMCpLabel @ synthese CpKey = m _ CpKey;//检查常见的排版/绘图界面-(void)layoutublayersflayer:(calayer *)layer { cscopedcrash counter崩溃计数器(m _ cpkey);[超级layoutSublayersOfLayer:layer];} - (void)drawLayer:(CALayer *)层in ext:(CgContextRef)CTX { CscopedCrashCounter(m _ CpKey);[超级图层:文本中的图层:CTX];}-(CgSize)SiZeThatfits:(CgSize)SiZe { CscopedCrashCounter(m _ CpKey);返回[super SizeThatfits:size];} @结束

 

 

 MMCPUtil.mm:

 01020304050607080910112131415161718192021222224252627282930313233343536373940414244444464748495051525354556//使用C++特性。离开作用域时将执行析构函数。//因此,构造函数将执行crashCount+1,析构函数将执行crashcount-1类cscopedcrash counter { public:cscopedcrash counter(nsstring * cpkey){ m _ cpkey = cpkey;[MMcputil IncredenCerachCountWithKey:m _ CPKey];} ~ CScopedCrashCounter(){[MMcputil DecreaseCrashCountWithKey:m _ CPKey];}私人:NSString * m _ cpKey};@im实现MMcputil @ synthesis CrashKeyMemoryAppedkV = m _ CrashKeyMemoryAppedkV;//key @ synthese crashcountmorymappedkv = m _ crashcountmorymappedkv对应于恶意信息;//每个键的崩溃次数-(bool)isunasfewithskey:(ns string *)键{ return[m _ Crashkeymorymappedkv getboolforkey:key]= =是;}-(void)increasehashcounttwithkey:(nsstring *)键{//记录该键所在的线程...int 32 _ t count =[m _ crashcountmorymappedkv getint 32 forkey:key];[m _ CrashCountMemorymappedkV set int 32:count+1 forKey:key]}-(void)DecresseCrashCountWithKey:(nsString *)key { int 32 _ t count =[m _ CrashCountMemorymappedkV getint 32 forKey:key];[m _ CrashCountMemorymappedkV set int 32:MAX(0,计数- 1)分叉:键];} //崩溃回调函数-(void)onsignal crash:(SIG info _ t *)info {//首先找到与崩溃线程相同的键nsstring * key =[无私密码:info-> si _ PID];if (key == nil)返回;如果(m _ islasttim被指定字符清除= =否){//设置当前由特殊字符引起的闪回,并且如果崩溃次数大于1,屏蔽此字符串以显示[self setlasttim被指定字符清除:是];如果([m _ CrashKeyMemorymappedkV GetInt 32分叉:key]> 1){[m _ CrashKeyMemorymappedkV SetBool:YES分叉:key];}}否则{//连续特殊字符会闪回来并直接屏蔽[m _ crashkeymorymappedkv set bool:yes forkey:key];} } @结束

 

 

 4.有必要从用户体验方面做进一步的改进

 

 即使有上述N+1优化,当N很大时,客户端仍然需要崩溃多次才能正常使用。以前,一些用户扫描二维码,然后被拉进轰炸组。如果红包没有发出,团体的主人就继续轰炸该团体;用户经常崩溃,他们不能退出群组。许多用户会选择卸载并重新安装客户端。因此,客户端应该添加安全模式机制。

 

 当客户端连续三次检测到崩溃时,下次启动时会出现安全模式界面,提示用户如何处理:

 微信团队分享:iOS版本的微信如何防止由特殊字符引起的群体爆炸和应用崩溃?_2.jpeg

 

 对于经常闪回的群聊,主界面提供了一个快速输入,方便用户退出群。此外,对于可能被误判的字符串,界面还提供了一个条目,以方便用户恢复字符串显示:

 微信团队分享:iOS版本的微信如何防止由特殊字符引起的群体爆炸和应用崩溃?_3.png

 

 为了让后台在第一时间发现新的特殊字符变体,客户端将在检测到特殊字符崩溃后向后台报告相关信息。通过客户端报告和后台拦截的闭环,可以大大缩小特殊字符的传播范围。该方案不仅可用于特殊字符,还可用于其他恶意信息,如群发信息、gif、小视频、链接等。

 5.通用部件存储器

 

 因为有太多的地方需要埋葬,比如昵称、信息内容、头像等等。为了不影响滑动性能,国灵开发了一套基于mmap的高性能通用键值存储组件。请阅读“微信团队共享:iOS微信高性能通用关键价值组件技术实践”。


----------------------------------------------------------------------------------

哇谷im_im即时通讯_私有云_公有云-哇谷云科技官网-JM沟通

IM下载体验 - 哇谷IM-企业云办公IM即时聊天社交系统-JM 沟通下载

IM功能与价格 - 哇谷IM-提供即时通讯IM开发-APP搭建私有化-公有云-私有化云-海外云搭建

新闻动态 - 哇谷IM-即时通讯热门动态博客聊天JM沟通APP

哇谷IM-JM沟通热门动态博客短视频娱乐生活

关于哇谷-哇谷IM-提供企业即时通讯IM开发-语音通话-APP搭建私有化-公有云-私有化云-海外云搭建

联系我们 - 哇谷IM-即时通讯IM私有化搭建提供接口与SDK及哇谷云服务

即时通讯IM融云世界

IM即时通讯钉钉技术:企业IM钉钉在后端架构上的优越之处

新的市场叫板环信、融云、腾讯云!开源版IM即使聊天工具

企业IM即时通讯聊天办公APP钉钉技术分析交流

哇谷云-怎么样正确认识海外云服务器

公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?