ターゲットフレームワークを使用したプロジェクトがあります。
FrameworkAは特定のポッドを使用する唯一のものであるため、私のポッドファイルには次のようなものがあります。
target 'MainAppTarget' do
...
end
target 'FrameworkA' do
pod 'PodA'
end
ビルドは問題なく成功しますが、シミュレータでアプリを実行すると、アプリがすぐにクラッシュして次のエラーメッセージが表示されます。
dyld: Library not loaded: @rpath/PodA.framework/PodA
Referenced from: .../Build/Products/Development-iphonesimulator/FrameworkA.framework/FrameworkA
Reason: image not found
これまでのところ、何もうまくいかなかった。
これがなぜ起こるのか、そして両方のターゲットにすべてのポッドをインストールする必要なく、どのように機能させることができるのでしょうか?
アプリはSwift 4.2。
エラーメッセージから、確認する必要のあることがいくつかあります。
_dyld: Library not loaded: @rpath/PodA.framework/PodA Referenced from: .../Build/Products/Development-iphonesimulator/FrameworkA.framework/FrameworkA Reason: image not found
_
奇妙に思われる最初のことは、ロードされるフレームワーク(FrameworkA.framework)のパスがアプリ内に埋め込まれていないことです。 MainAppTargetの[全般]タブを確認し、フレームワークが[埋め込みバイナリ]および[リンクされたフレームワークとライブラリ]セクションに表示されていることを確認します。
第二に、_@rpath
_はrunpath
検索パスリストの省略形であり、dyld
に必要なライブラリを探す場所を指示します。
ここに、1つのCocoapodを使用するメインアプリと、別のCocoapodを使用するメインアプリが依存する動的フレームワークを使用したGithubのサンプルプロジェクトを示します。 https://github.com/dtweston/FrameworkPodTest
関係するすべてのターゲット(Podsプロジェクトによってビルドされたフレームワークターゲットを含む)で確認する必要があるビルド設定:
LD_RUNPATH_SEARCH_PATHS
_)$(inherited) @executable_path/Frameworks @loader_path/Frameworks
に設定されますLD_DYLIB_INSTALL_NAME
_)$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)
から変更されていませんDYLIB_INSTALL_NAME_BASE
_)@rpath
_に設定します(これもCocoapodによって決定されます)以下に、ビルドされたアプリケーションバンドルのスクリーンショットを示します:
otool
を使用して、xcodebuildによるアプリケーションのアセンブル方法に関する情報を取得できます。
メインのアプリバイナリは次のとおりです。
_otool -L FrameworkPodTest
FrameworkPodTest:
@rpath/KeychainSwift.framework/KeychainSwift (compatibility version 1.0.0, current version 1.0.0)
@rpath/Lottie.framework/Lottie (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 61000.0.0)
@rpath/Framework.framework/Framework (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1560.10.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 1245.9.2)
...
_
そして、フレームワークのバイナリ:
_otool -L Frameworks/Framework.framework/Framework
Frameworks/Framework.framework/Framework:
@rpath/Framework.framework/Framework (compatibility version 1.0.0, current version 1.0.0)
@rpath/KeychainSwift.framework/KeychainSwift (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1560.10.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
@rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 1000.11.42)
@rpath/libswiftCoreFoundation.dylib (compatibility version 1.0.0, current version 1000.11.42)
...
_
ビルドが成功する理由は、コンパイル中にPodA
フレームワークがFrameworkA
に見える(リンクできる)ことですが、アプリケーションが起動すると、ダイナミックを見つけてロードしようとするためです。 PodA
に必要なフレームワークFrameworkA
、およびPodA
がMainAppTarget
に埋め込まれていないように見えるため、アプリが表示されたエラーメッセージでクラッシュします。
これを修正するには、PodA
フレームワークがMainAppTarget
に埋め込まれていることを確認してください。具体的には、最終的なアプリバンドルのFramewokrs
サブフォルダーにPodA.framework
が含まれていることを確認する必要があります。通常、cocoapodsはフレームワークを自動的にコピーします。
MainAppTarget
のビルドフェーズにcocoapodsの[CP] Embed Pods Frameworks
が含まれていること、およびスクリプトの入力ファイルにPodA
フレームワークへのパスが含まれていることを確認します。このようなもの(例はAlamofireポッドを示しています):
投稿した詳細を使用してプロジェクトを設定しましたが、作成したワークスペースの設定でcocoapodsがこのケースを自動的に処理するように見えます(デモプロジェクトについては、こちらをご覧ください: https:// github。 com/DmitryBespalov/StackOverflowPodFramework )。セットアップが異なる場合は、詳細をお知らせください。さらにサポートさせていただきます。
At first, check whether your CocoaPod is compatible (supported) or not
。
FrameworkA
をプロジェクトの[全般設定]タブの_Embedded Binaries
_セクションにドラッグしたことを確認してください。また、ビルドフェーズタブにEmbed Frameworks (1 item)
があり、そこにFrameworkA
が含まれていることを確認してください。
解決策は次のとおりです。
ステップ1:プロジェクトナビゲーションで_FrameworkA.framework
_をドラッグアンドドロップします。リンクフレームワークとライブラリがこのライブラリを追加しました。
ステップ2:Xcodeで、[プロジェクト]> [全般]> [埋め込みバイナリ]> [_FrameworkA.framework
_を追加]に移動します。
ステップ3:ビルドフェーズタブLink Binary with Libraries (1 item)
およびEmbed Frameworks (1 item)
存在します。
追伸私はXcode 10.2.1でそれをしましたが、Xcode 10.1でも同じように動作します。
私も同じ問題に直面していました。必要なのは、使用するサードパーティのフレームワークを設定するだけです:-ビルドフェーズセクションのライブラリとバイナリをリンクで必須ではなくオプションとしてPodAそれで全部です。もう一度試してみると、期待どおりに実行されます。
注:-フレームワークを使用しているアプリにPodAを追加する必要があります。 PodAで構成される静的フレームワークを作成し、動的フレームワーク内でこの新しく作成された静的フレームワークを使用する以外の方法はありません。