Download - Xamarin によるクロスプラットフォームモバイルアプリ開発
![Page 1: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/1.jpg)
Xamarin による クロスプラットフォーム モバイルアプリ開発2014.2.26 うずらインキュベータ #1
in Toyohashi, Aichi
![Page 2: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/2.jpg)
自己紹介• Twitter: @amay077
• 位置情報エンジニア、モバイルアプリエンジニア、etc
• MapQuest.co.jp → Cosmoroot,Inc(Nagoya)
2
地図, 位置情報, オープンデータ, C#, Android, iOS, Xamarin
“Now” Hot topics
![Page 3: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/3.jpg)
• (ロジネビュラ)
• 千年先まで費用ゼロのクラウド型倉庫管理システム
• (ジクウ)
• リアルタイムデータ収集プラットフォーム
• Nepula(ネプラ)
• 基幹業務システム向けPaaS
おもにココ担当
クラウドサービスプロバイダ
3
![Page 4: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/4.jpg)
HexRinger developed atハマッカソン #2
ref http://blog.airs.co.jp/2010/12/06/hamackathon-20101204.html
4
![Page 5: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/5.jpg)
しゃべPOI developed forOpenStreetMappers
続きは… 位置情報系Androidアプリケーションの開発 - Togetterまとめ
5
![Page 6: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/6.jpg)
富士フォト with ふじのくにオープンデータ
MashupAward9, アーバンデータチャレンジ東京2013
ref シビックハックの広まりと地方エンジニアの躍進 ‒ MA9総括 | finder
6
![Page 7: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/7.jpg)
本題
7
![Page 8: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/8.jpg)
Xamarin とはなんぞや?
• 「ざまりん」と読みます
• .NET Framework のオープンソース実装である「Mono」を作ってる人たちが作った企業の名前
• 及び、同社が提供するSDKやツールなどをひっくるめた総称
8
![Page 9: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/9.jpg)
ひとことで言えば
.NET(C#)で、Android/iOS/Mac/Window アプリを開発できるSDK
9
![Page 10: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/10.jpg)
もうちょっと詳しく1• Xamarin.iOS(旧MonoTouch)Xamarin.Android(旧MonoDroid)Xamarin.Mac(MonoMac)
• 各プラットフォーム(PF)のMono実装+各PFのAPIの”薄い”ラッパー
• いずれもOSSではなく、有償のプロダクト(MonoMacはOSS、ただしGPL/LGPL)
10
![Page 11: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/11.jpg)
もうちょっと詳しく2• Xamarin Studio(旧MonoDevelop)
• Win/Mac/Linux で動作するOSSな統合開発環境(IDE)
• モバイル開発以外でも使われる(ってか、そっちが主)
• Visual Studio アドイン
• iOS/Android開発を実現するためのアドイン
• Xamarin BUSINESSエディション以上が必要
11
![Page 12: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/12.jpg)
価格体系
「/年/PF/開発者」である事に注意!(更新せずに使い続けてもOK) 学割あります(BUSINESS版が $99!!)
ref https://store.xamarin.com/
12
![Page 14: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/14.jpg)
日本でも
ref フェンリル株式会社 | スマートフォンアプリ開発 実績 NHK 紅白
14
![Page 15: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/15.jpg)
Microsoftと提携!
• Portable Class Library が Xamarin.iOS, Xamarin.Android にも対応
• MSDNサブスクライバー向け特別価格Xamarin.iOS,Android BUSINESS版が30%OFF
ref http://xamarin.com/msdn
15
![Page 16: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/16.jpg)
Win+Visual Studio で作る?• iOS 開発の為に Mac が必要
• リモート接続してビルド&デバッグ • iOS開発でUIデザイナ(Interface Builder)が使えない
• Xamarin.Android には UIデザイナあります • インストールや日本語入力が不安定との噂も
↓ Mac + Xamarin Studio での開発が
現在のベストプラクティス(個人の見解です) 16
![Page 17: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/17.jpg)
Xamarin とは(もう一度)
各PFのMono実装+
各PFのAPIの”薄い”ラッパー
17
![Page 18: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/18.jpg)
Xamarin.Android の実行モデル
VM(Dalvik)
Linux カーネル
コアライブラリ群
アプリケーションフレームワーク(Java)
アプリケーション(Java)
Monoランタイム
Linux カーネル
コアライブラリ群
JavaSE6 アプリケーションフレームワーク(.NET) .NET4.5 BCL
アプリケーション(C#)
Android(標準) Xamarin.Android
どちらも中間言語を ランタイムがJITコンパイルして実行
18
![Page 19: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/19.jpg)
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 によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/20.jpg)
利点と欠点• Xamarin.Android
• ◎:Microsoftと仲が良い<GoogleはOracleと仲悪い(まだJava6)>
• △:Monoランタイムをアプリに含めるためサイズが増加
• Xamarin.iOS
• ◎:ガベージコレクション、静的型付け
• △:事前コンパイル(AOT)の為、使えない機能(動的コード生成等)がある
20
![Page 21: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/21.jpg)
「薄いラッパ」である事の利点
• PFのバージョンアップに追従しやすい
• 厚いラッパ(=共通API)では、複数PFで整合性を取らないといけないので時間がかかる
• PF固有の開発経験が活かせる
• 潰しが利く(=PF固有の開発に戻りやすい)
• 使い方が変わってしまう厚いラッパでは、戻るのは難しい
21
![Page 22: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/22.jpg)
DEMOXamarin.Android と iOS で HelloWorld
22
![Page 23: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/23.jpg)
クロスプラット フォームで開発するには
23
![Page 24: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/24.jpg)
どこが共通化できるの?1
共通化できるところ(基本ライブラリ相当機能)
• 基本データ型、計算処理
• 通信処理
• ストリームI/O
• 非同期処理
共通化できないところ(PF固有の機能)
• 画面
• センサー系(GPS、加速度等)
• カメラやアドレス帳
• アプリ間連携
24
![Page 25: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/25.jpg)
どこが共通化できるの?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 によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/26.jpg)
そして PCL へ• PF間で共有できる「ポータブル」なクラスライブラリ
• 実際には、対応PFセット毎にプロファイルが定義されている
• Xamarin.Android/iOS も対応
WPF/Win8/Android/iOS に1ソース (というか1バイナリ)で対応できる
26
![Page 27: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/27.jpg)
DEMOPCL をつくって Xamarin.Android
と iOS から使ってみる
27
![Page 28: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/28.jpg)
既存資産の活用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 によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/29.jpg)
既存資産の活用2• 既存の.NET資産もある程度使える(PCLでなくても)
• .NET Mobility Scanner でどの程度利用できるか調べる事ができる
• http://scan.xamarin.com/
29
![Page 30: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/30.jpg)
既存資産の活用3• Xamarin Components
• Xamarinで利用できるライブラリのマーケット
• Nuget
• .NET 向けのパッケージマネージャ
• 画面に依存しないライブラリなら使えるかも
• CodePlex, Githubなど
• ライブラリが対応してなかったらコードを入手してXamarin用にビルドという手も
30
![Page 31: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/31.jpg)
他のクロスプラット フォーム開発ツールとの比較
Titanium / PhoneGap / Adobe AIR / Delphi XE
31
![Page 32: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/32.jpg)
Xamarin(おさらい)言語 C#(.NET)
実行形式 Android:JIT iOS:AOT
共通化可能 基本ライブラリ相当機能 (計算処理、通信処理、非同期処理など)
共通化不可能 PF固有の機能(UI, センサーなど)
PF固有機能 呼び出し PF毎のAPIを呼び出し可能
32
![Page 33: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/33.jpg)
Titanium Mobile
言語 JavaScript
実行形式 インタプリタ
共通化可能コアロジック、GPS など
共通APIが用意されている機能、 Label, EditBoxなど簡素なUI
共通化不可能 PF固有のUIパーツ(CoverFlowView等) コアロジックでもPF依存が多いとの噂
PF固有機能 呼び出し Module を作成
33
![Page 34: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/34.jpg)
PhoneGap/Sencha Touch
言語 HTML5+CSS+JavaScript
実行形式 WebView上で動作するWebアプリ
共通化可能 Webアプリなので一見は共通。 共通APIが用意される一般的な機能
共通化不可能 ブラウザ依存は少なくない 共通APIが無い機能
PF固有機能 呼び出し Plugin を作成
34
![Page 35: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/35.jpg)
Adobe AIR for モバイル
言語 ActionScript
実行形式 Android:JIT iOS:AOT
共通化可能 UI含め API が用意されていれば可能。 ただしUIは独自レンダリング
共通化不可能 基本的には無いが、 その分機能が最小公倍数である
PF固有機能 呼び出し Native Extensions を作成
35
![Page 36: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/36.jpg)
Delphi XE言語 Delphi
実行形式 Android:JIT(JNI) iOS:AOT
共通化可能UI含め API が用意されていれば可能。
UIは独自レンダリングだが Pixel Perfect でPFのスタイルを忠実に再現。
共通化不可能 PF毎のAPIもあり、 それを使った場合は共通化不可能
PF固有機能 呼び出し PF毎のAPIを呼び出し可能
36
![Page 37: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/37.jpg)
Others• Qt Mobile
• C++ で書けるなら最強じゃね?(書けるなら)
• RoboVM
• Java → LLVM → Obj-C
• Unity, Corona
• ゲーム向けっぽい 37
![Page 38: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/38.jpg)
しかし Xamarin 最大の利点は
38
![Page 39: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/39.jpg)
C# 39
![Page 40: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/40.jpg)
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 によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/41.jpg)
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 によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/42.jpg)
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 によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/43.jpg)
まとめ
43
![Page 44: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/44.jpg)
まとめ• Mac + Xamarin Studio + Xamarin.Android + Xamarin.iOS で クロスPF 開発
• Win は、VS + Xamarin Addin で
• PCL でコアロジックをクロスPFでバイナリ共有
• C# >>>>>>> Java, Objective-C
44
![Page 45: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/45.jpg)
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 によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/46.jpg)
Xamarin Advent Calendar 2013
ref http://qiita.com/advent-calendar/2013/xamarin 46
![Page 47: Xamarin によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/47.jpg)
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 によるクロスプラットフォームモバイルアプリ開発](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55660a13d8b42aa6628b5009/html5/thumbnails/48.jpg)
ありがとうございました