當我還在吭哧吭哧的埋頭苦鉆 Telegram 相關(guān)資料時,收到了服務(wù)端小伙伴給我提來的一個 Bug:用其他客戶端發(fā)送 Sticker 貼圖到 iOS 端, 然后iOS 端點擊 有 Sticker 的聊天會立刻閃退

立馬停下手里的事兒,上手一測,果然收到 Sticker 消息,點擊聊天就閃退,Xcode 定位到崩潰 ChatMessageInteractiveFileNode 這個類,發(fā)現(xiàn)是有個似乎是有關(guān)文件加載進度 progress 的值返回 NAN 無效數(shù)據(jù),沒辦法,哪里漏了就補上,于是將 progress 的值進行 NAN 數(shù)據(jù)忽略處理:

很有效,點進聊天界面不崩了

但一張模糊的點狀圖 加一個 0B 的 AnimatedSticker.tgs 文件是什么鬼?我們期望是需要顯示的是能唱、跳、rap、籃球的 Sticker 貼紙動畫消息啊,于是開始跟服務(wù)端大眼瞪小眼,開始推導(dǎo)問題出在哪,一開始以為是從服務(wù)器拉取 Sticker 消息時拉取資源失敗了,可其他端卻都能正常拉取顯示,后來發(fā)現(xiàn) iOS 也能發(fā)送 Sticker 消息,其他端都能正常顯示,但 iOS 端退出聊天頁面,重新從聊天列表進來以后,原本自己發(fā)送的正常顯示的 Sticker 消息又變成了 AnimatedSticker.tgs 文件;

開始懷疑是不是 iOS 磁盤寫入數(shù)據(jù)失敗了,或者 .tgs 文件解析失??;然后就是痛苦的 review 源碼,終究還是敗在了其幾十層的回調(diào)嵌套中;
期間,試圖去官方 issues 看有沒有人遇到相同問題,發(fā)現(xiàn)還真有,可這是兩年前的問題了,且問題一直沒有被關(guān)閉,他是在 7.x 版本遇見的,而我的版本是 8.7.1,往后也有幾個相同遭遇的伙伴留言說遇到了同樣的問題,但都沒有解決方案,我也同病相憐的留下到此一游:“me too, How do it”;
苦思一番無果,突然目光又回到了文件 0 B 上,做 IM 都知道,聊天頁面的本質(zhì)是一個 ListView,里面的展示出來的 氣泡消息樣式 是根據(jù) 消息類型 決定的,而Telegram 中 ChatMessageItem 就是負責此類功能,既然我發(fā)送的是一個 Sticker 消息,為啥最終展現(xiàn)出來的是文件消息呢?
帶著此疑問,點開了 ChatMessageItem 類,果然發(fā)現(xiàn)有對應(yīng)的枚舉值,他對 Sticker 消息規(guī)定了 0 < size 但我們收到的 Sticker 消息卻顯示的是 0 B 大小,因此,導(dǎo)致此消息被打回,最終當成了文件處理,而計算文件加載進度的時候 這個 0 B 又會被當成 除數(shù),于是數(shù)據(jù)就 NAN 導(dǎo)致崩潰;

解決辦法:去掉關(guān)于 Sticker 消息文件 0 B 大小的限制。

正是我們期望顯示的能唱、跳、rap、籃球的 Sticker 貼紙動畫消息!