この方法を使用してiOSフレームワークプロジェクトを作成しました: https://github.com/jverkoey/iOS-Framework
かなりうまく機能しますが、フレームワークが機能するために必要なライブラリ/フレームワークを含める方法、特に、フレームワークを使用するサードパーティのクライアントアプリがこれらのライブラリを含めることができるようにする方法について少し混乱しています競合することなく同様に。
私のフレームワークコードがこれら2つのことを必要としているとしましょう:
1つ目はiOSフレームワークです。フレームワークの「LinkBinaryWith Libraries」フェーズに追加してコンパイルしようとすると、クライアントプロジェクトフレームワークを使用すると、リンカーがシンボルの欠落について文句を言います-FacebookSDKをクライアントプロジェクトに追加する必要があります。すばらしい:クライアントアプリがFacebookを使用したい場合、競合の可能性はありません。
ただし、Flurry静的ライブラリで同じことを行うと、クライアントプロジェクトのコンパイル時にシンボルの重複エラーが発生します。 FacebookSDK.frameworkは単なるパッケージ化された静的ライブラリではないので、これは私を少し混乱させますか?
ukaszs-iMac:FacebookSDK.framework lukasz$ file Versions/A/FacebookSDK
Versions/A/FacebookSDK: Mach-O universal binary with 3 architectures
Versions/A/FacebookSDK (for architecture i386): current ar archive random library
Versions/A/FacebookSDK (for architecture armv7): current ar archive random library
Versions/A/FacebookSDK (for architecture cputype (12) cpusubtype (11)): current ar archive random library
だから私の質問は:
説明しているユースケースでは、独自のフレームワークではなく、アプリケーションからこれらの外部ライブラリにリンクする必要があります。どちらか一方にすることはできますが、両方にすることはできません。
これらの依存関係がアプリケーションの責任であると判断した場合は、「バイナリとライブラリのリンク」およびその他の明示的なリンク構成からそれらを削除し、これらのフレームワークとライブラリへのパスを使用してフレームワークプロジェクトを投影します。コンパイル時のシンボル(ただし、それらに対するリンクではありません)(つまり、ライブラリへのパスをLIBRARY_SEARCH_PATHSに含める必要があります)。
Cocoapodsを使用してください、それは簡単です( http://cocoapods.org/ )
アプリケーション開発者は、podfileを含め、依存関係をダウンロードする必要があります。
SDKの開発中は、SDKの上にあるリファレンスアプリケーション/デモアプリを使用してこれをシミュレートします。
フレームワークを構築するときは何もリンクしないでください。フレームワークのオブジェクトを使用して*.a
バイナリを作成するだけです。
また、クライアントアプリケーションが同じライブラリを直接追加したり、異なるバージョンのライブラリを必要としたりして競合が発生する可能性があるため、フレームワークに他のライブラリのコードを含めないでください。
もちろん、オブジェクトをコンパイルするために、フレームワーク内の他のライブラリから*.h
ヘッダーファイルを参照できます。
その結果、フレームワークのインストール手順では、必要な他の必要なフレームワーク/ライブラリ、サポートされているバージョン、リソースファイルの追加方法(存在する場合)などを詳しく説明する必要があります。 CocoaPods ' podspec 代わりに。
CocoaPodsを使用してフレームワークプロジェクトを構築しています。フレームワークは、CocoaPodsの3番目のライブラリを使用します。 Podfileは、フレームワークのターゲットへの依存関係をインストールすることを指定します。フレームワークをビルドすると、バイナリ内のすべてのライブラリが含まれます。
Use_frameworksを追加すると! Podfileでは、フレームワークが構築されるときに、サードパーティのライブラリは含まれません。
CocoaPodsを使用する必要があります。 Facebookへの依存は、CocoaPodに対してリンクすることで実行できます。
その特定のバージョンのFacebookをポッドに含めたい場合は、それをリポジトリに配置し、vendored_frameworks
プロパティを使用して参照できます。
同様に、libFlurry.aをベンダーにしたい場合は、s.vendored_libraries
を使用して行うことができます。
システムライブラリの場合、ベンダーにする必要はありません。 libZ.a
。
pod lib create YourPodName
を使用してCocoaPodを作成することを強くお勧めします。彼らは最近、これがどのように機能するかについてのメカニズムを変更しました、そしてそれは本当に素晴らしいです。
アプリのコンテキストでコードを使用する方法を示すサンプルプロジェクトを作成できます。
次に、私が今学んだ他の素晴らしいことの1つとして、誰かがpod try YourPodName
を実行すると、Xcodeプロジェクトが自動的にダウンロード、統合、実行されます。
CocoaPodsは問題を起こす価値があります。
CocoaPods依存関係マネージャーを使用します。ここに良いガイドがあります、