スマートフォンの出荷台数がPCを上回る現代において、PC向けソフトウェアに加え、iOS/Androiアプリへの対応も急務だと思います。この連載では、数回にわたり、Xamarin(ザマリン)について今のウチに抑えておきたいアレコレをご紹介します。

Xamarinとは、米Xamarinが開発する.NET Framework(主にC#)を使用してiOS/Android/Mac/UWP/Windows 8.1/Windows Phoneの「ネイティブアプリ」を開発できるクロスプラットフォーム開発環境です。また、.NET開発者が使い慣れているMicrosoft Visual Studio用アドインも用意されているため、今までのノウハウがアプリ開発にも生かせるのではないでしょうか。

さらに、2016年2月25日には、MicrosoftのXamarin買収計画が発表され、一躍、Xamarinが注目を浴びるようになりました。(Xamarin CEOであるNat氏のブログエントリによれば"Microsoft has signed a definitive agreement to acquire Xamarin"であり、「買収に合意した」が正しい表現かと思います)

スマートフォン利用がデフォルトになった現在において、「モバイル ファースト、クラウド ファースト」を掲げるMicrosoftが、自社の技術と非常に親和性の高いXamarinを買収するのも当然の流れかと思います。

クロスプラットフォーム開発といえば、古くはJavaで言われていたように「Write Once, Run Anywhere(一度プログラムを書けば、どこでも実行できる)」といった需要が高いと考えられます。きっと、ユーザ企業も多くのプラットフォームに少ない工数で安くリリースできる方が嬉しいでしょう。実際には、フレデリック・ブルックス氏の論文にあるように「No Sliver Bullet」(銀の弾などない:ソフトウェア工学の著名な論文で『ソフトウェア開発の生産性を劇的に向上させる魔法(手法)など存在しない』といった意味)ではあるのですが、モバイル向けにおけるクロスプラットフォーム開発環境の需要は年々高まっています。

近年の代表的なクロスプラットフォーム開発環境としては以下のものが挙げられます(このほかにもさまざまなものがあります)。()内は開発言語です。

Cordovaは非常に強力なHTML5/JS(JavaScript)を使用したハイブリッドアプリ開発ツールで、iOS/Android/Windows/Ubuntu/Blackberryなどに対応しています。日本ではMonacaがCordovaで動作するフレームワークとして有名です。React NativeはFacebookが公開したOSS(Open Source Software)で、iOS版に加え2015年9月にAndroid版をリリースし、注目が集まっています。Unityはゲーム向けのエンジンだけあって、iOS/Android/Wndows/Mac OS X/Linuxなどの主要なプラットフォームだけでなく、PlayStation 4やXbox One、Wii Uなどのさまざまなゲームプラットフォームに対応しています。

Xamarinの特徴とは

今回紹介するXamarin開発環境として、Windows、Mac OS Xを使用できますが、作成できるアプリに違いがあります。以下の図を参照してください。iOS/Androidを中心とする場合はMac OS X、UWPなどWindowsアプリも対象に含めるならWindowsでの開発が良いでしょう。

対応表

Xamarinには、以下の大きな4つの特長があります。

  • 新しく洗練された言語の1つ、C#で記述できる
  • ネイティブのUIとパフォーマンスを持つ、フルネイティブアプリが作れる
  • C#から呼び出せるように薄くラップされたAPIが提供されており、APIを100%使える
  • .NETのコードを共通化できる

これらの特長を図で表すと次のようになります。

Xamarin ネイティブ

Xamarinネイティブ

これはXamarinネイティブと呼ばれる開発手法で、大前提として記述する言語はC#のみです。ビルドするとiOSはipa、Androidはapk、Windowsはappx(またはexe)のファイルが生成され、ネイティブのコントロールを100%利用できるネイティブアプリとして動作します。共通化できるのは、各プラットフォーム用のMono Runtimeで動作するBCL(Base Class Library)と呼ばれる.NETの基礎クラスで、主にアプリケーションのロジック部分が該当します。

例えば、「WebサービスのAPIにアクセスしてJsonデータを取得してパースして格納する」というような処理は、SwiftではAlamofireSwiftyJSONを使用するかもしれません。Android JavaではvolleyGSONを使用するかもしれません。このようなロジック部分の処理は、ほぼ.NETで記述できます。標準の Microsoft.Net.Http でhttp通信をし、Json.NETというライブラリでパースしたりできます。

このように、ロジック部分の処理を.NETで記述することで、各プラットフォーム固有の処理を減らし、共通化の割合を高めていくと4割~7割ほどを共通化できるとされています。また、各プラットフォームで実装が異なる各種センサへのアクセスなども、Xamarin対応の共通化ライブラリが数多く出てきており、共通コード内で記述できるようになってきています。

Xamarinネイティブでは、UIは各プラットフォーム標準のStoryboard(iOS/Mac)、xml(Android)を使用します。そのため、ユーザが違和感なく操作できるアプリを作成できます。以下はVisual Studio 2015で左からWindows Phone/iOS/AndroidのUIを編集している画面です。

Visual StudioでiOS/Android/Windows PhoneのUIを編集

Xamarin.Forms

また、UIを共通コードで書けるXamarin.Formsというライブラリもリリースされています。

Xamarin.Forms

Xamarin.Formsでは、ロジック部分を共通化できる特長をそのままに、UIをXAMLまたはC#で記述できます。現時点では残念ながらデザイナがありませんので、直接コードで記述する必要がありますが、Visual Studio、Xamarin Studioのコード補完機能を活用すればそのうち苦ではなくなるかもしれません!

Xamarin.FormsではiOS/Android/UWP/Windows Store/Windows Phoneの開発に対応しており、シンプルなUIやモックアプリ、低予算なアプリであればすぐに作成することも可能です。Xamarinネイティブよりもできることに制限はありますが、通常のアプリ開発でも十分に対応可能です。

Xamarin.Formsもビルド時に各プラットフォームのネイティブコントロールにマップされるため、ユーザ体験が損なわれることはありません。以下の例では、TabView内にマップが表示されていますが、iOSでは画面下にタブがありMKMapViewが使用されています。Androidでは画面上にタブがありGoogle Mapが使用されています。Windows Phoneでは画面上にCarouselPageがありHereMap使用されています。

Xamarin.Forms各プラットフォーム画面

まとめ

XamarinはC#を使ってiOS/Androidをはじめとする各種プラットフォームのフルネイティブのアプリが作成できる開発環境です。C#をやっていてモバイルもやってみたい開発者の方、iOS/Androidどちらかをやっていて、もう片方もやらなければなぁと考えている方、iOS/Android両方を開発していて、同じ処理を別の言語で記述する大変さを知っている方などは、ぜひMicrosoftとの買収合意によって注目を浴びる今こそXamarinを始めてみてはいかがでしょうか。

次回からは簡単なサンプルアプリの作成を通じて、具体的なXamarinネイティブ、Xamarin.Formsの開発手法を紹介していきたいと思います。

筆者が主催しているユーザグループ、Japan Xamarin User Groupのページには各種情報へのリンクを記載しています。是非ご覧ください。facebookグループへの参加もお待ちしています。

執筆者紹介

Japan Xamarin User Group 田淵義人(たぶち・よしと)

エクセルソフトにてXamarinをはじめ主に開発者向けのソフトウェアのセールスを担当しています。技術者と話が出来ないと楽しくない!より深く繋がりたいとの思いから、Xamarinを触りながらC#を勉強し「IT勉強会検索」のアプリをリリースしたり、Xamarinの勉強会を開催してほしいとの要望を受け、Japan Xamarin User Groupを主催し、各所で勉強会を開催していたりします。現在はMicrosoft MVPになるべく奮闘中です。Twitterアカウントは@ytabuchi