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

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

May 28, 2015

Download

Technology

amay 077
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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