背景#
テストでは、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 Settings
のOther Linker Flags
に-Wl,-weak-lswiftCoreGraphics
を追加する必要があります。Other Swift Flags
ではなく、以下のエラーメッセージが表示された場合は、間違った場所に追加したことを意味します。。。。
Driver threw unknown argument: '-weak-libswiftCoreGraphics' without emitting errors.
注意 1#
ただし、プロジェクトに複数の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
を追加し、再度実行しますが、別のサードパーティライブラリに変更しました。。。
各サードパーティライブラリを 1 つずつ追加することは不可能であり、面倒ですし、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
後、コンパイルして実行すると、正常に動作することがわかりました。他のバージョンの携帯電話には影響を与えないかどうかを確認すると、影響を与えないことがわかりました。完璧です。
完了!