背景#
测试说 iOS 12 的手机上安装 Xcode14.0.2 导出的新包后,打开就崩溃,但是在系统版本高的手机上就没有问题。
调试后发现,崩溃日志是dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib
,具体如下:
dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib
Referenced from: /private/var/containers/Bundle/Application/55730273-D9D6-4C42-9335-7A56F92B7F2C/xxx.app/Frameworks/FSPagerView.framework/FSPagerView
Reason: image not founds
搜索后发现,开发者社区中有此问题的记录,xcode14 not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib,解决方案是:
If you are building your app with Xcode 14 or Xcode 14.0.1, your app will crash on older OS versions, including while building and testing directly from Xcode, as well as after submitting the app to the App Store. The OS versions affected include iOS 11 - 12.1, macOS 10.13 - 10.14.3, as well as watchOS and tvOS versions from the same time frame. To work around the crash when building with Xcode 14, add -Wl,-weak-lswiftCoreGraphics (substituting other library names for swiftCoreGraphics if appropriate for your crash) to the Other Linker Flags build setting.
即添加-Wl,-weak-lswiftCoreGraphics
到Build Settings
中的Other Linker Flags
中。
这里要注意是添加到Other Linker Flags
而不是Other Swift Flags
,如果遇到下面的报错,就说明你和我一样,添加到了错误的地方。。。。
Driver threw unknown argument: '-weak-libswiftCoreGraphics' without emitting errors.
注意 1#
然而需要注意的是,假如项目有多个Target
,如果添加在Target
中,就要针对每个Target
都要添加一次,很是麻烦,所以可以直接在PROJECT
下的Build Settings
中添加。
注意 2#
在项目中添加了-Wl,-weak-lswiftCoreGraphics
到Other Linker Flags
之后,编译运行发现还是会崩溃,还是报错
dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib
Referenced from: /private/var/containers/Bundle/Application/55730273-D9D6-4C42-9335-7A56F92B7F2C/xxx.app/Frameworks/FSPagerView.framework/FSPagerView
Reason: image not founds
仔细看了之后,发现报错中提示的FSPagerView
,是CocoaPods
三方库,所以找到对应的第三方库,然后在对应库的Build Settings
中找到Other Linker Flags
,然后添加-Wl,-weak-lswiftCoreGraphics
,再运行,发现还是报错,但是换了另一个三方库。。。
针对每个三方库一个个添加,是不可能的,太麻烦不说,每次Pod install
之后就需要重新再设置,不是正确的解决办法。
所以有没有可能,在Podfile
中post_install
添加设置,统一一次性给所有三方库加这个编译设置。当然可以,设置如下:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['OTHER_LDFLAGS'] = '-Wl,-weak-lswiftCoreGraphics'
end
end
end
然后编译,发现报错,因为项目中有些库没有用到swiftCoreGraphics
,比如 OC 的三方库,或者非 UI 的库,所以还是要改,需要区分添加。针对项目中 Swift 类型的 UI 相关的库,添加这个编译选项,其他的不添加,最终示例如下:
need_otherlinkerflags_frameworks = ['FSPagerView', 'HandyJSON', 'IQKeyboardManagerSwift', 'JXSegmentedView', 'KDCircularProgress', 'Kingfisher', 'RxSwift', 'PKHUD', 'RxCocoa', 'SnapKit', 'ZLPhotoBrowser']
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if need_otherlinkerflags_frameworks.include?(target.name)
config.build_settings['OTHER_LDFLAGS'] = '-Wl,-weak-lswiftCoreGraphics'
end
end
end
end
Pod install
后,编译运行,发现可以正常运行了。再验证一下,非低版本手机上是否受到影响,没有影响,完美。
Done!