私はこの警告を受けています:
Class X is implemented in both <framework> and <application> one of the two will be used, which one is undefined
この警告はウェブ全体でかなりカバーされていますが、私が抱えている特定の問題に答えるものが見つかりませんでした。
シナリオ
MyFrameworkとMyApplicationを(MyFrameworkのテスト/デモアプリケーションとして)ビルドしました。
MyFrameworkはCocoaPod(これをCoolPodと呼びます)を使用します。これもMyApplicationで使用します(MyFrameworkのコンシューマーも使用することを想定するのが妥当です)。
MyFrameworkを.framework(クローズドソース用)として配布できるようにする必要があります。ただし、これは、MyFrameworkがそのコンパイル済みライブラリにCoolPodを埋め込むことを意味します。
MyFrameworkとCoolPodをMyApplicationにインポートすると、CoolPodのクラスがMyFrameworkのライブラリに既に含まれているため(CoolPodが埋め込まれているため)、この競合が発生します(上記の警告が出力されます)。
したがって、次のような構造になります。
CoolPod -> MyFramework \
MyApplication
CoolPod /
質問
この競合を回避するにはどうすればよいですか?
MyApplicationにCoolPodのヘッダー(libではない)を含めることを検討しましたが、これは単純なケースでは非常に複雑に見えます。
どんな助けでも大歓迎です、これは今私を本当に妨げています。
おかげで、
インジゴ
私の解決策は、ココアポッドからソースコードを取得し、ココアタッチフレームワークを作成することでした。次に、フレームワークをAPIとテストアプリにリンクしました。これは素晴らしいことではありませんが、私がすぐにできるすべてです。 Cocoapodsはフレームワークのサポートに取り組んでいるので、このソリューションはすぐに古くなる可能性があります。
私の会社も依存関係(Java)とビルドスクリプトにGradleを使用しています。そこで、私のフレームワークとサポートするフレームワーク(cocoapodフレームワーク)をビルドし、それらからユニバーサルフレームワークを作成する、groovy/gradleビルドタスクを作成しました。次に、すべてのフレームワークを圧縮します。これは、すべての要件を備えた1つのZipを配布できることを意味します。これは明らかに配布するのに最適な方法ではありませんが(クローズドソースフレームワークに依存するCocoapodを介して配布することに移行します)、セットアップは高速です。
クローズドソースの静的ライブラリについては、 cocoapods-packager をお勧めします。それがフレームワークのサポートかどうかはわかりません。
簡単な解決策が必要な場合は、MyFrameworkプロジェクトをサブプロジェクトとしてMyApplicationプロジェクトに追加してください。フレームワークとテストアプリケーションの両方でココアポッドを引き続き使用できます(ただし、フレームワークプロジェクトにのみポッドを含む「共通」ライブラリを含めます)
1つの解決策は、use_frameworksをオンにすることです。フレームワークのPodfile内。その後、フレームワークをコンパイルし、ターゲットアプリにフレームワークを埋め込むことができます。警告メッセージが表示されなくなります(フレームワークのポッドが別のフレームワークに準拠しているというだけの理由で、これをターゲットアプリに埋め込んでいないため、アプリは独自のバイナリを参照します)。
ただし、これは次の2つの理由から適切な解決策ではありません。1。ターゲットアプリに、フレームワークに必要なポッドが含まれていることを確認する必要があります。 2.アプリはフレームワークに対して異なるポッドバージョンを使用する場合があります。フレームワークとアプリの両方が同じポッドバイナリを参照している場合、クラッシュにつながる可能性があります。
この問題には良い解決策があるとは思えません。
MyFramework
を依存関係として使用して、CoolPod
に Podspec を作成できます。
MyFramework.podspecは次のようになります。
Pod::Spec.new do |spec|
spec.name = 'TestFW'
spec.version = '1.0.0'
spec.license = { :type => 'BSD' }
spec.homepage = 'https://github.com/user/TestFW'
spec.authors = { 'Auther Name' => '[email protected]' }
spec.summary = 'Testing FW Pod with Test App'
spec.source = { :git => 'https://github.com/user/TestFW.git' }
spec.module_name = 'TestFW'
spec.ios.source_files = 'TestFW/*.Swift'
spec.dependency 'CoolPod'
end
MyApplication
のpodfileは次のようになります。
target 'TestApp' do
use_frameworks!
pod 'CoolPod'
pod 'TestFW'
end