今是昨非

今是昨非

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

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 でアプリをビルドしている場合、アプリは古い 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 Linker Flagsに追加することであり、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

詳細に見ると、エラーに表示されているFSPagerViewCocoaPodsのサードパーティライブラリであるため、対応するサードパーティライブラリを見つけて、そのライブラリのBuild SettingsOther 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の後、コンパイルして実行すると、正常に動作することが確認できました。さらに、低バージョンの携帯電話に影響がないか確認しましたが、影響はありませんでした。完璧です。

完了!

参考#

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