當(dāng)我還在吭哧吭哧的埋頭苦鉆 Telegram 相關(guān)資料時(shí)矮湘,收到了服務(wù)端小伙伴給我提來(lái)的一個(gè) Bug:用其他客戶端發(fā)送 Sticker
貼圖到 iOS 端, 然后iOS 端點(diǎn)擊 有 Sticker
的聊天會(huì)立刻閃退
立馬停下手里的事兒扳躬,上手一測(cè),果然收到 Sticker
消息铅辞,點(diǎn)擊聊天就閃退,Xcode 定位到崩潰 ChatMessageInteractiveFileNode
這個(gè)類,發(fā)現(xiàn)是有個(gè)似乎是有關(guān)文件加載進(jìn)度 progress
的值返回 NAN
無(wú)效數(shù)據(jù)粗梭,沒(méi)辦法,哪里漏了就補(bǔ)上级零,于是將 progress
的值進(jìn)行 NAN
數(shù)據(jù)忽略處理:
很有效断医,點(diǎn)進(jìn)聊天界面不崩了
但一張模糊的點(diǎn)狀圖 加一個(gè) 0B
的 AnimatedSticker.tgs
文件是什么鬼?我們期望是需要顯示的是能唱奏纪、跳鉴嗤、rap、籃球的 Sticker
貼紙動(dòng)畫消息啊序调,于是開(kāi)始跟服務(wù)端大眼瞪小眼醉锅,開(kāi)始推導(dǎo)問(wèn)題出在哪,一開(kāi)始以為是從服務(wù)器拉取 Sticker
消息時(shí)拉取資源失敗了发绢,可其他端卻都能正常拉取顯示硬耍,后來(lái)發(fā)現(xiàn) iOS 也能發(fā)送 Sticker
消息,其他端都能正常顯示朴摊,但 iOS 端退出聊天頁(yè)面默垄,重新從聊天列表進(jìn)來(lái)以后,原本自己發(fā)送的正常顯示的 Sticker
消息又變成了 AnimatedSticker.tgs
文件甚纲;
開(kāi)始懷疑是不是 iOS 磁盤寫入數(shù)據(jù)失敗了口锭,或者 .tgs
文件解析失敗;然后就是痛苦的 review 源碼鹃操,終究還是敗在了其幾十層的回調(diào)嵌套中韭寸;
期間,試圖去官方 issues 看有沒(méi)有人遇到相同問(wèn)題荆隘,發(fā)現(xiàn)還真有恩伺,可這是兩年前的問(wèn)題了,且問(wèn)題一直沒(méi)有被關(guān)閉椰拒,他是在 7.x
版本遇見(jiàn)的晶渠,而我的版本是 8.7.1
,往后也有幾個(gè)相同遭遇的伙伴留言說(shuō)遇到了同樣的問(wèn)題燃观,但都沒(méi)有解決方案褒脯,我也同病相憐的留下到此一游:“me too, How do it”;
苦思一番無(wú)果缆毁,突然目光又回到了文件 0 B
上番川,做 IM 都知道,聊天頁(yè)面的本質(zhì)是一個(gè) ListView
脊框,里面的展示出來(lái)的 氣泡消息樣式 是根據(jù) 消息類型 決定的颁督,而Telegram 中 ChatMessageItem 就是負(fù)責(zé)此類功能,既然我發(fā)送的是一個(gè) Sticker
消息浇雹,為啥最終展現(xiàn)出來(lái)的是文件消息呢沉御?
帶著此疑問(wèn),點(diǎn)開(kāi)了 ChatMessageItem 類箫爷,果然發(fā)現(xiàn)有對(duì)應(yīng)的枚舉值嚷节,他對(duì) Sticker
消息規(guī)定了 0 < size
但我們收到的 Sticker
消息卻顯示的是 0 B
大小,因此虎锚,導(dǎo)致此消息被打回硫痰,最終當(dāng)成了文件處理,而計(jì)算文件加載進(jìn)度的時(shí)候 這個(gè) 0 B
又會(huì)被當(dāng)成 除數(shù)窜护,于是數(shù)據(jù)就 NAN
導(dǎo)致崩潰效斑;
解決辦法:去掉關(guān)于 Sticker
消息文件 0 B
大小的限制。
正是我們期望顯示的能唱缓屠、跳、rap护侮、籃球的 Sticker
貼紙動(dòng)畫消息敌完!