September 2016
Volume 31 Number 9
Xamarin - Xamarin によるクロスプラットフォームの生産性
Kevin Ashley | September 2016
最近のシリコン バレーでは、投資家も開発者も、使用するテクノロジについてはきわめて保守的なのがわかります。多くの場合、まず雇われるのは iOS の開発者です。(資金に余裕があれば) Android や Windows の開発者が続いて雇用されます。ですが、このやり方は複数回のコードの書き直しが必要になるため、きわめて非効率です。それは、iOS の開発者は Objective-C を使用し、Android の開発者は Java を使用し、Windows 開発者は C# を使用するためです。それぞれ開発者が情報交換することはほとんどなく、ましてやコードの共有に参加することもありません。結果として、プラットフォーム間でのアプリの一貫性はなくなり、開発の違いやそれぞれの開発テクノロジをサポートするために多額の費用を負担することになるのが一般的です。生産性を高める効果的で一貫性のある開発戦略にとっては、Xamarin のようなクロスプラットフォーム テクノロジを使用することが不可欠です。また、ネイティブの事前 (AOT: Ahead Of Time) コンパイル テクノロジも登場しています。これにより、C# などの高級言語からネイティブ プラットフォーム向けの静的コードにネイティブに変換できます。その結果、Android、iOS、Windows の開発者を個々に必要とするプログラミング モデルは、時代遅れになり始めています。
この流れは、従来のアプリにとっては新たな方向性ですが、ゲームなどの分野では既に成功を収めています。たとえば、iOS、Android、および Windows 向けの 3D ゲームの半数以上は Unity で開発されています。Unity でゲームをビルドする場合、通常は Mono のサブセット上に C# で開発します。これは、Xamarin で C# を使うのとほぼ同じです。Unity のゲームは、Windows、Android、iOS、OS X、Xbox、PlayStation など、20 種類以上のプラットフォームで実行されます。これは、ゲーム以外のアプリでも踏襲できる優れた道筋です。この道筋に沿って優れたプラットフォームを提供するのが Xamarin です。
つまり、ゲーム以外の他のアプリにも同じアプローチを応用するのが、 Xamarin です。 筆者は、Active Fitness というクラウド ベースのフィットネス プラットフォームとモバイル アプリの作成に、Xamarin を使用しています (activefitness.co、英語)。このアプリのユーザーは、全世界で 200 万人を超えています。開発サイクルの早い段階から Xamarin を使い始めました。当時の Xamarin はごく初期のバージョンでした。その後、Microsoft Azure クラウドを基盤に、Windows、iOS、および Android 向けのクロスプラットフォーム ソリューションを作成しました。図 1 に示した Active Fitness は、iOS、Windows、Android 向けのネイティブ アプリで、90 パーセント以上のコードを共有しています。コードを共有するメリットは、生産性の向上です。また、Xamarin.Forms (bit.ly/2a8Yo4g、英語) を含め、Xamarin の大半はオープン ソースで、優れたコミニュティによって支えられています。埋め込みシステムに対する AOT サポートにより、パフォーマンスはネイティブ コードと変わりません。また、無料の Community Edition を含め、Visual Studio には Xamarin が無償で含まれています。
図 1 3D 地図とリッチな UI のデモを実行中の Active Fitness
Xamarin によるクロスプラットフォーム アプリのデザイン面
数年前まで、モバイル アプリのデザインはプラットフォームごとにまったく異なっていました。たとえば、iOS アプリのデザインは、Android アプリや Windows アプリのデザインとはまったく似ていませんでした。もうこのようなことはありません。今日では、Windows、Android、iOS 向けの最新アプリは、使用する概念やデザイン パラダイムがよく似ています。何が起こったのでしょうか。 Microsoft はユニバーサル Windows プラットフォーム (UWP) アプリが使用する最新のデザイン言語を作成しています。Google はマテリアル デザインを採用し、Apple は最新様式の OS デザインを導入しています。こうした変化がすべて相まって、iOS、Android、Windows の各アプリの外観と操作性がいっそう統一され、開発者の作業を簡略化しています (図 2 参照)。また、開発者が一様に Font Awesome のような目立つフォントを使用するようになったため、必然的に、複数のプラットフォームでよく似た典型的な動作が生み出されています。もちろん、プラットフォームには、Windows のライブ タイルなど、まだまだ見た目の違いがあります。しかし、クロスプラットフォーム アプリをビルドすると、コアとなる部分を作成してから、そのような違いを簡単に追加できるようになります。
図 2 Windows (左)、Android (中央)、iOS (右) の Active Fitness
Xamarin で開発するときは、プラットフォームごとに美しい外観を持つ UI を、Visual Studio 内部から直接作成できます。つまり、iOS では Storyboards、Android では XML、Windows では XAML を使いながら、すべてのコントロールやウィジェットと、各ベンダーが提供する膨大な数のカスタム コントロールにアクセスできるようになります。また、Xamarin では、プラットフォームごとに C# からすべての API に完全にアクセスできるようにしています。
Xamarin.Forms ライブラリは、共有 UI をビルドするための API の抽象化を実現します。このライブラリにより、多くの設計概念が Xamarin カスタム レンダラーを通じてラットフォームごとのネイティブ コントロールに自動変換されます。そのため、クロスプラットフォーム コントロールを各プラットフォームのネイティブ表現にカスタマイズできるようになります。したがって、真のクロスプラットフォーム アプリによる生産性の向上というメリットだけでなく、制限なくカスタマイズできるというメリットも得られます。
Xamarin.Forms を使用する大きなメリットの 1 つは、アドオン (プロジェクトに追加できるライブラリ) にあります。アドオンは、アプリの生産性とライフサイクル管理の点で大きな価値があります。それは、アドオンにより、プラットフォームのリリース ライフサイクルへの依存度が低いコードを作成できるためです。プラットフォームのリリース ライフサイクルに合わせてコードを調整する作業は、通常、きわめて時間がかかります。Xamarin は常に、iOS、Android、Windows のメジャー リリース当日に互換性が確保されます。Xamarin はオープン ソースになったため、Xamarin.Forms にコントロールを追加する必要がある場合、そのソース コードを確認するか、Xamarin.Forms 用の GitHub リポジトリに参加して、いつでも自身でそのコントロールを追加できます。また、Xamarin では、ネイティブ プラットフォーム向けのカスタム コントロール レンダラーを通じて、事実上無制限に拡張できるオプションを提供しています。既に XAML アプリが手元にあれば、物事は簡単です。Xamarin.Forms は XAML 言語のバリエーションにすぎないので、Silverlight、UWP、または XAML を使用した経験があれば、iOS や Android 向けに同等の機能を簡単に追加できます。
Xamarin によるマスター/詳細ナビゲーションの作成
ここからは 1 つの例に注目して、Xamarin を使するメリットを見ていきます。ここでは、オープン ソースの Xamarin サンプル リポジトリ (bit.ly/29Tk9VJ、英語) から、マスター/詳細 (別名「ハンバーガー」) ナビゲーション パターンを含む iOS、Android、および Windows の典型的なアプリを取り上げます。従来どおりに iOS、Android、Windows の開発者がそれぞれの手法でこのアプリを作成すると、Objective-C、Java、および C# の 3 つの個別のプロジェクトが完成します。さらに、プロジェクトごとに別のコントロールを使用しなければなりません。 Windows では SplitView を使い、iOS と Android でも同様のパターンを使用します。しかし、Xamarin.Forms では 1 つのインスタンスを使って、すべてのプラットフォームに対応する作業をすべて行います (図 3 参照)。
図 3 Android、iOS、および Windows をターゲットにする Xamarin のマスター/詳細プロジェクト
移植可能なプロジェクトの App.cs ファイル では、アプリのルート ページのインスタンスを作成します。
public App ()
{
MainPage =
new MasterDetailPageNavigation.
MainPage ();
}
プロジェクト コードの大半が移植可能なプロジェクトに常駐し、すべての OS で共有されます。また、Xamarin.Forms では XAML を使用できます。UWP ネイティブの SplitView コントロールに詳しければ、図 4 の XAML はかなり簡単です。
図 4 XAML を使用したマスター/詳細ページの作成
<?xml version="1.0" encoding="UTF-8"?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="https://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MasterDetailPageNavigation;assembly=MasterDetailPageNavigation"
x:Class="MasterDetailPageNavigation.MainPage">
<MasterDetailPage.Master>
<local:MasterPage x:Name="masterPage" />
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
<NavigationPage>
<x:Arguments>
<local:ContactsPage />
</x:Arguments>
</NavigationPage>
</MasterDetailPage.Detail>
</MasterDetailPage>
Xamarin は、条件コンパイルとプラットフォーム選択により、開発者が実現できることに関して十分な柔軟性を提供しています。以下のコードは、プラットフォームが Windows の場合に、マスター ページのアイコンを変更します。
if (Device.OS == TargetPlatform.Windows)
{
Master.Icon = "hamburger.png";
}
デバイス固有のコードと Xamarin
ここまでは順調です。問題は、今回の Xamarin コードで、物理プラットフォームにどこまで近づけるかにあります。 つまり、さまざまな種類のデバイス向けに作成するコード部分を区別できるかどうかが問題です。 さいわい、Xamarin はネイティブ コーディングと API アクセスをサポートする数少ないプラットフォーム テクノロジの 1 つです。UWP アプリがデバイス ファミリ (スマートフォン、タブレット、デスクトップ) を区別できるのと同じように、Xamarin には非常に便利な Device.Idiom セレクターがあります (図 5 参照)。
図 5 Device.Idiom を使用したプラットフォームの選択
switch (Device.Idiom)
{
case TargetIdiom.Phone:
heading.Text += " Phone ";
break;
case TargetIdiom.Tablet:
heading.Text += " Tablet ";
break;
case TargetIdiom.Desktop:
heading.Text += " Desktop ";
break;
default:
heading.Text += " unknown ";
break;
}
図 6 は、もう 1 つの非常に便利なセレクター Device.OnPlatform を示しています。このセレクターを使用して、分離コードと XAML の両方で、ターゲットの OS に応じて異なる動作を実行させます。
図 6 Device.OnPlatform を使用したターゲット プラットフォームの区別
// Device.OnPlatform (Action)
//
var box = new BoxView {
Color = Color.Green,
WidthRequest = Device.OnPlatform (30, 40, 50),
HorizontalOptions = LayoutOptions.Center
};
Device.OnPlatform(
iOS: () =>{
box.Color = box.Color.MultiplyAlpha(0.5);
heading.TextColor = Color.Blue;
},
Android: () =>{
box.Color = box.Color.AddLuminosity(0.3);
heading.TextColor = Color.FromRgb(115, 129, 130);
},
WinPhone: () =>{
box.Color = box.Color.AddLuminosity(0.3);
heading.TextColor = Color.Accent;
},
Default: () =>{
heading.Text = "what platform is this?!" + Device.OS;
}
);
XAML の場合、Xamarin は以下の例のように、さまざまなプラットフォームをサポートする OnPlatform タグを追加しています。
<Button Text="Start Timer"
Clicked="TimerClicked"
BackgroundColor="Gray"
HorizontalOptions="Center">
<Button.WidthRequest>
<OnPlatform x:TypeArguments="x:Double"
iOS="200"
Android="300"
WinPhone="100" />
</Button.WidthRequest>
</Button>
では、Xamarin.Forms が提供するコントロールを、ネイティブ プラットフォームに対してカスタマイズする場合はどうすればよいでしょう。 これには、先ほど説明したカスタム レンダラーという Xamarin 機能を使います。このカスタム レンダラーが柔軟性を提供します。カスタム レンダラーは組み込みオブジェクトから派生できるクラスで、プラットフォーム固有の実装に機能を提供します。では、独自の CustomMap コントロールをビルドしてみましょう。
public class CustomMap : Map
{
public List<CustomPin> CustomPins { get; set; }
}
ネイティブ プラットフォームでは、このオブジェクトのシグネチャが以下のようになります。
[assembly:ExportRenderer (typeof(CustomMap), typeof(CustomMapRenderer))]
これにより、Android、iOS、および Windows では、今回の Map コントロールのルック アンド フィールをいつでもカスタマイズできるようになります。興味深いことに、Xamarin Map コントロールのラッパーは Windows の Windows Maps コントロール、Android の Google Maps コントロール、iOS のネイティブ iOS Maps コントロールをネイティブにラップしています。カスタム レンダラーを使えば、 ほぼすべてのコントロールをカスタマイズできます。 Map コントロールはかなり洗練された例ですが、ボタン、ラベル、スライダーなど、Xamarin.Forms で利用可能なすべてのコントロールをカスタマイズできます。
Xamarin.Forms 2.2 では、Xamarin にネイティブな埋め込みが含まれるようになります。これにより、Xamarin.Forms アプリに任意のネイティブ コントロールを追加できるようになります (bit.ly/29IEvxH、英語)。
Xamarin からクラウドにアクセスする
Azure は以前からクロスプラットフォーム対応で、iOS のサンプル、Android のサンプル、専用クロスプラットフォームのサンプルや、Xamarin のサポートなど、多種多様なプラットフォーム向けのさまざまな SDK を備えています。そのため、Active Fitness アプリは、200 万人までユーザーを広げることができました。Azure の信頼性、サポート、およびパフォーマンスのおかげで、ランニング、ジョギングなどのさまざまなスポーツ アクティビティを毎日続ける多数のユーザーが何千万台ものデバイスから時間を問わず接続してくる状態に対応できています。Azure Web サイトには、Xamarin 専用の優れたガイドがいくつか見つかります。これらは、アプリに最適な Microsoft クラウド サービスを見つけるのに役立ちます (bit.ly/2a5kciF、英語)。では、ここで、モバイル アプリにクラウドが非常に役立つ一般的な分野を、いくつか紹介します。
認証: ユーザーを認証または識別する必要がある場合、Xamarin アプリでは、おそらくクラウド サービスを使用する必要があります。使用方法については、bit.ly/29HlDD3 (英語) を参照してください。
アプリへのプッシュ通知の追加: プッシュ通知は、アプリに通信メカニズムを提供するだけでなく、タイルなどのプラットフォーム固有の機能を更新するのに役立ちます。詳細については、bit.ly/29HlDD3 (英語) を参照してください。
オフライン同期: 毎日使用するモバイル アプリは常にオンラインになっているとは限りません。デバイスがバックエンドに接続していないときでも、データをシームレスに同期する必要があります。断続的に接続されるデータ セットについては、MSDN マガジンのコラム (msdn.com/magazine/dn890372) と、Xamarin アプリのクイック スタート (bit.ly/29QkXqT、英語) を参照してください。
ストレージ、通知、認証などの多数のクラウド サービスを統合する場合は、Azure Mobile Apps が優れた出発点になります。Xamarin アプリ専用のチュートリアル (bit.ly/29K3IHi、英語) を参照してください。
拡張機能、コンポーネント、およびプラグイン
拡張機能、コンポーネント、およびプラグインの充実したサポートによって、Xamarin は成功を収め、進化してきました。GitHub 上または NuGet 経由で、多くの拡張機能を入手できます。たとえば、Android サポート ライブラリ、Google Play サービス クライアント ライブラリ、Facebook SDK、OxyPlot のようなイベント グラフ作成ライブラリなど、Xamarin やそのコミュニティによってサポートされているライブラリもあります。プラグインは、開発者が共有コードからネイティブ機能にアクセスできるようにする独自のサービスです。つまり、GPS 機能にアクセスするために、コードを 3 回作成する必要がなくなります。NuGet パッケージをダウンロードするだけで、共有コードから GPS に即座にアクセスできます。オープン ソースのプラグインもあれば、開発者にがサポートするプラグインもあります。たとえば、James Montemagno は、Connectivity、Settings、Media など、Xamarin 対応の多数のプラグインを開発しています (bit.ly/2a2mM7J、英語)。
図 7 に、Xamarin 開発に慣れてきた方にお勧めする便利な拡張機能をいくつか紹介します。
図 7 Xamarin の拡張機能
名前 | 説明 | NuGet リンク | GitHub のドキュメントとソース |
バッテリー ステータス | バッテリー レベル、充電状態、充電タイプを収集します | bit.ly/2a4gbZ6 (英語) | bit.ly/2a5Ofqm (英語) |
バーコード スキャナー | ZXing.NET.Mobile を使ってバーコードのスキャンと作成を行います | bit.ly/2a5Ofqm (英語) | bit.ly/29QykY9 (英語) |
コンパス | デバイス コンパスの向きにアクセスします | bit.ly/2a32UAZ (英語) | bit.ly/29KfcKV (英語) |
接続 | 接続の種類や接続可否など、ネットワーク接続の情報を取得します | bit.ly/29QDplO (英語) | bit.ly/2a33PBr (英語) |
暗号化 | PCL Crypto によって Crypto API の一貫性のある移植可能なセットが提供されます | bit.ly/29Qz5AE (英語) | bit.ly/29PzwAb (英語) |
デバイス情報 | OS、モデル、バージョン、ID など、デバイスに関するプロパティを取得します | bit.ly/29PzPeg (英語) | bit.ly/29QzSBq (英語) |
デバイスの動き | 加速度計、ジャイロスコープ、磁力計、およびコンパスにアクセスできるようにします | bit.ly/2a6SzTk (英語) | bit.ly/2a35maG (英語) |
埋め込みリソース | クロスプラットフォームで使用するための埋め込みリソースをアンパックします | bit.ly/29J6Wf3 (英語) | bit.ly/29J6z46 (英語) |
外部地図 | 緯度/経度や住所から外部の地図を起動します | bit.ly/29KgNR0 (英語) | bit.ly/2abuJbI (英語) |
ファイル システム | PCL Storage により、クロスプラットフォーム ストレージ API が提供されます | bit.ly/29LEOru (英語) | bit.ly/28Ju1AB (英語) |
Geolocator | GPS によるデバイスの位置を検出します | bit.ly/2a70ekG (英語) | bit.ly/29Tpuvd (英語) |
ローカル通知 | ローカル通知を表示します | bit.ly/2arOGYf (英語) | bit.ly/29TpSd7 (英語) |
メディア | 写真とビデオの撮影と選択を行います | bit.ly/2a6rpxi (英語) | bit.ly/29TqlMm (英語) |
メッセージング | 通話、SMS の送信、メールの送信を行います | bit.ly/2a8Uie5 (英語) | bit.ly/29SEdDm (英語) |
アクセス許可 | 実行時にアクセス許可のチェックと要求を行います | bit.ly/29Tnvo8 (英語) | bit.ly/29S6ZKv (英語) |
Akavache キーバリュー ストア | 永続化 (ディスクへの書き込み) 用の非同期キーバリュー ストア | bit.ly/29Tou7I (英語) | bit.ly/2arPSLf (英語) |
プッシュ通知 | iOS と Android 向けのクロスプラットフォーム プッシュ通知 | bit.ly/29ToDs5 (英語) | bit.ly/2aex4CR (英語) |
設定 | シンプルで一貫性のあるクロスプラットフォーム設定の API | bit.ly/29ToTXT (英語) | bit.ly/2a6tn0Q (英語) |
共有 | テキスト、リンクを簡単に共有するか、ブラウザーを開きます | bit.ly/2aa2R51 (英語) | bit.ly/2aa3sUk (英語) |
ソケット | TCP と UDP のリスナーとクライアント、および UDP マルチキャスト | bit.ly/1rQIyyR (英語) | bit.ly/1y1UHPb (英語) |
読み上げ | 共有コードから読み上げを行います | bit.ly/29S7Yud (英語) | bit.ly/29MMA3S (英語) |
ユーザー ダイアログ | メッセージボックス形式のダイアログを有効にします | bit.ly/2aa4dMV (英語) | bit.ly/29Tqzkd (英語) |
バージョンの追跡 | ユーザーがインストールしているアプリのバージョンを追跡します | bit.ly/29S8YhH (英語) | bit.ly/2a74lNW (英語) |
たとえば、クロスプラットフォーム ソリューションの「接続」プラグインを使って接続をチェックすれば、コードは 1 行だけで済みます。iOS、Android、Windows に個別で実装する必要があるプラットフォーム固有のコードは必要なくなります。
public static bool IsOnline
{
get
{
return Plugin.Connectivity.CrossConnectivity.Current.IsConnected;
}
}
上記以外のプラグインや拡張機能も、bit.ly/29XZ3VM (英語) から入手できます。
デバイスのサポート: Android Wear、WatchKit、および Microsoft Band
Xamarin は、常に、市場のあらゆる種類のデバイスやデバイス プラットフォームに迅速に対応しています。筆者は Microsoft Band チームと一緒に仕事をできたことを、嬉しく思っています。ビルド 2016 では、スキーやスノーボードなど、50 種類以上のフィットネスのアクティビティ サポートを追加して、Active Fitness の魅力的な機能を共同で発表できました。また、Active Fitness は、腕時計のような美しいインターフェイスを持つ Android Wear をサポートするようになりました (図 8 参照)。Android デバイスに Active Fitness をインストールすると、この腕時計型のインターフェイスが完全にサポートされます。
図 8 Active Fitness アプリ向けの Android Wear の腕時計型インターフェイス
Xamarin を使って、以下を使用するガジェットやデバイスに、アプリとサポートを追加できます。
- Android Wear: Xamarin には、C# での腕時計型インターフェイスの作成など、コード サンプルとサポートが含まれています。
- Apple WatchKit: Xamarin のサポートについては、bit.ly/29XZ3VM (英語) を参照してください。
- Microsoft Band: Microsoft Band SDK に加えて、クロスプラットフォーム Xamarin アプリ対応の優れた Microsoft Band ラッパーを、GitHub (bit.ly/29WeDli、英語) や NuGet (bit.ly/29SOoLA、英語) から入手できます。
パフォーマンスとコンパイル済み XAML
Xamarin.Forms では、XAML と分離コードのロジックを組み合わせて使用します。好みによっては、UI オブジェクトのインスタンスを作成して管理するコードのみを使用してもかまいません。実際のところ、UI でコーディングを避ける理由の大半は、効率性です (XAML の場合、その宣言型の性質によって、作成と管理の効率が非常に高くなります)。ただし、どうしても必要ならば、ContentPage から独自の Page を派生して、XAML を使わずに、すべてのロジックをコードで作成してもかまいません(図 9 参照)。
図 9 XAML を使わずに ContentPage から派生した Page
class ButtonCodePage : ContentPage
{
int count = 0;
public ButtonCodePage()
{
Button button = new Button
{
Text = String.Format("Tap for click count!")
};
button.Clicked += (sender, args) =>
{
count++;
button.Text =
String.Format("{0} click{1}!", count, count == 1 ? "" : "s");
};
this.Content = button;
}
}
この場合、UI コードはすべて、完全にコンパイル済みの C# になります。コンパイル済みの XAML も、同様の考え方です。 すべての XAML を事前コンパイルするよう Xamarin に指示することができます。その結果、XAML ファイルに含まれる UI コードの読み込みや実行がきわめて速くなります。コンパイル済みの XAML には、コンパイル時の即時チェック、読み込みとインスタンス作成の時間の短縮、実行可能ファイルのサイズ削減など、いくつかメリットがあります。XAML コンパイルは、以下のようにアセンブリ単位に実行できます。
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace MyApp
また、以下のようにクラス レベルで実行することもできます。
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MyPage
まとめ
Xamarin を使って開発することで、生産性を高め、Microsoft オープン ソース コミュニティの力を活かしてください。本稿で述べたように、Xamarin はオープン ソース化、 Android Wear、Apple Watch、Microsoft Band などの最新デバイス、Android、iOS、Windows の最新バージョンなどに迅速に対応しています。Xamarin の主な新規追加機能をいくつか紹介します。こうした追加機能により、本当に魅力的なプラットフォームになっています。
- データ ページ: データ バインディングを簡素化し、複雑なマルチページ アプリのビルドを容易にします (bit.ly/29SRtLk、英語)。
- ローカライズと多言語アプリ ツールキット: Xamarin プロジェクトを完全にサポートし、業界標準の XLIFF サポートをプロジェクトに追加します (bit.ly/2a5Uzwx、英語)。
- ネイティブ コントロールの埋め込み: Xamarin アプリへのネイティブ コントロールの追加を大幅に容易にします (bit.ly/29IEvxH、英語)。
- エフェクト: プラットフォーム固有のエフェクトを Xamarin アプリに追加します (bit.ly/29RDrbD、英語)。
Xamarin は、iOS、Android、および Windows で動作する、文字通り複雑なクロスプラットフォーム アプリをビルドするための、強力かつ効率的な方法を提供します。アプリの機能とコンテンツに重点を置き、どのような OS でも動作する強力なアプリをビルドできます。初めて Xamarin アプリのビルドに着手する方でも、クロスプラットフォーム開発者の大規模な活気あふれるコミュニティに、すぐに出会えます。
Kevin Ashley はマイクロソフトのアーキテクト エバンジェリストです。彼は『Professional Windows 8 Programming』(Wrox、2012 年) の共著者であり、人気アプリやゲームの開発者でもあります。代表的なアプリは Active Fitness (activefitness.co、英語) です。Kevin はさまざまなイベント、産業展覧会や Web キャストで技術発表をよく行っています。新興企業やパートナーに協力し、ソフトウェア設計、ビジネスとテクノロジ戦略、アーキテクチャ、および開発に関するアドバイスを行っています。Kevin のブログは kevinashley.com (英語) で Twitter は @kashleytwit (英語) です。
この記事のレビューに協力してくれたマイクロソフト技術スタッフの James Montemagno に心より感謝します。