既存の iOS アプリの更新
次の手順に従って、Unified API を使用するように既存の Xamarin.iOS アプリを更新します。
Unified API を使用するように既存のアプリを更新するには、プロジェクト ファイル自体と、アプリケーション コードで使用される名前空間と API を変更する必要があります。
64 ビットへの道
Xamarin.iOS モバイル アプリケーションの 64 ビット デバイス アーキテクチャをサポートするには、新しい Unified API が必要です。 2015 年 2 月 1 日の時点で、Apple では、iTunes App Store へのすべての新しいアプリの提出で 64 ビット アーキテクチャをサポートしていることを要求しています。
Xamarin には、Classic API から Unified API への移行プロセスを自動化するための、Visual Studio for Mac と Visual Studio の両方向けのツールが用意されています。または、プロジェクト ファイルを手動で変換することもできます。 自動ツールの使用を強くお勧めしますが、この記事では、両方の方法について説明します。
開始前の作業...
既存のコードを Unified API に更新する前に、すべての "コンパイル警告" を排除することを強くおすすめします。 Unified に移行すると、Classic API の多くの "警告" がエラーになります。 Classic API からのコンパイラ メッセージは、更新内容に関するヒントが含まれていることが多いため、開始する前に修正する方が簡単です。
自動更新
警告が修正されたら、Visual Studio for Mac または Visual Studio で既存の iOS プロジェクトを選択し、[プロジェクト] メニューから [Xamarin.iOS Unified API に移行する] を選択します。 次に例を示します。
自動移行が実行される前に、この警告に同意する必要があります (当然、この冒険に着手する前に、バックアップ/ソース管理があることを確認する必要があります)。
このツールは基本的に、以下の手動更新に関するセクションで説明されているすべての手順を自動化します。これは、既存の Xamarin.iOS プロジェクトを Unified API に変換するための推奨される方法です。
手動で更新する手順
ここでも、警告が修正されたら、次の手順に従って、新しい Unified API を使用するように Xamarin.iOS アプリを手動で更新します。
1.プロジェクト タイプとビルド ターゲットを更新する
csproj ファイルのプロジェクト フレーバーを 6BC8ED88-2882-458C-8E55-DFD12B67127B
から FEACFBD2-3405-455C-9665-78FE426C6842
に変更します。 次に示すように、テキスト エディターで csproj ファイルを編集し、<ProjectTypeGuids>
要素の最初の項目を置き換えます。
次に示すように、Xamarin.MonoTouch.CSharp.targets
を含む Import 要素を Xamarin.iOS.CSharp.targets
に変更します。
2.プロジェクト参照を更新する
iOS アプリケーション プロジェクト の [参照] ノードを展開します。 最初は、このスクリーンショットのような *broken- monotouch 参照が表示されます (プロジェクト タイプを変更したばかりであるため)。
iOS アプリケーション プロジェクトを右クリックして参照を編集し、モノタッチ参照をクリックし、赤い [X] ボタンを使用して削除します。
次に、参照リストの末尾までスクロールし、Xamarin.iOS アセンブリをオンにします。
[OK] を押して、プロジェクト参照の変更を保存します。
3.名前空間から MonoTouch を削除する
using
ステートメント内の名前空間から、またはクラス名が完全修飾されている場所 (たとえば、MonoTouch.UIKit
は単に UIKit
になります) から MonoTouch プレフィックスを削除します。
4.型を再マップする
ネイティブ型が導入され、たとえば System.Drawing.RectangleF
のインスタンスなど以前に使用されていた一部の型が CoreGraphics.CGRect
に置き換えられました。 型の完全な一覧は、「ネイティブ型」ページにあります。
5.メソッドのオーバーライドを修正する
一部 UIKit
のメソッドでは、新しいネイティブ型 (nint
など) を使用するようにシグネチャが変更されています。 カスタム サブクラスがこれらのメソッドをオーバーライドすると、シグネチャは一致しなくなり、エラーが発生します。 ネイティブ型を使用して新しいシグネチャに一致するようにサブクラスを変更することで、これらのメソッドのオーバーライドを修正します。
例としては、nint
を返すように public override int NumberOfSections (UITableView tableView)
を変更したり、public override int RowsInSection (UITableView tableView, int section)
の戻り値の型とパラメーター型の両方を nint
に変更します。
考慮事項
既存の Xamarin.iOS プロジェクトを Classic API から新しい Unified API に変換する場合、そのアプリが 1 つ以上のコンポーネントまたは NuGet パッケージに依存している場合は、次の事項を考慮する必要があります。
コンポーネント
アプリケーションに含めたコンポーネントも Unified API に更新する必要があります。そうしないと、コンパイルの試行時に競合が発生します。 含まれているコンポーネントについては、現在のバージョンを、Unified API をサポートする Xamarin コンポーネント ストアの新しいバージョンに置き換えて、クリーン ビルドを実行します。 作成者によってまだ変換されていないコンポーネントには、コンポーネント ストアに 32 ビットのみの警告が表示されます。
NuGet のサポート対象
Unified API サポートを使用するために NuGet に変更を加えましたが、NuGet の新しいリリースはないため、NuGet に新しい API を認識させる方法を評価中です。
それまでは、コンポーネントと同様に、プロジェクトに含めた NuGet パッケージを、Unified API をサポートするバージョンに切り替えて、後でクリーン ビルドを実行する必要があります。
重要
アプリケーションを Unified API に変換した後、"Error 3 Cannot include both 'monotouch.dll' and 'Xamarin.iOS.dll' in the same Xamarin.iOS project - 'Xamarin.iOS.dll' is referenced explicitly, while 'monotouch.dll' is referenced by 'xxx, Version=0.0.000, Culture=neutral, PublicKeyToken=null'" という形式のエラーが表示されたら、通常は、Unified API に更新されていないコンポーネントまたは NuGet パッケージがプロジェクト内に存在することが原因です。 既存のコンポーネントまたは NuGet を削除し、Unified API をサポートするバージョンに更新し、クリーン ビルドを実行する必要があります。
Xamarin.iOS アプリの 64 ビット ビルドの有効化
Unified API に変換された Xamarin.iOS モバイル アプリケーションの場合、開発者は引き続きアプリのオプションから 64 ビット コンピューター用のアプリケーションのビルドを有効にする必要があります。 64 ビット ビルドを有効にする方法の詳細については、32/64 ビット プラットフォームに関する考慮事項のドキュメントの「Xamarin.iOS アプリの 64 ビット ビルドの有効化」を参照してください。
最後に
自動または手動の方法を使用して Xamarin.iOS アプリケーションを Classic API から Unified API に変換するかどうかに関係なく、さらに手動で介入する必要があるインスタンスがいくつかあります。 既知の問題と回避策については、「Unified API へのコードの更新に関するヒント」のドキュメントを参照してください。