今是昨非

今是昨非

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

Xcode14でコンパイルされたアプリの低いバージョンでクラッシュが発生します。

背景#

テストでは、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 でアプリをビルドしている場合、アプリは古い OS バージョン(Xcode からのビルドおよびテスト中、および App Store にアプリを提出した後も)でクラッシュします。影響を受ける OS バージョンには、iOS 11〜12.1、macOS 10.13〜10.14.3、および同じ時間枠の watchOS および tvOS バージョンが含まれます。Xcode 14 でビルドする際のクラッシュを回避するには、Other Linker Flags ビルド設定に - Wl,-weak-lswiftCoreGraphics(クラッシュに適切なライブラリ名に置き換える)を追加します

つまり、Build SettingsOther Linker Flags-Wl,-weak-lswiftCoreGraphicsを追加する必要があります。Other Swift Flagsではなく、以下のエラーメッセージが表示された場合は、間違った場所に追加したことを意味します。。。。

Driver threw unknown argument: '-weak-libswiftCoreGraphics' without emitting errors.

注意 1#

ただし、プロジェクトに複数のTargetがある場合、Targetごとに追加する必要があります。これは非常に面倒ですので、PROJECTBuild 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 SettingsOther Linker Flagsを見つけ、-Wl,-weak-lswiftCoreGraphicsを追加し、再度実行しますが、別のサードパーティライブラリに変更しました。。。

各サードパーティライブラリを 1 つずつ追加することは不可能であり、面倒ですし、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後、コンパイルして実行すると、正常に動作することがわかりました。他のバージョンの携帯電話には影響を与えないかどうかを確認すると、影響を与えないことがわかりました。完璧です。

完了!

参考#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。