既存の Xamarin.Forms アプリの更新
Unified API を使用するように既存の Xamarin.Forms アプリを更新し、バージョン 1.3.1 に更新するには、次の手順に従います
重要
Xamarin.Forms 1.3.1 は Unified API をサポートする最初のリリースであるため、iOS アプリを Unified に移行すると同時に最新バージョンを使用するようにソリューション全体を更新する必要があります。 つまり、Unified のサポートのために iOS プロジェクトを更新するだけでなく、ソリューション内の "すべて" のプロジェクトでコードを編集する必要もあります。
更新は、次の 2 ステップで実行されます。
移行ツールで Visual Studio for Mac のビルドを使用して、iOS アプリを Unified API に移行します。
移行ツールを使用して、プロジェクトを自動的に更新します。
iOS アプリの更新に関する記事 (特に、カスタム レンダラーまたは依存関係サービス コードで) で説明されている手順に従って iOS ネイティブ API を更新します。
ソリューション全体を Xamarin.Forms バージョン 1.3 に更新します。
Xamarin.Forms 1.3.1 NuGet パッケージをインストールします。
共有コード内の
App
クラスを更新します。iOS プロジェクトの
AppDelegate
を更新します。Android プロジェクトの
MainActivity
を更新します。Windows Phone プロジェクトの
MainPage
を更新します。
1. iOS アプリ (統合移行)
移行の一部では、Xamarin.Forms をバージョン 1.3 にアップグレードして、Unified API をサポートする必要があります。 正しいアセンブリ参照を作成するには、まず、Unified API を使用するように iOS プロジェクトを更新する必要があります。
移行ツール
iOS プロジェクトをクリックして選択し、[プロジェクト] > [Xamarin.iOS Unified API に移行する...] を選択し、表示される警告メッセージに同意します。
これにより、次の操作が自動的に行われます。
- Unified 64 ビット API をサポートするようにプロジェクトの種類を変更。
- フレームワーク参照を Xamarin.iOS に変更 (古い monotouch 参照を置き換えます)。
MonoTouch
プレフィックスを削除するように、コード内の名前空間参照を変更。- Unified API の正しいビルド ターゲットを使用するように csproj ファイルを更新。
プロジェクトをクリーンおよびビルドして、修正する他のエラーがないことを確認します。 これ以上の操作は必要ありません。 これらの手順について詳しくは、Unified API のドキュメントを参照してください。
ネイティブ iOS API を更新する (必要な場合)
追加の iOS ネイティブ コード (カスタム レンダラーや依存関係サービスなど) を追加している場合は、追加の手動コード修正の実行が必要になる場合があります。 アプリを再コンパイルし、変更が必要な場合は追加情報について、「既存の iOS アプリの更新」の手順を参照してください。 必要な変更を特定するには、こちらのヒントも役立ちます。
2.Xamarin.Forms 1.3.1 への更新
iOS アプリが Unified API に更新されたら、ソリューションの残りの部分を Xamarin.Forms バージョン 1.3.1 に更新する必要があります。 これには、次のものが含まれます。
- 各プロジェクトで Xamarin.Forms NuGet パッケージを更新する。
- 新しい Xamarin.Forms
Application
、FormsApplicationDelegate
(iOS)、FormsApplicationActivity
(Android)、およびFormsApplicationPage
(Windows Phone) クラスを使用するようにコードを変更する。
これらの手順は、次のとおりです。
2.1 すべてのプロジェクトで NuGet を更新する
ソリューション内のすべてのプロジェクト (PCL (存在する場合)、iOS、Android、Windows Phone) について、NuGet パッケージ マネージャーを使用して Xamarin.Forms を 1.3.1 プレリリースに更新します。 Xamarin.Forms NuGet パッケージを削除してから再追加して、バージョン 1.3 に更新することをお勧めします。
Note
現在、Xamarin.Forms バージョン 1.3.1 は "プレリリース段階" です。 つまり、最新のプレリリース バージョンを表示するには、NuGet でプレリリース オプションを選択 (Visual Studio for Mac のチェックボックスまたは Visual Studio のドロップダウン リストを使用して) する必要があります。
重要
Visual Studio を使用している場合は、最新バージョンの NuGet パッケージ マネージャーがインストールされていることを確認してください。 Visual Studio の古いバージョンの NuGet では、Xamarin.Forms 1.3.1 の Unified バージョンが正しくインストールされません。 [ツール] > [拡張機能と更新プログラム...] に移動し、[インストール済み] リストをクリックして、Visual Studio 用 NuGet パッケージ マネージャーのバージョンが 2.8.5 以降であることを確認します。 それより古い場合は、更新プログラムの一覧をクリックして、最新バージョンをダウンロードします。
NuGet パッケージを Xamarin.Forms 1.3.1 に更新したら、各プロジェクトで次の変更を行って、新しい Xamarin.Forms.Application
クラスにアップグレードします。
2.2 ポータブル クラス ライブラリ (または共有プロジェクト)
App.cs ファイルを、次の内容に変更します。
App
クラスはApplication
から継承される。MainPage
プロパティは、表示する最初のコンテンツ ページに設定されている。
public class App : Application // superclass new in 1.3
{
public App ()
{
// The root page of your application
MainPage = new ContentPage {...}; // property new in 1.3
}
GetMainPage
メソッドを完全に削除し、代わりに Application
サブクラスに MainPage
property を設定します。
この新しい Application
基底クラスでは、アプリケーションのライフサイクルを管理するのに役立つ OnStart
、OnSleep
、および OnResume
オーバーライドもサポートされています。
その後、次に説明するように、App
クラスが、各アプリ プロジェクトの新しい LoadApplication
メソッドに渡されます。
2.3 iOS アプリ
AppDelegate.cs ファイルを次の内容に変更します。
- クラスは
FormsApplicationDelegate
から継承される (以前のUIApplicationDelegate
ではなく)。 LoadApplication
は、App
の新しいインスタンスにより呼び出される。
[Register ("AppDelegate")]
public partial class AppDelegate :
global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate // superclass new in 1.3
{
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init ();
LoadApplication (new App ()); // method is new in 1.3
return base.FinishedLaunching (app, options);
}
}
2.3 Android アプリ
MainActivity.cs ファイルを次の内容に変更します。
- クラスは
FormsApplicationActivity
から継承される (以前のFormsActivity
ではなく)。 LoadApplication
は、App
の新しいインスタンスにより呼び出される。
[Activity (Label = "YOURAPPNAM", Icon = "@drawable/icon", MainLauncher = true,
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity :
global::Xamarin.Forms.Platform.Android.FormsApplicationActivity // superclass new in 1.3
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
global::Xamarin.Forms.Forms.Init (this, bundle);
LoadApplication (new App ()); // method is new in 1.3
}
}
2.4 Windows Phone アプリ
MainPage (XAML と codebehind の両方) を更新する必要があります。
MainPage.xaml ファイルを次の内容に変更します。
- ルート XAML 要素が
winPhone:FormsApplicationPage
。 xmlns:phone
属性をxmlns:winPhone="clr-namespace:Xamarin.Forms.Platform.WinPhone;assembly=Xamarin.Forms.Platform.WP8"
に "変更"
更新された例を次に示します。これらのみを編集するだけで済みます (残りの属性は同じままにします)。
<winPhone:FormsApplicationPage
...
xmlns:winPhone="clr-namespace:Xamarin.Forms.Platform.WinPhone;assembly=Xamarin.Forms.Platform.WP8"
...>
</winPhone:FormsApplicationPage>
MainPage.xaml.cs ファイルを次の内容に変更します。
- クラスは
FormsApplicationPage
から継承される (以前のPhoneApplicationPage
ではなく)。 LoadApplication
は、Xamarin.FormsApp
クラスの新しいインスタンスで呼び出される。 Windows Phone には独自のApp
クラスが既に定義されているため、この参照を完全に修飾する必要がある場合があります。
public partial class MainPage : global::Xamarin.Forms.Platform.WinPhone.FormsApplicationPage // superclass new in 1.3
{
public MainPage()
{
InitializeComponent();
SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;
global::Xamarin.Forms.Forms.Init();
LoadApplication(new YOUR_APP_NAMESPACE.App()); // new in 1.3
}
}
トラブルシューティング
Xamarin.Forms NuGet パッケージを更新した後に、次のようなエラーが表示される場合があります。 これは、NuGet アップデーターが csproj ファイルから古いバージョンへの参照を完全に削除しなかった場合に発生します。
YOUR_PROJECT.csproj: エラー: このプロジェクトは、このコンピューターにはない NuGet パッケージを参照しています。 NuGet パッケージの復元を有効にしてダウンロードしてください。 詳細については、https://go.microsoft.com/fwlink/?LinkID=322105を参照してください。 不足しているファイル: ../../packages/Xamarin.Forms.1.2.3.6257/build/portable-win+net45+wp80+MonoAndroid10+MonoTouch10/Xamarin.Forms.targets. (YOUR_PROJECT)
これらのエラーを修正するには、テキスト エディターで csproj ファイルを開き、以下に示す要素など、古いバージョンの Xamarin.Forms を参照する <Target
要素を探します。 この要素全体を csproj ファイルから手動で削除し、変更を保存する必要があります。
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see https://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.1.2.3.6257\build\portable-win+net45+wp80+MonoAndroid10+MonoTouch10\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.1.2.3.6257\build\portable-win+net45+wp80+MonoAndroid10+MonoTouch10\Xamarin.Forms.targets'))" />
</Target>
これらの古い参照が削除されると、プロジェクトのビルドは成功です。
考慮事項
既存の Xamarin.Forms プロジェクトを 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.Forms アプリケーションがバージョン 1.3.1 に更新され、iOS アプリが Unified API (iOS プラットフォームで 64 ビット アーキテクチャをサポートする) に移行されました。
前述のように、Xamarin.Forms アプリにカスタム レンダラーや依存関係サービスなどのネイティブ コードが含まれている場合は、Unified API で導入された新しい型を使用するために更新が必要になる場合もあります。