当我还在吭哧吭哧的埋头苦钻 Telegram 相关资料时,收到了服务端小伙伴给我提来的一个 Bug:用其他客户端发送 Sticker
贴图到 iOS 端, 然后iOS 端点击 有 Sticker
的聊天会立刻闪退
立马停下手里的事儿,上手一测,果然收到 Sticker
消息,点击聊天就闪退,Xcode 定位到崩溃 ChatMessageInteractiveFileNode
这个类,发现是有个似乎是有关文件加载进度 progress
的值返回 NAN
无效数据,没办法,哪里漏了就补上,于是将 progress
的值进行 NAN
数据忽略处理:
很有效,点进聊天界面不崩了
但一张模糊的点状图 加一个 0B
的 AnimatedSticker.tgs
文件是什么鬼?我们期望是需要显示的是能唱、跳、rap、篮球的 Sticker
贴纸动画消息啊,于是开始跟服务端大眼瞪小眼,开始推导问题出在哪,一开始以为是从服务器拉取 Sticker
消息时拉取资源失败了,可其他端却都能正常拉取显示,后来发现 iOS 也能发送 Sticker
消息,其他端都能正常显示,但 iOS 端退出聊天页面,重新从聊天列表进来以后,原本自己发送的正常显示的 Sticker
消息又变成了 AnimatedSticker.tgs
文件;
开始怀疑是不是 iOS 磁盘写入数据失败了,或者 .tgs
文件解析失败;然后就是痛苦的 review 源码,终究还是败在了其几十层的回调嵌套中;
期间,试图去官方 issues 看有没有人遇到相同问题,发现还真有,可这是两年前的问题了,且问题一直没有被关闭,他是在 7.x
版本遇见的,而我的版本是 8.7.1
,往后也有几个相同遭遇的伙伴留言说遇到了同样的问题,但都没有解决方案,我也同病相怜的留下到此一游:“me too, How do it”;
苦思一番无果,突然目光又回到了文件 0 B
上,做 IM 都知道,聊天页面的本质是一个 ListView
,里面的展示出来的 气泡消息样式 是根据 消息类型 决定的,而Telegram 中 ChatMessageItem 就是负责此类功能,既然我发送的是一个 Sticker
消息,为啥最终展现出来的是文件消息呢?
带着此疑问,点开了 ChatMessageItem 类,果然发现有对应的枚举值,他对 Sticker
消息规定了 0 < size
但我们收到的 Sticker
消息却显示的是 0 B
大小,因此,导致此消息被打回,最终当成了文件处理,而计算文件加载进度的时候 这个 0 B
又会被当成 除数,于是数据就 NAN
导致崩溃;
解决办法:去掉关于 Sticker
消息文件 0 B
大小的限制。
正是我们期望显示的能唱、跳、rap、篮球的 Sticker
贴纸动画消息!