Xamarin による
クロスプラットフォーム
モバイルアプリ開発
2014.2.26 うずらインキュベータ #1
in Toyohashi, Aichi
自己紹介
•

Twitter: @amay077

•

位置情報エンジニア、

モバイルアプリエンジニア、
etc

•

MapQuest.co.jp 

→ Cosmoroot,Inc(Nagoya)
2

Now Hot topics
地図, 位置情報,
オープンデータ,
C#, Android, iOS,
Xamarin
クラウドサービスプロバイダ
•

       (ロジネビュラ)
•

•

      (ジクウ)
•

•

千年先まで費用ゼロのクラウド型倉庫管理システム
おもにココ担当

リアルタイムデータ収集プラットフォーム

Nepula(ネプラ)
•

基幹業務システム向けPaaS
3
ref http://blog.airs.co.jp/2010/12/06/hamackathon-20101204.html

HexRinger

developed at

ハマッカソン #2
4
続きは… 位置情報系Androidアプリケーションの開発 - Togetterまとめ

しゃべPOI

developed for

OpenStreetMappers
5
ref シビックハックの広まりと地方エンジニアの躍進 ‒ MA9総括 ¦ finder

富士フォト

with ふじのくにオープンデータ

MashupAward9, アーバンデータチャレンジ東京2013

6
本題

7
Xamarin とはなんぞや?
•

「ざまりん」と読みます

•

.NET Framework のオープンソース実装である
「Mono」を作ってる人たちが作った企業の名前

•

及び、同社が提供するSDKやツールなどをひっ
くるめた総称

8
ひとことで言えば

.NET(C#)で、Android/iOS/Mac/
Window アプリを開発できるSDK

9
もうちょっと詳しく1
•

Xamarin.iOS(旧MonoTouch)

Xamarin.Android(旧MonoDroid)

Xamarin.Mac(MonoMac)

•

各プラットフォーム(PF)のMono実装

+各PFのAPIの 薄い ラッパー

•

いずれもOSSではなく、有償のプロダクト
(MonoMacはOSS、ただしGPL/LGPL)
10
もうちょっと詳しく2
•

Xamarin Studio(旧MonoDevelop)
•
•

•

Win/Mac/Linux で動作するOSSな統合開発環境(IDE)
モバイル開発以外でも使われる(ってか、そっちが主)

Visual Studio アドイン
•

iOS/Android開発を実現するためのアドイン

•

Xamarin BUSINESSエディション以上が必要
11
価格体系

ref https://store.xamarin.com/

「/年/PF/開発者」である事に注意!(更新せずに使い続けてもOK)
学割あります(BUSINESS版が $99!!)
12
使われてるの?
530,000 developers in worldwide

ref http://xamarin.com/apps

13
日本でも

ref フェンリル株式会社 ¦ スマートフォンアプリ開発 実績 NHK 紅白

14
Microsoftと提携!

ref http://xamarin.com/msdn

•

Portable Class Library が Xamarin.iOS,
Xamarin.Android にも対応

•

MSDNサブスクライバー向け特別価格

Xamarin.iOS,Android BUSINESS版が30%OFF
15
Win+Visual Studio で作る?
•

iOS 開発の為に Mac が必要
•

•

iOS開発でUIデザイナ(Interface Builder)が使えない
•

•

リモート接続してビルド&デバッグ

Xamarin.Android には UIデザイナあります

インストールや日本語入力が不安定との

も

↓
Mac + Xamarin Studio での開発が
現在のベストプラクティス(個人の見解です)
16
Xamarin とは(もう一度)
各PFのMono実装

+

各PFのAPIの 薄い ラッパー

17
Xamarin.Android の実行モデル
Android(標準)

Xamarin.Android

アプリケーション(Java)

アプリケーション(C#)

アプリケーションフレー
ムワーク(Java)

アプリケーションフレー

JavaSE6

ムワーク(.NET)

.NET4.5 BCL

VM(Dalvik)

Monoランタイム

コアライブラリ群

コアライブラリ群

Linux カーネル

Linux カーネル

どちらも中間言語を
ランタイムがJITコンパイルして実行
18
Xamarin.iOS の実行モデル
iOS(標準)

Xamarin.iOS
アプリケーション(C#)
CocoaTouch(.NET)

アプリケーション(Objective-C)

.NET4.5 BCL

CocoaTouch

CocoaTouch
コアライブラリ群

コアライブラリ群

LLVMコンパイラ

Mono AOTコンパイラ

ARMマシン語

ARMマシン語

ARM

ARM

実機

実機
19
利点と欠点
•

Xamarin.Android
•

•

•

◎:Microsoftと仲が良い

<GoogleはOracleと仲悪い(まだJava6)>
△:Monoランタイムをアプリに含めるためサイズが
増加

Xamarin.iOS
•

◎:ガベージコレクション、静的型付け

•

△:事前コンパイル(AOT)の為、使えない機能(動的
コード生成等)がある
20
「薄いラッパ」である事の利点
•

PFのバージョンアップに追従しやすい
•

厚いラッパ(=共通API)では、複数PFで整合性を
取らないといけないので時間がかかる

•

PF固有の開発経験が活かせる

•

潰しが利く(=PF固有の開発に戻りやすい)
•

使い方が変わってしまう厚いラッパでは、戻る
のは難しい
21
DEMO
Xamarin.Android と iOS で HelloWorld

22
クロスプラット
フォームで開発するには

23
どこが共通化できるの?1
共通化できるところ

(基本ライブラリ相当機能)

共通化できないところ

(PF固有の機能)

•

基本データ型、計算処理

•

画面

•

通信処理

•

センサー系(GPS、加速度等)

•

ストリームI/O

•

カメラやアドレス帳

•

非同期処理

•

アプリ間連携

24
どこが共通化できるの?2
PCL(Portable Class Library)

アプリ(C#)
アプリケーションフレー
ムワーク(.NET)

ここは共通化できる
.NET4.5 BCL

.NET4.5 BCL

Monoランタイム

アプリ(C#) _
CocoaTouch
(.NET)
CocoaTouch

Androidコアライブラリ群

iOSコアライブラリ群

Xamarin.Android

Xamarin.iOS
25
そして PCL へ
•

PF間で共有できる「ポータブ
ル」なクラスライブラリ

•

実際には、対応PFセット毎にプ
ロファイルが定義されている

•

Xamarin.Android/iOS も対応
WPF/Win8/Android/iOS に1ソース
(というか1バイナリ)で対応できる
26
DEMO
PCL をつくって Xamarin.Android
と iOS から使ってみる

27
既存資産の活用1
•

Xamarin.Android Java Binding
•
•

•

Java ライブラリ(.jar)を利用可
.NET API は .jar から自動生成+カスタマイズ

Xamarin.iOS Obj-C Binding
•

Obj-C の Static Library(.a)を利用可

•

.NET API を自分で定義する必要あり
•

補助ツール - Objective Sharpie

•

Java Binding より結構大変
28
既存資産の活用2
•

既存の.NET資産もある程度
使える(PCLでなくても)

•

.NET Mobility Scanner で
どの程度利用できるか調べ
る事ができる

•

http://
scan.xamarin.com/

29
既存資産の活用3
•

Xamarin Components
•

•

Xamarinで利用できるライブラリのマーケット

Nuget
•
•

•

.NET 向けのパッケージマネージャ
画面に依存しないライブラリなら使えるかも

CodePlex, Githubなど
•

ライブラリが対応してなかったらコードを入手して
Xamarin用にビルドという手も
30
他のクロスプラット
フォーム開発ツールとの比較
Titanium / PhoneGap / Adobe AIR / Delphi XE

31
Xamarin(おさらい)
言語
実行形式
共通化可能

C#(.NET)
Android:JIT
iOS:AOT
基本ライブラリ相当機能
(計算処理、通信処理、非同期処理など)

共通化不可能

PF固有の機能(UI, センサーなど)

PF固有機能
呼び出し

PF毎のAPIを呼び出し可能

32
Titanium Mobile
言語

JavaScript

実行形式

インタプリタ

共通化可能

共通化不可能
PF固有機能
呼び出し

コアロジック、GPS など

共通APIが用意されている機能、
Label, EditBoxなど簡素なUI
PF固有のUIパーツ(CoverFlowView等)
コアロジックでもPF依存が多いとの
Module を作成

33
PhoneGap/Sencha Touch
言語

HTML5+CSS+JavaScript

実行形式

WebView上で動作するWebアプリ

共通化可能

Webアプリなので一見は共通。
共通APIが用意される一般的な機能

共通化不可能

ブラウザ依存は少なくない
共通APIが無い機能

PF固有機能
呼び出し

Plugin を作成

34
Adobe AIR for モバイル
言語
実行形式
共通化可能
共通化不可能
PF固有機能
呼び出し

ActionScript
Android:JIT
iOS:AOT
UI含め API が用意されていれば可能。
ただしUIは独自レンダリング
基本的には無いが、
その分機能が最小公倍数である
Native Extensions を作成

35
Delphi XE
言語
実行形式

共通化可能

共通化不可能
PF固有機能
呼び出し

Delphi
Android:JIT(JNI)
iOS:AOT
UI含め API が用意されていれば可能。

UIは独自レンダリングだが Pixel Perfect
でPFのスタイルを忠実に再現。
PF毎のAPIもあり、
それを使った場合は共通化不可能
PF毎のAPIを呼び出し可能

36
Others
•

Qt Mobile
•

•

RoboVM
•

•

C++ で書けるなら最強じゃね?(書けるなら)

Java → LLVM → Obj-C

Unity, Corona
•

ゲーム向けっぽい
37
しかし Xamarin
最大の利点は

38
C#
39
C# is Cool!!!
[Objective-C]!
01 [button1 addTarget:self action:@selector(onClick:)!
02

forControlEvents:UIControlEventTouchDown];!

…!

5 Lines

03 -(void)onClick:(UIButton*)button{!
04

NSLog(@“Hello”);!

05 }!

!
[Java]!
01 button1.setOnClickListener(new OnClickListener() {!
02

@Override!

03

public void onClick(View view) {!

04
05

6 Lines

Log.d(TAG, “Hello”);!
}!

06 });!

!
[C#]!
01 button1.Click += (s, e) => Debug.WriteLine(“Hello”);

ref https://xamarin.com/csharp
40

1 Line
LINQ
01.0∼9 の数値を!
02.偶数だけにして!
03.大きい順に並び替えて!
04.10倍にして!
05.出力する!

!
[C#]!
01 new int[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }!
02

.Where(x => x % 2 == 0)!

03

.OrderByDescending(x => x)!

04

.Select(x => x * 10)!

05

.ToList().ForEach(x => Debug.WriteLine(x));!

!
[Output]!
> 80 60 40 20 0

41
async/await
ワーカースレッドで時間のかかる処理をして、終わったらメインスレッドで結果を表示
[Java]!
01 int doHeavyWork() {!
02
return /* working... */;!
03 }!

!

[C#]!
01 Task<int> DoHeavyWork() {!
02
return Task.Run<int>(() => {!
03
return /* working... */;!
04
});!
05 }!

04 private void onClick(View v) {!
05
new AsyncTask<Void, Void, Integer>() { ! !
06
@Override!
06 async void onClick(object s, EventArgs e) {!
07
protected Integer doInBackground(Void... params) result = await DoHeavyWork();!
07
var {!
08
return doHeavyWork();!
08
label1.Text = "count = " + result;!
09
}!
09 }!
!
10
protected void onPostExecute(Integer result) {!
11
label1.Text = "count = " + result;!
12
};!
13
}.execute((Void)null);!
14 }

42
まとめ

43
まとめ
•

Mac + Xamarin Studio + Xamarin.Android +
Xamarin.iOS で クロスPF 開発

•

Win は、VS + Xamarin Addin で

•

PCL でコアロジックをクロスPFでバイナリ共有

•

C# >>>>>>> Java, Objective-C
44
Links
•

Xamarin Developer Center - http://docs.xamarin.com/

•

Xamarin日本語情報(XLSoft) - http://www.xlsoft.com/jp/products/xamarin/

•

Qiita - http://qiita.com/tags/xamarin

•

はてなグループ - http://hatenablog.com/g/12921228815715432734

•

Facebookグループ - https://www.facebook.com/groups/
778386365523431/

•

インサイドXamarin(Build Insider) - http://www.buildinsider.net/mobile/
insidexamarin

•

StackOverflow - http://stackoverflow.com/questions/tagged/monodroid
+or+monotouch+or+xamarin?sort=active
45
Xamarin Advent Calendar 2013

ref http://qiita.com/advent-calendar/2013/xamarin
46
What's Next?
•

Xamarin Test Cloud

•

Xamarin Studio iOS UI designer

•

X-Platform MVVM Frameworks
•

MvvmCross / QuickCross / ReactiveUI / etc

•

Using Locations and Maps

•

Xamarin Evolve 2014 (Oct 6-10)
47
ありがとうございました

Xamarin によるクロスプラットフォームモバイルアプリ開発