前言
看到Xcode有新版本,沒忍住點了升級,然后問題來了。
2023/06/24更新:關(guān)于Xcode 14.3版本打出來的包在iOS 13版本報錯的問題,經(jīng)過iOS 13.7版本真機實測,這個問題在Xcode 14.3.1版本已經(jīng)修復(fù),建議升級。Xcode 14.3.1的發(fā)布說明也提及了這個問題的修復(fù)。
2023/04/23更新:關(guān)于Xcode 14.3版本目前涉及到的三個問題,一是本篇文章的運行報錯;二是打包報錯,參考這篇文章iOS問題記錄 - Xcode 14.3版本打包項目報錯;三是打出來的包在iOS 13.1~13.7會報錯(因為我手頭沒條件暫時未驗證),參考蘋果開發(fā)者論壇的帖子。
目前而言,推薦暫時用回Xcode 14.2版本,等待第三個問題修復(fù)后再升級,Xcode歷史版本官方下載地址(需要登錄)。 當(dāng)然,到時候升級后可能還會遇到運行/打包項目報錯,不過這都是小問題。如果想知道這些小問題為什么會發(fā)生,請繼續(xù)閱讀本篇文章。
開發(fā)環(huán)境
- macOS: 13.3
- Xcode: 14.3
問題描述
Xcode 14.2版本運行項目一切正常,升級到14.3版本后運行報錯。
運行到模擬器的報錯信息:
ld: file not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a
clang: error: linker command failed with exit code 1 (use -v to see invocation)
運行到真機的報錯信息:
ld: file not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a
clang: error: linker command failed with exit code 1 (use -v to see invocation)
問題分析
從報錯信息看,都是在鏈接庫的時候因為找不到靜態(tài)庫(libarclite_iphonesimulator.a
/libarclite_iphoneos.a
)而報錯。利用訪達的前往文件夾功能快速來到報錯信息中的目錄,發(fā)現(xiàn)連arc
目錄都不存在,更不用說靜態(tài)庫文件。
現(xiàn)在可以確定的是Xcode 14.2版本肯定是正常的,那會不會是14.3版本移除了整個arc
目錄?找到一臺還沒升級到Xcode 14.3版本的電腦,在同樣的路徑下,果然存在arc
目錄:
既然是因為找不到庫導(dǎo)致的問題,那我復(fù)制arc
目錄到Xcode 14.3版本中是否可行呢?實測可行,不管是模擬器還是真機,運行一切正常。不過,既然Xcode決定移除這個arc
目錄,說明這個可能真的已經(jīng)過時,難道以后都不需要再鏈接這些庫用于支持ARC
?
找到Xcode 14.3的發(fā)布說明,翻了翻并沒有看到有關(guān)這方面的說明。看來只能去蘋果開發(fā)者論壇找找看,搜索報錯信息找到相關(guān)的問題,一位蘋果員工給出了回復(fù):
這個回復(fù)簡單概括起來就是說,因為系統(tǒng)已經(jīng)內(nèi)置有ARC
相關(guān)的庫,所以沒必要再額外鏈接,至少Xcode 14支持的最低部署目標(biāo)iOS 11及以上版本的系統(tǒng)肯定是沒問題的。如果應(yīng)用部署目標(biāo)不低于iOS 11還出現(xiàn)問題,那么應(yīng)該是第三方庫的部署目標(biāo)有問題。
現(xiàn)在Xcode 14.3移除arc
目錄的原因已經(jīng)很清楚,是因為支持的最低部署版本的系統(tǒng)都已經(jīng)內(nèi)置了ARC
相關(guān)的庫。如果應(yīng)用最低部署目標(biāo)版本本身不低于iOS 11,解決這個問題很簡單,只需要將第三方庫部署目標(biāo)的iOS版本設(shè)置成和應(yīng)用最低部署目標(biāo)的iOS版本一致。
在我的項目中,應(yīng)用最低部署目標(biāo)是iOS 11.0版本:
在Podfile
文件中加上:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
end
end
end
這段代碼的作用是先獲取Pods項目(pods_project
)中的目標(biāo)數(shù)組(targets
),然后遍歷目標(biāo)數(shù)組通過目標(biāo)對象(target
)獲取構(gòu)建配置數(shù)組(build_configurations
),最后遍歷構(gòu)建配置數(shù)組修改構(gòu)建配置對象中的構(gòu)建設(shè)置(build_settings
),將iOS 部署目標(biāo)版本設(shè)為11.0
。
經(jīng)過以上操作,實測不再報錯。不過,還有疑問沒解決,我手上還有老項目的最低部署目標(biāo)是iOS 9版本,難道老項目只能用Xcode 14.3以下版本或復(fù)制一份arc
目錄到Xcode 14.3?
帶著疑問,我用Xcode 14.3運行了老項目,結(jié)果一切正常!這差點給我整不會了。找到老項目中的Podfile
文件,發(fā)現(xiàn)已經(jīng)有設(shè)置第三方庫部署目標(biāo)的iOS版本:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0'
end
end
end
???咦,難道iOS 9.0系統(tǒng)就已經(jīng)內(nèi)置了ARC
相關(guān)的庫?
先試試將9.0
改為8.0
,執(zhí)行pod install
命令后重新運行項目,結(jié)果報錯。將8.0
恢復(fù)為9.0
,再做一次測試,執(zhí)行pod install
命令后手動修改某個庫的部署目標(biāo)為8.0
,重新運行項目,不出意外還是報錯,而且就剩剛才改過部署目標(biāo)的庫在報錯。實測將8.0
改為iOS 8的最后一個版本8.4.1
還是報錯。
綜上,由于Xcode 14.3版本移除了ARC
相關(guān)的庫,從而導(dǎo)致一些默認部署目標(biāo)是iOS 8版本的第三方庫出現(xiàn)報錯。只要最低部署目標(biāo)不低于iOS 9版本,運行項目時就不會去鏈接ARC
相關(guān)的庫,也就不會出現(xiàn)找不到庫的報錯。
解決方案
- 如果應(yīng)用最低部署目標(biāo)大等于iOS 9版本
在Podfile
文件中加上:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
end
end
end
11.0
版本不是固定的,首先肯定要大于9.0
版本,其次也不能高于應(yīng)用最低部署目標(biāo)版本,然后太低也可能會低于一些第三方庫的部署目標(biāo)版本,所以盡可能和應(yīng)用最低部署目標(biāo)版本保持一致即可。
2023/04/09更新:修改Podfile
文件后需要重新執(zhí)行pod install
命令使改動生效。
- 如果應(yīng)用最低部署目標(biāo)小于iOS 9版本
這種老項目應(yīng)該很少了吧,如果真的是屬于這種情況,又不想升最低部署目標(biāo)版本,建議從以下方法任選一種:
-
下載arc目錄解壓后復(fù)制到指定目錄路徑:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib
- Xcode使用14.3以下版本,Xcode歷史版本官方下載(需要登錄)
2023/04/08更新:如果用Xcode 14.3版本打包項目出現(xiàn)報錯,可以參考這篇文章iOS問題記錄 - Xcode 14.3版本打包項目報錯。
補充內(nèi)容(Xcode 15.0)
升級Xcode 15.0后,有個項目運行時遇到了崩潰問題:
Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
經(jīng)測試,初步可知iOS 17.0以下版本都會有這個崩潰問題。在網(wǎng)上搜索到了類似的問題,應(yīng)該是Xcode 15.0的兼容性有點問題。
暫時不確定Xcode后續(xù)會不會修復(fù)這個問題,但是這里有一個臨時解決方法,將第三方庫部署目標(biāo)的iOS版本提高到Xcode 15所支持的最低部署目標(biāo)版本iOS 12。
在Podfile
文件中設(shè)置:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
end
end
end
同時最好也將應(yīng)用最低部署目標(biāo)設(shè)置為iOS 12版本:
最后
如果這篇文章對你有所幫助,點贊??收藏??支持一下吧,謝謝~文章來源:http://www.zghlxwxcb.cn/news/detail-407322.html
本篇文章由@crasowas發(fā)布于CSDN。文章來源地址http://www.zghlxwxcb.cn/news/detail-407322.html
到了這里,關(guān)于iOS問題記錄 - Xcode 14.3版本運行項目報錯的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!