一、前言
文章主要講解自己親身經(jīng)歷的一個奇葩問題的處理全過程:
Xcode8打包發(fā)布后iOS9.0~9.2機(jī)型閃退
就在幾個月前,在公司發(fā)布更新app后,很快通過了蘋果的審核,本來很高興,這下該解決的bug也解決了,新功能也上線了,可以漲工資了,哇哈哈?。?!
突然,微信里面收到騰訊Bugly發(fā)過來的消息提醒(項(xiàng)目集成了Bugly,主要是監(jiān)測崩潰率,上報崩潰日志),說我的應(yīng)用崩潰率波動異常大,此時的我心中有一萬個草泥馬在奔跑,趕緊打開Bugly看崩潰日志,經(jīng)過一番排查定位,最終確定新版本的崩潰全部發(fā)生在了iOS 9.0 ~ 9.2之間,哥們我趕緊拿出所有測試機(jī)(也只有iOS 7.1/9.3.5/10.1三部手機(jī)),用代碼跑沒問題,從App Store下載更新也沒問題。找遍全公司,幸好有個小妹妹的古老的iPad 系統(tǒng)是9.1,二話不說奪了過來,趕緊用代碼運(yùn)行跑起來,哎喲握草,不會崩潰啊,一臉懵逼?。?!換個思路,直接從App Store下載下來,好了,見證奇跡的時刻來了,哎喲,我一啟動app,卡著不動,大約10s之后果斷閃退,此時的我淚流滿面啊,果然崩潰發(fā)生在iOS 9.0 ~ 9.2。
你以為問題就解決了么?這只是定位到了問題,問題出在哪然而還是一臉懵逼,為什么會這樣,然后開始瘋狂搜索。。。
二、崩潰原因
在Xcode8中,如果你的圖片資源文件里有16位圖或者圖片顯示模式為P3,并且Deployment Target是iOS9.3以下的就會出現(xiàn)這個問題。(話說項(xiàng)目里面就是因?yàn)橐粡埿⌒〉膱D片,導(dǎo)致了這次崩潰,不知道設(shè)計師是怎么弄出來的這個特殊圖片…)如果你的App需要支持wide color functionality,那你就必須設(shè)置Deployment Target為iOS9.3以上。如果你的APP不需要支持wide color functionality并且你希望兼容iOS老版本,那么你需要將所有16-bit or P3 assets的圖片轉(zhuǎn)換為8-bit sRGB assets。
此前圖片資源都是放在另外的文件夾里面的,而這個版本特意整理了項(xiàng)目的文件夾,把圖片資源都放到了image.xcassets了,這一移動導(dǎo)致這個問題的出現(xiàn)。
三、定位問題圖片
- 打一個ipa包,解壓你的應(yīng)用的ipa包,進(jìn)入到你應(yīng)用的Playload文件夾。
- 用find命令定位到Assets.car文件
find . -name 'Assets.car'
- 使用 assetutil 命令導(dǎo)出圖片的信息存儲到Assets.json文件中
sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json
- 打開剛才生成的Assets.json文件,查找含有”DisplayGamut” : “P3”, “Encoding” : “ARGB-16″的內(nèi)容。這個對應(yīng)的Name就是出現(xiàn)問題的圖片了。
{
"SizeClass Vertical" : "universal",
"Graphics" : "GLES2,0",
"Name" : "ianisme.com",
"Scale" : 2,
"Idiom" : "universal",
"Memory" : "512MB",
"LayoutDirection" : "0 - Horizontal",
"DisplayGamut" : "P3",
"Encoding" : "ARGB-16",
"SizeClass Horizontal" : "universal",
"Image Type" : "kCoreThemeOnePartScale",
"AssetType" : "Image",
"Subtype" : 0,
"EdgeInsets" : "top:0 left:0 bottom:0 right:0"
}
四、轉(zhuǎn)換圖片為8-bit sRGB assets格式
找到這個圖片,然后Command+i 查看這個圖片的信息,發(fā)現(xiàn)這個出問題的文件的顏色描述文件有問題,和別的圖片文件不一樣。


使用ColorSync實(shí)用工具將這個描述文件修改如下:

指派它的描述文件為sRGB IEC61966-2.1,保存。

最后打包重新加急審核。。。第二天,審核通過,下載安裝沒有問題。
五、總結(jié)
這次的問題若不是及時發(fā)現(xiàn),將會會導(dǎo)致大面積用戶無法正常使用app,從而升級成一次嚴(yán)重事故。幸運(yùn)的是問題及時解決了,很感謝小妹妹的救命iPad。所以,遇到問題不必驚慌,只要按照正常思路,發(fā)現(xiàn)問題,尋找規(guī)律、定位問題、直到找到解決辦法。
此外還要感謝以下技術(shù)大牛:
順便附上一片app性能檢測的文章: