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

44
Xamarin による クロスプラットフォーム モバイルアプリ開発 2014.6.19 コスモルート社内勉強会

Upload: amay-077

Post on 28-May-2015

1.063 views

Category:

Technology


6 download

TRANSCRIPT

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

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

2014.6.19 コスモルート社内勉強会

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

Xamarin とはなんぞや?

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

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

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

2

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

ひとことで言えば

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

3

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

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

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

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

4

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

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

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

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

• Visual Studio アドイン

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

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

5

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

価格体系

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

ref https://store.xamarin.com/

6

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

使われてるの?

530,000 developers in worldwide

ref http://xamarin.com/apps

7

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

日本でも

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

8

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

Microsoftと提携!

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

• Xamarin 3リリースキャンペーン中(エクセルソフトによる。~6/30)

ref http://xamarin.com/msdn

9

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

Win+Visual Studio で作る?

• iOS 開発の為に Mac が必要

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

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

↓ Mac + Xamarin Studio での開発が

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

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

Xamarin とは(もう一度)

各PFのMono実装+

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

11

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

Xamarin.Android の実行モデル

VM(Dalvik)

Linux カーネル

コアライブラリ群

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

アプリケーション(Java)

Monoランタイム

Linux カーネル

コアライブラリ群

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

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

Android(標準) Xamarin.Android

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

12

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

Xamarin.iOS の実行モデル

ARM

ARMマシン語

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

iOS(標準)

コアライブラリ群

CocoaTouch

LLVMコンパイラ

実機

ARM

ARMマシン語

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

コアライブラリ群

CocoaTouch

Mono AOTコンパイラ

実機

CocoaTouch(.NET) .NET4.5 BCL

Xamarin.iOS

13

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

利点と欠点• Xamarin.Android

• ◎:Microsoftと仲が良い<GoogleはOracleと仲悪い(Javaで敗訴)>

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

• Xamarin.iOS

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

• △:事前コンパイル(AOT)の為、使えない機能(リフレクション等)がある

14

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

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

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

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

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

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

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

15

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

DEMOXamarin.Android と iOS で HelloWorld

16

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

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

17

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

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

共通化できるところ

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

• 通信処理

• ファイルI/O

• 非同期処理

• 画面(Xamarin.Forms)

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

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

• カメラやアドレス帳

• アプリ間連携

18

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

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

CocoaTouch

CocoaTouch (.NET)

Xamarin.iOS

Monoランタイム

Androidコアライブラリ群

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

アプリ(C#)

Xamarin.AndroidiOSコアライブラリ群

.NET4.5 BCL

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

PCL(Portable Class Library)

19

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

画面の共通化• Xamarin.Forms

• 単一の画面定義で複数PFで動作(ネイティブ)

• XAMLまたはコードでUIを定義(エディタはまだ)

• PF固有

• iOSなら.storyboard - ViewController

• Androidなら.axml - Activity

• 両者の相互運用も可能

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

DEMOXamarin.Forms

21

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

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

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

• Xamarin.Android/iOS も対応

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

22

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

既存資産の活用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 より結構大変23

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

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

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

• http://scan.xamarin.com/

24

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

既存資産の活用3• Xamarin Components

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

• Nuget

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

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

• CodePlex, Githubなど

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

25

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

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

Titanium / PhoneGap / Adobe AIR / Delphi XE

26

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

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

実行形式 Android:JIT iOS:AOT

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

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

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

27

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

Titanium Mobile

言語 JavaScript

実行形式 インタプリタ

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

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

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

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

28

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

PhoneGap/Sencha Touch

言語 HTML5+CSS+JavaScript

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

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

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

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

29

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

Adobe AIR for モバイル

言語 ActionScript

実行形式 Android:JIT iOS:AOT

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

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

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

30

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

Delphi XE言語 Delphi

実行形式 Android:AOT iOS:AOT

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

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

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

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

31

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

Others• Qt Mobile

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

• RoboVM、RubyMotion

• 言語が違うだけで仕組みはXamarinに似てる

• Unity, Corona

• ゲーム向けっぽい32

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

しかし Xamarin 最大の利点は

33

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

C#34

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

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/csharp35

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

LINQ to Objects01.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

36

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

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 }!

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

37

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

Swift でたよ?

38

• 「Obj-C嫌だからXamarin」だけだった人はSwiftで十分

• 新しい言語だけあってC#より優れていそうな所もある

• クロスPFや.NET資産の利用ならやっぱりXamari

• SwiftとObj-Cは相互運用可能なので、Swift→Xamarinも可能(なはず)

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

まとめ

39

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

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

• Win は、VS + Xamarin Addin で

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

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

40

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

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

• Xamarin逆引きTips - http://www.buildinsider.net/mobile/xamarintips

• StackOverflow - http://stackoverflow.com/questions/tagged/monodroid+or+monotouch+or+xamarin?sort=active

41

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

Xamarin Advent Calendar 2013

ref http://qiita.com/advent-calendar/2013/xamarin42

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

What's Next?• Xamarin Test Cloud

• X-Platform MVVM Frameworks

• MvvmCross / QuickCross / ReactiveUI / etc

• Using Locations and Maps

• 第1回 Japan Xamarin User Group Conference (June 5 Tokyo)

• Xamarin Evolve 2014 (Oct 6-10)43

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

ありがとうございました

@amay077