今から始める Xamarin（2016年版）

こんにちは。エクセルソフトの田淵です。

本エントリーは [初心者さん・学生さん大歓迎！ Xamarin その2 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/xamarin-welcome) の 12日目の記事です。

昨日は[サンテア](https://twitter.com/Santea3173)さんの [Xamarin\.Forms におけるマルチウィンドウの落とし穴 \- ぴよぴよエンジニアの日記](http://santea.hateblo.jp/entry/2016/12/11/000000)、明日は [Nuits](http://qiita.com/Nuits) です！よろしくお願いいたします。

Xamarin を始めるにあたって、Xamarin の概要と、初めての方が気をつけておいてほしいこと、試してみて欲しいことなどを纏めたいと思います。どうぞよろしくお願いいたします。記載内容の補足として、日本語での解説記事やブログなどがにリンクしていますので、是非リンク先もご覧ください。ではよろしくお願いいたします。

## Xamarin ってどんなものなの？

C# だけで iOS／Android／UWP／Mac のアプリを開発できるフレームワーク、統合開発の総称です。

### フレームワークとしての Xamarin

Xamarin プラットフォームと呼ばれる Xamarin.iOS／Xamarin.Android／Xamarin.Mac は、iOS／Android／Mac のネイティブ API（iOS／Mac であれば `Foundation`、`UIKit` など、Android であれば `Android.View`、`Android.Widget`など）を C# から使えるように薄くラップした使いやすい API 郡、iOS／Android／Mac で動作する .NET 互換環境 Mono、ビルドツールなどを含んでいます。

Windows に標準で含まれる .NET Framework、iOS／Android／Mac で動作する Mono では、.NET Framework の API すべてではありませんが `System.IO`、`System.Linq`、`System.Xml`、`System.Threding.Task` など同じ API が使用できるため、ロジックのソースコードを共通化する事ができます。iOS／Android のロジックを共通化できることだけでも、開発時、メンテナンス時の工数削減や品質向上が図れ魅力的ですが、ビジネス用途として考えた場合、Windows アプリケーションとロジックを共通化できる点も忘れてはいけません。既存の Windows アプリをモバイル向けに再構築したい、Windows タブレットと iPad のアプリを同時に作成したい、Windows アプリ用の社内ライブラリを活用したい、などの要望に答えることができます。

> Xamarin.iOS／Xamarin.Android については

> - [Xamarin\.iOSの仕組みとアプリケーションの構成 \- Build Insider](http://www.buildinsider.net/mobile/insidexamarin/05)
> - [Xamarin\.Androidの仕組みと、ソフトウェア構成 \- Build Insider](http://www.buildinsider.net/mobile/insidexamarin/07)

> をご覧ください。

また、UI を共通コードで記述できる Xamarin.Forms ライブラリもフレームワークと言えるでしょう。

#### Xamarin ネイティブ／Xamarin.Forms

Xamarin で開発する場合、2つの開発手法、Xamarin ネイティブ、Xamarin.Forms のどちらかを選択することになります。

Xamarin ネイティブ（Xamarin プラットフォームや、トラディショナルアプローチとも言われることがあります。）は、Xamarin.iOS／Xamarin.Android を使用して、iOS では Storyboard、Android では XML（拡張子は `.axml`）で UI の開発を行い、ロジック部分を共通化する開発手法です。WPF／UWP に対応したい場合は、別途プロジェクトを作り、ロジック部分を参照します。画面数や各プラットフォーム固有の機能が多い場合は共通化の割合が少なくなりますが、30%～60% ほどが共通化できます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/32453/2dfc584f-9c38-1972-dfb4-0d16caf7b441.png" width="450"/>

Xamarin.Forms は 2014年5月にリリースされた、画面を単一コードで記述できるライブラリです。画面を XAML で記述できるため、XAML の機能である Resource、Style、Trigger、Behavior、Value Converter、Data Template、Data Binding などを備えており柔軟な開発ができるほか、MVVM の機構を持っているため、Model、View、ViewModel に責務を分離しより単体テストをしやすく、品質の高いアプリを構築することが可能になります。40%～90%ほどが共通化できます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/32453/39211ef5-e1a0-9697-b66f-3d96f0bf8289.png" width="450"/>

> MVVM については、

> - [Model View ViewModel - Wikipedia](https://ja.wikipedia.org/wiki/Model_View_ViewModel)
> - [MVVMパターンの常識 ― 「M」「V」「VM」の役割とは？ － ＠IT](http://www.atmarkit.co.jp/fdotnet/chushin/greatblogentry_02/greatblogentry_02_01.html)

> をご覧ください。

単一コードで記述できるということは、抽象化されたライブラリということで、現時点では `Button`、`Label`など基本的な 19個のコントロールしか用意されていません。

<img src="https://qiita-image-store.s3.amazonaws.com/0/32453/79b71ef9-72ab-3edf-bc6e-bdbd931aaf36.png" width="450"/>

各プラットフォーム独自のコントロール、例えば Android の Floating Action Button（FAB）や iOS の Segmented Control はそのままでは Xamarin.Forms では使用できませんが、独自コントロールを呼び出す仕組み、Custom Renderer、Effects、Native Embedded が用意されています。

> Custom Renderer については

> - [【Xamarin.Forms】ViewRendererと仲良くなるための簡易チュートリアル - ぴーさんログ](http://ticktack.hatenablog.jp/entry/2016/06/11/124751)
> - [Xamarin.FormsのViewRendererと仲良くなるハンズオン](https://github.com/P3PPP/NakayokunaruHandsOn)

> Effects については

> - [Effectを使ってAndroidのMapViewからボタンを消す - ぴーさんログ](http://ticktack.hatenablog.jp/entry/2016/02/05/001047)

> Native Embedded については

> - [[Xamarin.Forms] 新機能！ NativeのUIが xaml で使える！？ - Qiita](http://qiita.com/AyaseSH/items/2abc983e5082dbee5ad2)
> - [【Xamarin.Forms 2.2】Embedded Platform-Specific Controls in Xamarin.Forms - ぴーさんログ](http://ticktack.hatenablog.jp/entry/2016/04/30/143738)

> FAB については

> - [Android M (Marshmallow) の新機能の紹介 | Xamarin : XLsoft エクセルソフト](https://www.xlsoft.com/jp/products/xamarin/introduction-to-marshmallow.html#designlib)
> - [Design Support Libraryを使い倒してカジュアルにアプリ実装 - 株式会社エウレカ（*Android ネイティブ）](https://eure.jp/blog/design-support-library/)

> Segmented Control については

> - [【XamarinによるiOS超入門 】 Segmentedコントロール ( UISegmentedControl ) - SIN@SAPPOROWORKSの覚書](http://furuya02.hatenablog.com/entry/2015/02/06/195538)
> - [Segmented Button Control - Xamarin（*英語）](https://developer.xamarin.com/recipes/ios/standard_controls/segmented_button_control/)

> をご覧ください。

また、GPS、加速度などのセンサーや各プラットフォーム独自 API を使う方法として、Plugin for Xamarin や Dependensy Service が用意されています。

> Plugin は

> - [xamarin/XamarinComponents: Plugins for Xamarin](https://github.com/xamarin/XamarinComponents)
> - [Xamarin逆引きTips - Build Insider](http://www.buildinsider.net/mobile/xamarintips/)

> をご覧ください。

Xamarin を始めるにあたり、どちらから始めるべきか？どちらで開発すべきか？というご質問を時々いただきます。ケースバイケースですが、以下をお伝えしています。

Xamarin.Forms を選んだ方が良いケース

- C# 大好き／XAML 大好き／WPF やってます／UWP やってます という方が多い場合  
- まずは動くものを見たい場合
- 社内のプロジェクトで開発方針が比較的自由な場合

Xamarin ネイティブを選んだ方が良いケース

- iOS／Android ネイティブ経験者が多い場合
- UI のハイレベルな作りこみが予想される場合

また、Xamarin ネイティブは、iOS／Android の API を移植しただけですので、各プラットフォームに変更がない限り機能追加などはありませんが、Xamarin.Forms は現在 Xamarin が力を入れて開発しているため、アップデートも早く、コントロールの追加も予定されてたりして今後に期待ができるライブラリです。初期段階で覚えなければいけない iOS／Android の概念や API も少ないため、開発自体は楽だと思います。


### 開発環境としての Xamarin

Windows の Visual Studio にアドオンする Xamarin for Visual Studio、Mac にインストールする Visual Studio for Mac／Xamarin Studio があります。

#### Windows
Xamarin for Visual Studio では、一般的な Windows アプリケーションの開発に近い感覚で開発出来るように、各種プロジェクトやアイテムのテンプレート、Android Designer、iOS Designer での UI 作成、iOS／Android API の Intellisense、ネイティブアプリバイナリのビルドやデバッグなどが行えます。Visual Studio のため、同じソリューションに WinForm／WPF／UWP などの Windows 用クライアントアプリのプロジェクトを追加したり、Microsoft Azure にデプロイする ASP.NET Web API などのサーバーサイドのプロジェクトを一緒に開発することも可能です。ReSharper や Team Foundation Server などの Visual Studio のエコシステムを活用できる点も強みです。現在は Preview ですが、[XAML Previewer for Xamarin.Forms](https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-previewer/) も用意されています。

iOS アプリの開発には、別途 Mac のマシンを用意して SSH で接続する必要があります。

> 2016/12/12 現在、Xamarin.Forms のプロジェクトテンプレートに不備があります。[【緊急】【拡散希望】最新の Xamarin 4.2.1.64 で作成できる Xamarin.Forms のテンプレートは不備があります - Xamarin 日本語情報](http://ytabuchi.hatenablog.com/entry/2016/11/21/170000) をご覧ください。

#### Mac

Xamarin Studio は現在の Mac における標準の IDE です。Intellisense や iOS／Android Designer など、基本的には Visual Studio と同じ感覚で開発が可能です。NuGet も使えるため、通常の iOS／Android 開発で困ることはないはずです。UWP や Windows クライアントアプリの開発はできませんが、Mac 1台で iOS／Android 開発が完結できるため、Windows と Mac の両方を持っている方は、Mac の Xamarin Studio の方が便利だと思います。

Visual Studio for Mac は 2016/11/15 に開催された Microsoft のオンラインカンファレンス、Connect(); 2016 で発表された Mac 向けの次世代の IDE です。Xamarin Studio をコードベースとして作られており、Mac や Linux で動作する .NET 互換環境の .NET Core 向けの Web App プロジェクトを作成できるようになっていたり、Microsoft Azure のモバイル向け mBaaS である Mobile Apps に簡単に接続できるウィザードが用意されていたり、より Visual Studio の使用感に近いように開発されていくと思われます。

開発環境もどちらを使えばいいのかご質問をいただくことがあります。Windows アプリと同時開発する、TFS を使っていて Visual Studio でなければいけない。など特別な理由がない限り、Xamarin Studio の方がお手軽ですよ。とお伝えしています。また、開発ツールの新機能は Xamarin Studio に最初に実装されますので、新しい機能を早く使いたい方にも Mac をお勧めしています。

> Xamarin Studio は Visual Studio とコード整形ルールが違うので書きづらい！という方は、以下をご覧ください。 

> - [Mac の Xamarin Studio で Visual Studio 風な書き味にするには - Xamarin 日本語情報](http://ytabuchi.hatenablog.com/entry/2016/04/20/121000)

> 一つ前のバージョンで作成したエントリーのため、オプション項目が少し異なりますが、適宜読み替えてご利用ください。

## Xamarin を始めよう

### 環境構築

環境構築を丁寧に行いましょう。Visual Studio のインストーラーでインストールしただけでは開発を開始**できません**。

- [Xamarin インストール・事前作業手順書（*PDF ファイル）](https://github.com/ytabuchi/XamarinHOL/blob/master/XamarinHandsOn_Prepare_JXUG.pdf)

こちらを読んでいただき、特に Android SDK をしっかりと最新にしてください。上記 PDF の 18ページ、19ページにインストール必須の項目を記載してあります。

また、ビルド時に必要な `Android.Support.Library` をダウンロードするため、初回ビルド時には時間が掛かります。ビルドを途中で中止してしまうと、ライブラリのダウンロードが完了しておらず、ビルドエラーになることがあります。

その場合は、

- Visual Studio、Xamarin Studio を一度終了し、Android プロジェクトフォルダの `bin` と `obj` フォルダを削除します。
- Windows の場合は `%LOCALAPPDATA%\Xamarin`、Mac の場合は `./.local/share/Xamarin` にエクスプローラー、Finder で移動し、Cache、Log、Logs、Mono for Android、MonoTouch **以外のフォルダ** をすべて削除します。

その後、再度ビルドを試してください。

だいぶエラーも少なくなりましたが、何か問題が発生した場合は以下をご参照ください。

- [Windows で Xamarin 開発をしたい方はインストールする前に読んでほしい - Xamarin 日本語情報](http://ytabuchi.hatenablog.com/entry/2016/04/05/142525)
- [Xamarin for Visual Studio スタートアップ トラブルQA集 - nuits.jp blog](http://www.nuits.jp/entry/2016/04/07/215641)
- [Xamarin FAQ（小技集、またの名をバッドノウハウ） - Xamarin 日本語情報](http://ytabuchi.hatenablog.com/entry/xamarin-faq)

また、2016/12/12 時点の Xamarin.Forms のプロジェクトテンプレートは不備がありますので、[Xamarin.Forms の完璧なプロジェクトテンプレート公開 - Xamarin 日本語情報](http://ytabuchi.hatenablog.com/entry/2016/04/09/123743) を使ってもらっても良いかと思います。（こちらも「ｘｘがプロジェクト外で編集されています。」というワーニングがでますが、再読み込みすれば OK です。）

### 情報を入手

日本での情報も増えてきています。

- [Xamarin逆引きTips - Build Insider](http://www.buildinsider.net/mobile/xamarintips)
- [Qiita の Xamarin タグ](http://qiita.com/tags/xamarin)
- [Xamarin Advent Calendar 2016](http://qiita.com/advent-calendar/2016/xamarin)
- [JXUG 公式サイトのリンク集ページ](http://jxug.org/links.html)
- [Xamarin 日本語ドキュメントの紹介 : XLsoft エクセルソフト](https://www.xlsoft.com/jp/products/xamarin/documents.html)

ブログでは、私のブログも含めていて恐縮ですが、以下は購読しておいて損はないかと思います。

- [Xamarin 日本語情報 - Xamarin カテゴリーの記事一覧](http://ytabuchi.hatenablog.com/archive/category/Xamarin)
- [nuits.jp blog - Xamarin カテゴリーの記事一覧](http://www.nuits.jp/archive/category/Xamarin)
- [かずきのBlog@hatena - Xamarin カテゴリーの記事一覧](http://blog.okazuki.jp/archive/category/Xamarin)
- [ぴーさんログ - Xamarin カテゴリーの記事一覧](http://ticktack.hatenablog.jp/archive/category/Xamarin)

### 手を動かす

環境が整ったらまずは作ってみましょう。私が主宰している Xamarin が好きな方の集まり、Japan Xamarin User Group（JXUG（ジェイザグ））では以下のハンズオンを実施しました。どれも大変好評でしたので、是非ドキュメントを読みながらやってみてください。

- [Xamarin ハンズオン（初級）](https://github.com/ytabuchi/XamarinHOL)
- [Xamarin ネイティブ ハンズオン（初級）](https://github.com/ytabuchi/XamarinNativeHandsOn)
- [Xamarin Dev Days Tokyo ハンズオン（中級）](https://github.com/chomado/xamarin-dev-doc/)
- [Xamarin.Forms CustomRenderer ハンズオン（中級）](https://github.com/P3PPP/NakayokunaruHandsOn/wiki)
- [Prism and Moq ハンズオン（上級）](https://github.com/jxug/PrismAndMoqHansOn)

また、Xamarin 公式のサンプルアプリとして [すでにビルドされた動くサンプル](https://www.xamarin.com/prebuilt) が提供されています。こちらのソースコードを見てみるのもよいでしょう。

### 聞く

分からないところが出てきたら聞いてみましょう。Xamarin の質問は Teratail に集まっていることが多いです。

- [Teratail Xamarin タグ](https://teratail.com/tags/Xamarin)
- Twitter で、`#JXUG`、`#Xamarin` タグを付けてつぶやくと、優しいエキスパートのみなさんが回答してくれます。(JXUG コミュニティの回答のアグレッシブさは中々他に類をみないと思います。それだけ現在 JXUG に参加頂いている方の熱量が高いということ。是非気軽に呟いてみてください。)

### 英語の公式ドキュメントも読もう

Xamarin はドキュメントが豊富にあります。[Developer Center - Xamarin](https://developer.xamarin.com/) にはレシピ集、サンプルなどが豊富に揃っています。英語が苦手な方は怖いとは思いますが、Xamarin のドキュメントにはほとんどサンプルコードが付属しています。C# であれば世界共通言語ですので、英語でも思いきって読んでみてください。

英語に苦手意識がない方は以下も参考になるかと思います。

- [Stackoverflow](http://stackoverflow.com/questions/tagged/xamarin)
- [Xamarin Forum](https://forums.xamarin.com/)
- [Xamarin Blog](https://blog.xamarin.com/)

## まとめ

Xamarin は銀の弾丸ではありませんし、スタートアップの印象の強い、まだまだ荒削りなプロダクトです。が、C# ですべて書けるというのは大きな魅力となります。この荒さもコミュニティの皆さんと一緒であれば怖くありません。

是非、引き続きウォッチ、少しでも興味が出たら実際に触ってみて貰えるとうれしいです。

## 企業向けの宣伝ｗ

Xamarin の導入支援サービスを始めました。ベースは基本的なアプリを一緒に作ることで Xamarin を使えるようになって頂く内容ですが、ご要望に応じて講習内容のカスタマイズも可能です。詳しくは田淵までお問い合わせください(^^)

[有償セミナー、トレーニング | Xamarin : XLsoft エクセルソフト](https://www.xlsoft.com/jp/products/xamarin/seminar.html)

Xamarin の情報が欲しい方は [私のブログも購読](http://blog.hatena.ne.jp/ytabuchi/ytabuchi.hatenablog.com/subscribe)いただいたり、私の [Twitterアカウントをフォロー](https://twitter.com/ytabuchi)いただいたりすると嬉しいです。

<iframe src="http://blog.hatena.ne.jp/ytabuchi/ytabuchi.hatenablog.com/subscribe/iframe" allowtransparency="true" frameborder="0" scrolling="no" width="150" height="28"></iframe>

私が所属している [エクセルソフト](http://www.xlsoft.com/jp/index.html) は、開発者向けの様々なソフトウェアを扱っています。おなじみの [ReSharper (JetBrains)](http://www.xlsoft.com/jp/products/jetbrains/index.html)、 や Atlassian の [JIRA, Confluence](http://www.xlsoft.com/jp/products/atlassian/index.html)、Office/PDF ファイルを .NET/Java で操作するライブラリ [Aspose（アスポーズ）](http://www.xlsoft.com/jp/products/aspose/index.html)、Windows アプリ、Web ページ、iOS/Android アプリの UI テストができる [TestComplete](http://www.xlsoft.com/jp/products/smartbear/index.html) などお勧めです(^^)

以上です。