iOS、Mac、バインド プロジェクトのネイティブ参照
"ネイティブ参照を使用すると、ネイティブ フレームワークを Xamarin.iOS、Xamarin.Mac、またはバインド プロジェクトに埋め込むことができます。"
iOS 8.0 以降、アプリ拡張機能と Xcode のメイン アプリの間でコードを共有するための埋め込みフレームワークを作成できるようになりました。 ネイティブ参照機能を使用すると、これらの埋め込みフレームワーク (Xcode で作成) を Xamarin.iOS で利用できます。
重要
任意の種類の Xamarin.iOS または Xamarin.Mac プロジェクトから埋め込みフレームワークを作成することはできません。ネイティブ参照で使用できるのは、既存のネイティブ (Objective-C) フレームワークのみです。
用語
iOS 8 (以降) では、埋め込みフレームワークとして、静的にリンクされた埋め込みフレームワークと動的にリンクされた埋め込みフレームワークの両方を使用できます。 それらを適切に配布するには、アプリでサポートする各デバイス アーキテクチャのすべての "スライス" を含む "ファット" フレームワークを作成する必要があります。
静的フレームワークと動的フレームワーク
静的フレームワークはコンパイル時にリンクされますが、動的フレームワークは実行時にリンクされるため、再リンクせずに変更できます。 iOS 8 より前のサードパーティ製フレームワークを使用していた場合は、アプリにコンパイルされた静的フレームワークを使用してことになります。 詳細については、Apple の動的ライブラリ プログラミングに関するドキュメントを参照してください。
埋め込みフレームワークとシステム フレームワーク
埋め込みフレームワークはアプリ バンドルに含まれており、サンドボックスを介して特定のアプリにのみアクセスできます。 システム フレームワークはオペレーティング システム レベルで格納され、デバイス上のすべてのアプリで使用できます。 現在、オペレーティング システム レベルのフレームワークを作成できるのは、Apple だけです。
シン フレームワークとファット フレームワーク
シン フレームワークには、特定のシステム アーキテクチャ用のコンパイル済みコードのみが含まれ、ファット フレームワークには、複数のアーキテクチャ用のコードが含まれます。 フレームワークにコンパイルされた各アーキテクチャ固有のコードベースは、"スライス" と呼ばれます。 そのため、たとえば、2 つの iOS Simulator アーキテクチャ (i386 と X86_64) 用にコンパイルされたフレームワークがある場合、そのフレームワークには、2 つのスライスが含まれることになります。
このサンプル フレームワークをアプリと共に配布しようとすると、Simulator では正しく実行されますが、フレームワークには iOS デバイス用のコード固有のスライスが含まれていないため、デバイスでは失敗します。 フレームワークがすべてのインスタンスで確実に動作できるようにするには、arm64、armv7、armv7s などのデバイス固有のスライスも含める必要があります。
埋め込みフレームワークの使用
Xamarin.iOS または Xamarin.Mac アプリで埋め込みフレームワークを使用するには、2 つの手順 (ファット フレームワークの作成とフレームワークの埋め込み) を完了する必要があります。
ファット フレームワークの作成
前述のとおり、アプリで埋め込みフレームワークを使用できるようにするには、そのフレームワークが、アプリが実行されるデバイスのすべてのシステム アーキテクチャ スライスを含むファット フレームワークである必要があります。
フレームワークと使用元のアプリが同じ Xcode プロジェクト内にある場合、Xcode は同じビルド設定を使用してフレームワークとアプリの両方をビルドするため、これは問題ありません。 Xamarin アプリは埋め込みフレームワークを作成できないため、この手法は使用できません。
この問題を解決するには、lipo
コマンド ライン ツールを使用して、2 つ以上のフレームワークを、必要なスライスをすべて含む 1 つのファット フレームワークにマージできます。 lipo
コマンドの操作の詳細については、ネイティブ ライブラリのリンクに関するドキュメントを参照してください。
フレームワークの埋め込み
ネイティブ参照を使用して Xamarin.iOS または Xamarin.Mac プロジェクトにフレームワークを埋め込むには、次の手順が必要です。
Xamarin.iOS、Xamarin.Mac、またはバインディング プロジェクトを新規作成するか、既存のものを開きます。
[ソリューション エクスプローラー]で、プロジェクト名を右クリックし、[追加]>[ネイティブ参照の追加] の順に選択します。
[開く] ダイアログ ボックスから、埋め込むネイティブ フレームワークの名前を選択し、[開く] ボタンをクリックします。
フレームワークがプロジェクトのツリーに追加されます。
プロジェクトがコンパイルされると、ネイティブ フレームワークがアプリのバンドルに埋め込まれます。
アプリ拡張機能と埋め込みフレームワーク
内部的には、Xamarin.iOS はこの機能を利用して、フレームワークとして Mono ランタイムとリンクできます (デプロイ先が >= iOS 8.0 の場合)。これにより、拡張機能があるアプリのアプリ サイズが大幅に削減されます (Mono ランタイムは、コンテナー アプリ用に 1 回と拡張機能ごとに 1 回ずつではなく、アプリ バンドル全体用に 1 回だけ含まれるためです)。
すべての拡張機能には iOS 8.0 が必要であるため、拡張機能はフレームワークとして Mono ランタイムとリンクします。
拡張機能がないアプリと iOS をターゲットとするアプリ
まとめ
この記事では、Xamarin.iOS または Xamarin.Mac アプリケーションへのネイティブ フレームワークの埋め込みについて詳しく説明しました。