Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
Xamarin概説【2016年版】

Xamarin概説【2016年版】

10分間で分かった気になれるXamarin概要

2016年6月24日 改訂(初稿:2014/11/26)

Xamarinについてイメージをつかむこと、Xamarinに興味を持つことをゴールとして、Xamarinの基礎を解説。また、Q&A形式で「Xamarinでできること/できないこと」を紹介する。

エクセルソフト株式会社 田淵 義人
  • このエントリーをはてなブックマークに追加

編集部注: 改訂前の元記事について

 本稿は、Sansan主催の第6回.NET勉強会「『Xamarin』って何? Wエバンジェリストによる特濃『Xamarin』勉強会 ~C#によるマルチデバイス・クロスプラットフォーム開発の最前線~」の第1セッション「1時間で分かった気になれるXamarin概要」の内容をそのまま起こしたレポート記事を、最新のXamarin事情に合わせてアップデートしたものです(ちなみに第2セッションは「Xamarinで今日から始めるクロスプラットフォーム開発」でした)。

 元のレポート記事はSansanから提供され編集部で編集・校正を加えたものでしたが、今回の改訂では、セッション登壇者本人である田淵氏自らが元のレポート記事に加筆・修正を行いました。なお、最新状況でも変更のない内容は、元の文章および章立てのままになっています。

 本稿では、Xamarinについてイメージをつかむこと、Xamarinでできること/できないことを理解すること、Xamarinに興味を持つことをゴールとします。

本稿の内容をまとめたスライド

モバイル向けクロスプラットフォーム開発環境―“no silver bullet”

――クロスプラットフォーム開発に用いる環境

 モバイルアプリ向けのクロスプラットフォーム開発環境はたくさんありますが、“no silver bullet”、つまりどれも銀の弾丸にはなり得ないことを理解してください。

 ではどれを使えばよいのでしょうか。

 モバイルアプリを作る場合、最初にネイティブの環境を使います。iOSであればObjective-CSwiftXcode、AndroidであればJavaAndroid Studioです。

 HTML5JavaScriptを使う方法もあります。AdobeのPhoneGapCordova)、アシアル株式会社のMonacaなどのモバイルアプリ開発フレームワーク、2016年6月現在であれば、React Nativeやモバイル向けではありませんがElectronなども台頭してきています。

 C++Delphiを使う場合は、RAD Studio XEといったクロスプラットフォーム開発環境を利用可能です。

――何を使えばよいのか

 多くの人が何を使えばよいか迷っているかもしれませんが、個人の見解としては好きな環境を使えばよいと思います。Xamarinは全てに向いているわけではありません。例えば、Webページをモバイル化したいときには、HTML5/JavaScriptを使うCordovaの方が向いています。

Xamarinの特徴

 では、どういうときにXamarinを使えばよいでしょうか。Xamarinの特徴を挙げてみましょう。

 なお、Xamarinには、

  • Xamarin.iOS(iOSアプリ用)
  • Xamarin.Android(Androidアプリ用)
  • Xamarin.Mac(Macアプリ用)

がありますが、今回はXamarin.Macは取り上げません。この他、iOS/Android/UWPアプリ共通のXamarin.Formsもあります(詳細後述)。

――APIを100%移植

 XamarinのAPIはネイティブのAPIを100%移植しています。

 Xamarin.iOSは、基本的にiOS SDKと同日にリリースされます。iOS 9 SDKの場合も、同日にiOS 9対応正式版がリリースされました。そのため、開発者は、最新のOSに対応したアプリをすぐに開発できます。

 Xamarin.Androidの場合、これまでのところ、新しいバージョンのAndroid SDKのリリース後、順次対応されるようになっています。2016年6月現在、Android N Developer Previewに対応したバージョンがリリースされています。

 他のクロスプラットフォーム開発環境とは異なり、OSの最新版に対応するのが速いことがXamarinの特徴の1つです。

――ネイティブアプリを作成できる

 Xamarin.iOSで作成したiOSアプリは、.ipaファイルにパッケージングされます。つまり、Xcodeと同じ形式で、ネイティブアプリと同じ速度でさくさく動くものを作成できます。

 Xamarin.Androidで作成したアプリは、起動時にネイティブコードに変換するJITコンパイラーを備えたART仮想マシンとMonoランタイム上で実行されるため、ネイティブアプリと同じようにさくさくと動作します。

 例えば、HTML5を使うCordovaでは、端末のCPUの性能によりパフォーマンスに差が出ることがあります。そのため、速さやきびきびした動作が求められるアプリの開発には、Xamarinの方が有利です。

――C#/.NET/Visual Studioを活用してアプリを作成できる

 Xamarinでは、Objective-C/SwiftやJavaを使う必要はなく、C#を利用して開発できます。同期、非同期、LINQ、ラムダ式など、C#のスマートな書き方でアプリを開発できることは、C#/.NET開発者にとって大きなメリットです。

 また、2016年4月からVisual StudioにXamarinが付属するようになりました。TFS(Team Foundation Server)やReSharperなどのVisual Studioのエコシステムを活用して、より効率的な開発が可能になります。

――コードの共通化

 Xamarinでは、C#からiOS APIやAndroid APIを100%使用できます。

図1 C#から使用できるAPIの代表例(左:iOS、右:Android)

 また、オープンソースのMonoにより、.NET BCL(ベースクラスライブラリ)(例えば以下のような名前空間の機能)をiOSやAndroidで利用できます。

  • System.IO: ファイル操作の共通化
  • System.NET: ネットワーク操作の共通化
  • System.Linq: データ操作の簡素化、共通化
  • System.XML: XML操作の簡素化、共通化
  • System.Threading: 非同期処理

Xamarin.iOSやXamarin.Androidを使用した開発

 1つの言語で書くのであれば、「コードを共通化して楽をしたい」と思うのは当然のことです。クロスプラットフォーム開発ではそこに主眼を置きます。

 Xamarinは、Shared C# Backend(Mono)により、開発するコードを共通化できる点が一番の特徴と言えます。そして、UIはそれぞれのOSで書こうというのがXamarinの基本思想です。図で表現すると、次のようになります。

図2 Xamarinの基本的なアプリ開発のイメージ

コードを共通化する方法

 コードを共通化するには、PCLまたはShared Projectを利用します。

――PCL(Portable Class Library)

 PCLは共通DLLを作る機能です。PCLにより、いろいろなプラットフォームに対応したDLLを作成できますが、OSの種類によって使用可能な機能が限定されるので注意が必要です。

――Shared Project

 Shared Projectは、DLLではなくソースコードをそのまま共有する方法です。

Xamarin.Forms―画面の共通化

 Xamarinは、UIを共通化するXamarin.Formsというライブラリを提供しています。Xamarin.Formsを利用すると、C#もしくはXAMLでUIを記述でき、同じUIのコードがそれぞれのネイティブのUIにマップされます。2016年6月現在でもビジュアルなエディターが存在しないため、手動でコードを書く必要があります。2016年4月末に開催されたXamarinのイベント「Evolve 2016」でXamarin StudioのAlpha Channel(=アルファ版を提供するチャンネル)にXamarin.Forms Previewer(図2)がリリースされ、リアルタイムのXAMLのプレビューができるようになりました。

図3 Xamarin.Forms Previewer(Androidの例。右側にプレビューが表示されている)

 Xamarin.Formsを使ったアプリ開発を図で表現すると、次のようになります。

図4 Xamarin.Formsを使ったアプリ開発のイメージ

――Xamarin.Formsで提供される機能

 Xamarin.Formsは、

  • Content、MasterDetail、Navigationなどの基本的なページビュー
  • Stack、Absolute、Gridなどの基本的なレイアウト
  • 基本的なコントロール、およびその基本的な機能

などを提供しています。

 Xamarin.Formsでは、各プラットフォーム固有のネイティブのUIコントロールやAPIはサポートされていません。ただし、ネイティブのコントロールやAPIを呼び出す仕組みが提供されており、UIはCustom RendererEffects、APIはPluginsDependency Serviceが用意されています。

 また、Xamarin.Formsは、MVVM(Model View ViewModel)パターン的な振る舞いを実装する機能としてData BindingMessage Centerを提供しています。

Xamarin.iOS/AndroidとXamarin.Formsの使い分け指針

 「Xamarinネイティブ、Xamarin.Formsのどちらを使えばよいですか?」という質問をよくいただきます。

 iOS/Androidのネイティブ開発をすでにされている方には、ネイティブのAPIがほぼそのまま使えるXamarinネイティブの手法をお勧めします。見慣れたAPIを使用しながら、ラムダ式やasyncawaitなどの非同期の仕組みを活用してエレガントに記述することができます。

 逆にC#に長けていてWPF開発をされている方には、Xamarin.Formsをお勧めします。Xamarin.Formsに標準で組み込まれているData BindingなどのMVVM(Model-View-ViewModelパターン)機能を使用することで、モデルをベースとした堅牢な基盤を持つモバイルアプリを作成できます。XAMLの仕様はWPF/UWPのMicrosoft XAMLとは多少異なりますが、すぐに慣れることでしょう。UI/UXのスタンダードが目まぐるしく変わる現代において、モデルベースのアプリを作成できるXamarin.Formsは大きなアドバンテージとなります。

 また、Xamarin.Formsの標準機能のみではベーシックなUIコントロールしか提供されていませんが、前述のCustom RendererEffectsを使用することで、ネイティブのUIを活用することもでき、PluginsDependency Serviceを使用することで、ネイティブのAPIを活用できます。まだバグも多く、使いこなすのは大変かもしれませんが、今後が楽しみなUIライブラリですのでぜひチャレンジしてみてください。

Xamarinでできること・できないことFAQ

Q: Xamarinは高いですか?

A: 2016年4月に無償化が発表され、Visual Studioに含まれるようになりました。MSDNサブスクライバーの方と個人の方は無料で使えます。

Q: 無料のStarter Editionがありますか?

A: Visual Studio Community Editionを使用してください。

Q: Macは必要ですか?

A: iOSアプリをビルド、署名する際にXcodeが必要になるため、Macが1台以上必要です。

Q: Visual Studio Express/CommunityでXamarinは使えますか?

A: Visual Studio CommunityまたはPro以上が必要です。Expressでは使えません。

Q: UWP/Windowsストアアプリも作れますか?

A: Xamarinネイティブの手法の場合はVisual Studioを使ってロジックを共通化できます。Xamarin.FormsではUWP、ストアアプリがサポートされています(MacではXamarin.Formsの手法でもUWPは開発できませn)。

Q: ネイティブ(XcodeやAndroid Studio)で作ったライブラリはXamarinで使えますか?

A: だいたい使えます。DLLに変換するバインディングという技術を使うと、ある程度使えるようになります。ただし、iOS用のライブラリをXamarin用に変換したものはAndroidでは使えません。iOS用ライブラリはiOS、Android用ライブラリはAndroidでしか使えません。

Q: Xamarinで作ったライブラリはネイティブで使えますか?

A: 使えません。

Q: NuGetは使えますか?

A: 使えます。SQLiteやModernHttpClient、JSON.NET、Prismなど、いろいろなライブラリがあります。

Q: WindowsフォームやWPF用のライブラリは使えますか?

A: 残念ながら使えません。画面回りはほとんど使えないと思ってください。

Q: ソースコードは1回書けばよいのですか?

A: 各OS用のコードを書く部分もあるため、ネイティブの知識は必ず必要です。

Q: どれくらい共通化できますか?

A: 30~60%くらいです。Xamarinのサイトを見ると「75%共通化できる」と書いていますが、そこまではできません。Xamarin.Formsを使用すると80%ほど共通化できる場合もあります。

Q: OSごとに開発しなければいけない部分は?

A: UIを定義する部分とOS固有の機能(AndroidのNFCやiOS 8のキーボード拡張など)を実装する部分です。

Q: 共通化できる部分は?

A: ロジック部分(データベースへのアクセス、通信処理など)、データをやりとりする部分などです。Xamarin.Formsを使うと、ベーシックなUIは共通化できます。

Q: 共通化はどのように行うのですか?

A: 先ほど説明した通り、PCLやShared Projectを使います。

Q: 日本語の資料がほしいのですが。

A: Japan Xamarin User Groupのリンクページにブログエントリーを書いてくださっている方をまとめています。また、Xamarin社のサイトには英語のドキュメントがたくさんあります。

Q: サンプルはありますか?

A: Xamarin社のサンプルレシピにたくさんありますので、参考にしてください。

Q: 書籍はありますか?

A: Xamarin.Formsには対応していませんが、コードの共通化などを説明した書籍が出ています。

まとめ

 Xamarinには、「APIを100%移植」「ネイティブアプリを作成できる」「C#/.NET/Visual Studioを活用してアプリを作成できる」「コードを共通化できる」といった特徴があります。

 Xamarinを使用した開発では、PCLまたはShared Projectを利用してロジックやUIとデータをやりとりする部分のコードを共通化します。Xamarin.Formsを利用すれば、UI部分の共通化も可能です。個人の方であれば無料で使用できますので、ぜひ使ってみてください。

 Visual Studio 2015をご利用の方は、Update 2以上をインストールまたはアップデートする際に[クロスプラットフォームモバイル開発のC#/Xamarin]にチェックを入れてください。

参考資料

サイトからのお知らせ

Twitterでつぶやこう!