這是一個(gè)發(fā)生在去年年底的故事。背景是一個(gè)新規(guī) Swift 應(yīng)用處于準(zhǔn)備發(fā)布階段,證書由開發(fā)測(cè)試用更替為發(fā)布用, 這是兩份 Team 不同的企業(yè)版證書。
應(yīng)用功能本身十分簡(jiǎn)單,開發(fā)測(cè)試階段也比較順利,幾乎沒有發(fā)生崩潰。然而在更替證書之后,真機(jī)測(cè)試應(yīng)用時(shí)卻陷入了無限崩潰的境地。
Log 類似下面這樣:
dyld: Library not loaded: @rpath/libswiftCore.dylib
Referenced from: ...
Reason: no suitable image found. Did find:
...
有很多原因會(huì)導(dǎo)致提示這個(gè)錯(cuò)誤,作為 Trouble Shooting 記錄下來:
- 可能存在緩存,****Clean**** 工程
- 很多時(shí)候該問題發(fā)生在 Swift 與 Objective-C 混編的時(shí)候,所以需要檢查 Building Setting 中 Embeedded Content Contains Swift Code 的設(shè)置是否已經(jīng)為 ****YES****。
- 依然是配置,檢查 Building Setting 中的 Runpath Search Paths 是否正確,通常是:****@executable_path/Frameworks****。
- 重置證書 (注銷再新建) 。
實(shí)際的生產(chǎn)過程中,首先 check 了前三項(xiàng),最終強(qiáng)烈懷疑是證書問題。關(guān)于 “l(fā)ibswiftCore.dylib 崩潰“這個(gè)話題,很容易能看到這篇 Q&A,其中提到要運(yùn)行 Swift 應(yīng)用必須使用 iOS 8 Released 之后創(chuàng)建的證書。對(duì)比手中的兩份證書,除了 Team 不同之外,最大的差別在于創(chuàng)建時(shí)間,分別為 2016 年夏天,和 2014 年夏天。所以更新證書之后,問題也幸運(yùn)地解決了。
關(guān)于 libswiftCore.dylib 文件還想再多扯幾句,看名字就能夠猜到是 Swift 動(dòng)態(tài)庫,具體說來它其實(shí)是 Swift 的運(yùn)行時(shí)庫,但是該文件和證書有什么關(guān)系呢?原因在于目前 Swift 的版本升級(jí)還不穩(wěn)定,如果將這些運(yùn)行時(shí)庫直接放到系統(tǒng)中,很可能會(huì)導(dǎo)致每次 Swift 升級(jí)都導(dǎo)致應(yīng)用不再能夠使用,而作為這個(gè)問題的解決方案,Apple 選擇將運(yùn)行時(shí)庫打包進(jìn)應(yīng)用中,這樣就保證了開發(fā)與應(yīng)用的 Swift 版本一致。由于 libswiftCore.dylib 屬于應(yīng)用的一部分,所以也是需要簽名的,而像上一段所說,能夠?yàn)?Swift 的運(yùn)行時(shí)庫簽名的證書必須創(chuàng)建于 iOS 8 Released 之后。這一切,都是為了提高 Swift 的兼容性,關(guān)于兼容性,強(qiáng)烈推薦這條 Tip。