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