背景#
测试说 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,解决方案是:
如果您使用 Xcode 14 或 Xcode 14.0.1 构建应用程序,则您的应用程序将在较旧的操作系统版本上崩溃,包括直接从 Xcode 构建和测试以及提交应用程序到 App Store 后。受影响的操作系统版本包括 iOS 11 - 12.1,macOS 10.13 - 10.14.3,以及同一时间段的 watchOS 和 tvOS 版本。为了解决使用 Xcode 14 构建时的崩溃问题,请将 - Wl,-weak-lswiftCoreGraphics(如果适用于您的崩溃,请替换其他库名称以替代 swiftCoreGraphics)添加到其他链接器标志构建设置中。
即添加-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
后,编译运行,发现可以正常运行了。再验证一下,非低版本手机上是否受到影响,没有影响,完美。
完成!