次の方法で共有


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 プロジェクトにフレームワークを埋め込むには、次の手順が必要です。

  1. Xamarin.iOS、Xamarin.Mac、またはバインディング プロジェクトを新規作成するか、既存のものを開きます。

  2. [ソリューション エクスプローラー]で、プロジェクト名を右クリックし、[追加]>[ネイティブ参照の追加] の順に選択します。

    In the Solution Explorer, right-click on the project name and select Add Native Reference

  3. [開く] ダイアログ ボックスから、埋め込むネイティブ フレームワークの名前を選択し、[開く] ボタンをクリックします。

    Select the name of the Native Framework to embed and click the Open button

  4. フレームワークがプロジェクトのツリーに追加されます。

    The framework will be added to the projects tree

プロジェクトがコンパイルされると、ネイティブ フレームワークがアプリのバンドルに埋め込まれます。

アプリ拡張機能と埋め込みフレームワーク

内部的には、Xamarin.iOS はこの機能を利用して、フレームワークとして Mono ランタイムとリンクできます (デプロイ先が >= iOS 8.0 の場合)。これにより、拡張機能があるアプリのアプリ サイズが大幅に削減されます (Mono ランタイムは、コンテナー アプリ用に 1 回と拡張機能ごとに 1 回ずつではなく、アプリ バンドル全体用に 1 回だけ含まれるためです)。

すべての拡張機能には iOS 8.0 が必要であるため、拡張機能はフレームワークとして Mono ランタイムとリンクします。

拡張機能がないアプリと iOS をターゲットとするアプリ

まとめ

この記事では、Xamarin.iOS または Xamarin.Mac アプリケーションへのネイティブ フレームワークの埋め込みについて詳しく説明しました。