今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

Xcode14编译的APP低版本崩溃

背景#

测试说 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-lswiftCoreGraphicsBuild 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-lswiftCoreGraphicsOther 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之后就需要重新再设置,不是正确的解决办法。

所以有没有可能,在Podfilepost_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后,编译运行,发现可以正常运行了。再验证一下,非低版本手机上是否受到影响,没有影响,完美。

完成!

参考#

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。