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

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

Embed Size (px)

DESCRIPTION

うずらインキュベータ - http://atnd.org/events/47898 で発表した資料です。

Citation preview

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

Xamarin による クロスプラットフォーム モバイルアプリ開発2014.2.26 うずらインキュベータ #1

in Toyohashi, Aichi

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

自己紹介• Twitter: @amay077

• 位置情報エンジニア、モバイルアプリエンジニア、etc

• MapQuest.co.jp → Cosmoroot,Inc(Nagoya)

2

地図, 位置情報, オープンデータ, C#, Android, iOS, Xamarin

“Now” Hot topics

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

•        (ロジネビュラ)

• 千年先まで費用ゼロのクラウド型倉庫管理システム

•       (ジクウ)

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

• Nepula(ネプラ)

• 基幹業務システム向けPaaS

おもにココ担当

クラウドサービスプロバイダ

3

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

HexRinger developed atハマッカソン #2

ref http://blog.airs.co.jp/2010/12/06/hamackathon-20101204.html

4

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

しゃべPOI developed forOpenStreetMappers

続きは… 位置情報系Androidアプリケーションの開発 - Togetterまとめ

5

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

富士フォト with ふじのくにオープンデータ

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

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

6

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

本題

7

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

Xamarin とはなんぞや?

• 「ざまりん」と読みます

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

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

8

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

ひとことで言えば

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

9

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

もうちょっと詳しく1• Xamarin.iOS(旧MonoTouch)Xamarin.Android(旧MonoDroid)Xamarin.Mac(MonoMac)

• 各プラットフォーム(PF)のMono実装+各PFのAPIの”薄い”ラッパー

• いずれもOSSではなく、有償のプロダクト(MonoMacはOSS、ただしGPL/LGPL)

10

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

もうちょっと詳しく2• Xamarin Studio(旧MonoDevelop)

• Win/Mac/Linux で動作するOSSな統合開発環境(IDE)

• モバイル開発以外でも使われる(ってか、そっちが主)

• Visual Studio アドイン

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

• Xamarin BUSINESSエディション以上が必要

11

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

価格体系

「/年/PF/開発者」である事に注意!(更新せずに使い続けてもOK) 学割あります(BUSINESS版が $99!!)

ref https://store.xamarin.com/

12

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

使われてるの?

530,000 developers in worldwide

ref http://xamarin.com/apps

13

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

日本でも

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

14

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

Microsoftと提携!

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

• MSDNサブスクライバー向け特別価格Xamarin.iOS,Android BUSINESS版が30%OFF

ref http://xamarin.com/msdn

15

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

Win+Visual Studio で作る?• iOS 開発の為に Mac が必要

• リモート接続してビルド&デバッグ • iOS開発でUIデザイナ(Interface Builder)が使えない

• Xamarin.Android には UIデザイナあります • インストールや日本語入力が不安定との噂も

↓ Mac + Xamarin Studio での開発が

現在のベストプラクティス(個人の見解です) 16

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

Xamarin とは(もう一度)

各PFのMono実装+

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

17

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

Xamarin.Android の実行モデル

VM(Dalvik)

Linux カーネル

コアライブラリ群

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

アプリケーション(Java)

Monoランタイム

Linux カーネル

コアライブラリ群

JavaSE6 アプリケーションフレームワーク(.NET) .NET4.5 BCL

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

Android(標準) Xamarin.Android

どちらも中間言語を ランタイムがJITコンパイルして実行

18

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

Xamarin.iOS の実行モデル

ARM

ARMマシン語

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

iOS(標準)

コアライブラリ群

CocoaTouch

LLVMコンパイラ

実機

ARM

ARMマシン語

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

コアライブラリ群

CocoaTouch

Mono AOTコンパイラ

実機

CocoaTouch(.NET) .NET4.5 BCL

Xamarin.iOS

19

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

利点と欠点• Xamarin.Android

• ◎:Microsoftと仲が良い<GoogleはOracleと仲悪い(まだJava6)>

• △:Monoランタイムをアプリに含めるためサイズが増加

• Xamarin.iOS

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

• △:事前コンパイル(AOT)の為、使えない機能(動的コード生成等)がある

20

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

「薄いラッパ」である事の利点

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

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

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

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

• 使い方が変わってしまう厚いラッパでは、戻るのは難しい

21

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

DEMOXamarin.Android と iOS で HelloWorld

22

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

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

23

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

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

共通化できるところ(基本ライブラリ相当機能)

• 基本データ型、計算処理

• 通信処理

• ストリームI/O

• 非同期処理

共通化できないところ(PF固有の機能)

• 画面

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

• カメラやアドレス帳

• アプリ間連携

24

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

どこが共通化できるの?2

CocoaTouch

CocoaTouch (.NET)

Xamarin.iOS

Monoランタイム

Androidコアライブラリ群

アプリケーションフレームワーク(.NET) .NET4.5 BCL

アプリ(C#)

Xamarin.AndroidiOSコアライブラリ群

.NET4.5 BCL

アプリ(C#) _ここは共通化できる

PCL(Portable Class Library)

25

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

そして PCL へ• PF間で共有できる「ポータブル」なクラスライブラリ

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

• Xamarin.Android/iOS も対応

WPF/Win8/Android/iOS に1ソース (というか1バイナリ)で対応できる

26

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

DEMOPCL をつくって Xamarin.Android

と iOS から使ってみる

27

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

既存資産の活用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

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

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

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

• http://scan.xamarin.com/

29

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

既存資産の活用3• Xamarin Components

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

• Nuget

• .NET 向けのパッケージマネージャ

• 画面に依存しないライブラリなら使えるかも

• CodePlex, Githubなど

• ライブラリが対応してなかったらコードを入手してXamarin用にビルドという手も

30

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

他のクロスプラット フォーム開発ツールとの比較

Titanium / PhoneGap / Adobe AIR / Delphi XE

31

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

Xamarin(おさらい)言語 C#(.NET)

実行形式 Android:JIT iOS:AOT

共通化可能 基本ライブラリ相当機能 (計算処理、通信処理、非同期処理など)

共通化不可能 PF固有の機能(UI, センサーなど)

PF固有機能 呼び出し PF毎のAPIを呼び出し可能

32

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

Titanium Mobile

言語 JavaScript

実行形式 インタプリタ

共通化可能コアロジック、GPS など

共通APIが用意されている機能、 Label, EditBoxなど簡素なUI

共通化不可能 PF固有のUIパーツ(CoverFlowView等) コアロジックでもPF依存が多いとの噂

PF固有機能 呼び出し Module を作成

33

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

PhoneGap/Sencha Touch

言語 HTML5+CSS+JavaScript

実行形式 WebView上で動作するWebアプリ

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

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

PF固有機能 呼び出し Plugin を作成

34

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

Adobe AIR for モバイル

言語 ActionScript

実行形式 Android:JIT iOS:AOT

共通化可能 UI含め API が用意されていれば可能。 ただしUIは独自レンダリング

共通化不可能 基本的には無いが、 その分機能が最小公倍数である

PF固有機能 呼び出し Native Extensions を作成

35

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

Delphi XE言語 Delphi

実行形式 Android:JIT(JNI) iOS:AOT

共通化可能UI含め API が用意されていれば可能。

UIは独自レンダリングだが Pixel Perfect でPFのスタイルを忠実に再現。

共通化不可能 PF毎のAPIもあり、 それを使った場合は共通化不可能

PF固有機能 呼び出し PF毎のAPIを呼び出し可能

36

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

Others• Qt Mobile

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

• RoboVM

• Java → LLVM → Obj-C

• Unity, Corona

• ゲーム向けっぽい 37

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

しかし Xamarin 最大の利点は

38

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

C# 39

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

C# is Cool!!![Objective-C]!

01 [button1 addTarget:self action:@selector(onClick:)!

02 forControlEvents:UIControlEventTouchDown];!

…!

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

04 NSLog(@“Hello”);!

05 }!

![Java]!

01 button1.setOnClickListener(new OnClickListener() {!

02 @Override!

03 public void onClick(View view) {!

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

05 }!

06 });!

![C#]!

01 button1.Click += (s, e) => Debug.WriteLine(“Hello”);

5 Lines

6 Lines

1 Line

ref https://xamarin.com/csharp 40

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

LINQ01.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

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

async/await

[Java]!01 int doHeavyWork() {!02 return /* working... */;!03 }!!04 private void onClick(View v) {!05 new AsyncTask<Void, Void, Integer>() { !06 @Override!07 protected Integer doInBackground(Void... params) {!08 return doHeavyWork();!09 }! !10 protected void onPostExecute(Integer result) {!11 label1.Text = "count = " + result;!12 };!13 }.execute((Void)null);!14 }

[C#]!01 Task<int> DoHeavyWork() {!02 return Task.Run<int>(() => {!03 return /* working... */;!04 });!05 }!!06 async void onClick(object s, EventArgs e) {!07 var result = await DoHeavyWork();!08 label1.Text = "count = " + result;!09 }!

ワーカースレッドで時間のかかる処理をして、終わったらメインスレッドで結果を表示

42

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

まとめ

43

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

まとめ• Mac + Xamarin Studio + Xamarin.Android + Xamarin.iOS で クロスPF 開発

• Win は、VS + Xamarin Addin で

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

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

44

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

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

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

Xamarin Advent Calendar 2013

ref http://qiita.com/advent-calendar/2013/xamarin 46

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

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

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

ありがとうございました