web-dev-qa-db-ja.com

iOSフレームワークプロジェクトの依存関係の処理

この方法を使用してiOSフレームワークプロジェクトを作成しました: https://github.com/jverkoey/iOS-Framework

かなりうまく機能しますが、フレームワークが機能するために必要なライブラリ/フレームワークを含める方法、特に、フレームワークを使用するサードパーティのクライアントアプリがこれらのライブラリを含めることができるようにする方法について少し混乱しています競合することなく同様に。

私のフレームワークコードがこれら2つのことを必要としているとしましょう:

  • FacebookSDK.framework
  • libFlurry.a

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

だから私の質問は:

  1. フレームワークに埋め込まれたライブラリ(Facebookなど)がフレームワークプロジェクト製品にリンクされていないのに、.aファイルとして含まれているライブラリがリンクされているのはなぜですか?
  2. フレームワークを使用するクライアントアプリでもこの特定の静的ライブラリが必要な場合に重複シンボルエラーが発生しないように、フレームワークに.aファイルを含める方法は?
18
Łukasz Sromek

説明しているユースケースでは、独自のフレームワークではなく、アプリケーションからこれらの外部ライブラリにリンクする必要があります。どちらか一方にすることはできますが、両方にすることはできません。

これらの依存関係がアプリケーションの責任であると判断した場合は、「バイナリとライブラリのリンク」およびその他の明示的なリンク構成からそれらを削除し、これらのフレームワークとライブラリへのパスを使用してフレームワークプロジェクトを投影します。コンパイル時のシンボル(ただし、それらに対するリンクではありません)(つまり、ライブラリへのパスをLIBRARY_SEARCH_PATHSに含める必要があります)。

17
quellish
  1. Cocoapodsを使用してください、それは簡単です( http://cocoapods.org/

  2. アプリケーション開発者は、podfileを含め、依存関係をダウンロードする必要があります。

  3. SDKの開発中は、SDKの上にあるリファレンスアプリケーション/デモアプリを使用してこれをシミュレートします。

5
rustylepord

フレームワークを構築するときは何もリンクしないでください。フレームワークのオブジェクトを使用して*.aバイナリを作成するだけです。

また、クライアントアプリケーションが同じライブラリを直接追加したり、異なるバージョンのライブラリを必要としたりして競合が発生する可能性があるため、フレームワークに他のライブラリのコードを含めないでください。

もちろん、オブジェクトをコンパイルするために、フレームワーク内の他のライブラリから*.hヘッダーファイルを参照できます。

その結果、フレームワークのインストール手順では、必要な他の必要なフレームワーク/ライブラリ、サポートされているバージョン、リソースファイルの追加方法(存在する場合)などを詳しく説明する必要があります。 CocoaPods ' podspec 代わりに。

2
Rivera

CocoaPodsを使用してフレームワークプロジェクトを構築しています。フレームワークは、CocoaPodsの3番目のライブラリを使用します。 Podfileは、フレームワークのターゲットへの依存関係をインストールすることを指定します。フレームワークをビルドすると、バイナリ内のすべてのライブラリが含まれます。

Use_frameworksを追加すると! Podfileでは、フレームワークが構築されるときに、サードパーティのライブラリは含まれません。

1
Evan

CocoaPodsを使用する必要があります。 Facebookへの依存は、CocoaPodに対してリンクすることで実行できます。

その特定のバージョンのFacebookをポッドに含めたい場合は、それをリポジトリに配置し、vendored_frameworksプロパティを使用して参照できます。

同様に、libFlurry.aをベンダーにしたい場合は、s.vendored_librariesを使用して行うことができます。

システムライブラリの場合、ベンダーにする必要はありません。 libZ.a

pod lib create YourPodNameを使用してCocoaPodを作成することを強くお勧めします。彼らは最近、これがどのように機能するかについてのメカニズムを変更しました、そしてそれは本当に素晴らしいです。

アプリのコンテキストでコードを使用する方法を示すサンプルプロジェクトを作成できます。

次に、私が今学んだ他の素晴らしいことの1つとして、誰かがpod try YourPodNameを実行すると、Xcodeプロジェクトが自動的にダウンロード、統合、実行されます。

CocoaPodsは問題を起こす価値があります。

1
funroll

CocoaPods依存関係マネージャーを使用します。ここに良いガイドがあります、

7分間のビデオチュートリアル

0
sleepwalkerfx