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

1,965 views

Published on

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,965
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
12
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

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

  1. 1. Xamarin による クロスプラットフォーム モバイルアプリ開発 2014.6.19 コスモルート社内勉強会
  2. 2. Xamarin とはなんぞや? • 「ざまりん」と読みます • .NET Framework のオープンソース実装である 「Mono」を作ってる人たちが作った企業の名前 • 及び、同社が提供するSDKやツールなどをひっ くるめた総称 2
  3. 3. ひとことで言えば .NET(C#)で、Android/iOS/Mac/ Window アプリを開発できるSDK 3
  4. 4. もうちょっと詳しく1 • Xamarin.iOS(旧MonoTouch)
 Xamarin.Android(旧MonoDroid)
 Xamarin.Mac(MonoMac) • 各プラットフォーム(PF)のMono実装
 +各PFのAPIの 薄い ラッパー • いずれもOSSではなく、有償のプロダクト (MonoMacはOSS、ただしGPL/LGPL) 4
  5. 5. もうちょっと詳しく2 • Xamarin Studio(MonoDevelop+Addin) • Win/Mac/Linux で動作するOSSな統合開発環境(IDE) • モバイル開発以外でも使われる(ってか、そっちが主) • Visual Studio アドイン • iOS/Android開発を実現するためのアドイン • Xamarin BUSINESSエディション以上が必要 5
  6. 6. 価格体系 「/年/PF/開発者」である事に注意!(更新せずに使い続けてもOK) 学割あります(BUSINESS版が $99!!) ref https://store.xamarin.com/ 6
  7. 7. 使われてるの? 530,000 developers in worldwide ref http://xamarin.com/apps 7
  8. 8. 日本でも ref フェンリル株式会社 ¦ スマートフォンアプリ開発 実績 NHK 紅白 8
  9. 9. Microsoftと提携! • Portable Class Library が Xamarin.iOS, Xamarin.Android にも対応 • Xamarin 3リリースキャンペーン中(エクセルソ フトによる。∼6/30) ref http://xamarin.com/msdn 9
  10. 10. Win+Visual Studio で作る? • iOS 開発の為に Mac が必要 • リモート接続してビルド&デバッグ • インストールや日本語入力が不安定との も ↓ Mac + Xamarin Studio での開発が 現在もベストプラクティス(個人の見解です) 10
  11. 11. Xamarin とは(もう一度) 各PFのMono実装
 +
 各PFのAPIの 薄い ラッパー 11
  12. 12. Xamarin.Android の実行モデル VM(Dalvik) Linux カーネル コアライブラリ群 アプリケーションフレー ムワーク(Java) アプリケーション(Java) Monoランタイム Linux カーネル コアライブラリ群 JavaSE6 アプリケーションフレー ムワーク(.NET) .NET4.5 BCL アプリケーション(C#) Android(標準) Xamarin.Android どちらも中間言語を ランタイムがJITコンパイルして実行 12
  13. 13. Xamarin.iOS の実行モデル ARM ARMマシン語 アプリケーション(Objective-C) iOS(標準) コアライブラリ群 CocoaTouch LLVMコンパイラ 実機 ARM ARMマシン語 アプリケーション(C#) コアライブラリ群 CocoaTouch Mono AOTコンパイラ 実機 CocoaTouch(.NET) .NET4.5 BCL Xamarin.iOS 13
  14. 14. 利点と欠点 • Xamarin.Android • ◎:Microsoftと仲が良い
 <GoogleはOracleと仲悪い(Javaで敗訴)> • △:Monoランタイムをアプリに含めるためサイズが 増加 • Xamarin.iOS • ◎:ガベージコレクション、静的型付け • △:事前コンパイル(AOT)の為、使えない機能(リフ レクション等)がある 14
  15. 15. 「薄いラッパ」である事の利点 • PFのバージョンアップに追従しやすい • 厚いラッパ(=共通API)では、複数PFで整合性を 取らないといけないので時間がかかる • PF固有の開発経験が活かせる • 潰しが利く(=PF固有の開発に戻りやすい) • 使い方が変わってしまう厚いラッパでは、戻る のは難しい 15
  16. 16. DEMO Xamarin.Android と iOS で HelloWorld 16
  17. 17. クロスプラット フォームで開発するには 17
  18. 18. どこが共通化できるの?1 共通化できるところ • 基本データ型、計算処理 • 通信処理 • ファイルI/O • 非同期処理 • 画面(Xamarin.Forms) 共通化できないところ
 (PF固有の機能) • センサー系(GPS、加速度等) • カメラやアドレス帳 • アプリ間連携 18
  19. 19. どこが共通化できるの?2 CocoaTouch CocoaTouch (.NET) Xamarin.iOS Monoランタイム Androidコアライブラリ群 アプリケーションフレー ムワーク(.NET) .NET4.5 BCL アプリ(C#) Xamarin.Android iOSコアライブラリ群 .NET4.5 BCL アプリ(C#) _ここは共通化できる PCL(Portable Class Library) 19
  20. 20. 画面の共通化 • Xamarin.Forms • 単一の画面定義で複数PFで動作(ネイティブ) • XAMLまたはコードでUIを定義(エディタはまだ) • PF固有 • iOSなら.storyboard - ViewController • Androidなら.axml - Activity • 両者の相互運用も可能
  21. 21. DEMO Xamarin.Forms 21
  22. 22. そして PCL へ • PF間で共有できる「ポータブ ル」なクラスライブラリ • 実際には、対応PFセット毎にプ ロファイルが定義されている • Xamarin.Android/iOS も対応 WPF/Win8/Android/iOS に1ソース (というか1バイナリ)で対応できる 22
  23. 23. 既存資産の活用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
  24. 24. 既存資産の活用2 • 既存の.NET資産もある程度 使える(PCLでなくても) • .NET Mobility Scanner で どの程度利用できるか調べ る事ができる • http:// scan.xamarin.com/ 24
  25. 25. 既存資産の活用3 • Xamarin Components • Xamarinで利用できるライブラリのマーケット • Nuget • .NET 向けのパッケージマネージャ • 画面に依存しないライブラリなら使えるかも • CodePlex, Githubなど • ライブラリが対応してなかったらコードを入手して Xamarin用にビルドという手も 25
  26. 26. 他のクロスプラット フォーム開発ツールとの比較 Titanium / PhoneGap / Adobe AIR / Delphi XE 26
  27. 27. Xamarin(おさらい) 言語 C#(.NET) 実行形式 Android:JIT iOS:AOT 共通化可能 UIと基本ライブラリ相当機能 (計算処理、通信処理、非同期処理など) 共通化不可能 PF固有の機能(センサーなど) PF固有機能 呼び出し PF毎のAPIを呼び出し可能 27
  28. 28. Titanium Mobile 言語 JavaScript 実行形式 インタプリタ 共通化可能 コアロジック、GPS など
 共通APIが用意されている機能、 Label, EditBoxなど簡素なUI 共通化不可能 PF固有のUIパーツ(CoverFlowView等) コアロジックでもPF依存が多いとの PF固有機能 呼び出し Module を作成 28
  29. 29. PhoneGap/Sencha Touch 言語 HTML5+CSS+JavaScript 実行形式 WebView上で動作するWebアプリ 共通化可能 Webアプリなので一見は共通。 共通APIが用意される一般的な機能 共通化不可能 ブラウザ依存は少なくない 共通APIが無い機能 PF固有機能 呼び出し Plugin を作成 29
  30. 30. Adobe AIR for モバイル 言語 ActionScript 実行形式 Android:JIT iOS:AOT 共通化可能 UI含め API が用意されていれば可能。 ただしUIは独自レンダリング 共通化不可能 基本的には無いが、 その分機能が最小公倍数である PF固有機能 呼び出し Native Extensions を作成 30
  31. 31. Delphi XE 言語 Delphi 実行形式 Android:AOT iOS:AOT 共通化可能 UI含め API が用意されていれば可能。
 UIは独自レンダリングだが Pixel Perfect でPFのスタイルを忠実に再現。 共通化不可能 PF毎のAPIもあり、 それを使った場合は共通化不可能 PF固有機能 呼び出し PF毎のAPIを呼び出し可能 31
  32. 32. Others • Qt Mobile • C++ で書けるなら最強じゃね?(書けるなら) • RoboVM、RubyMotion • 言語が違うだけで仕組みはXamarinに似てる • Unity, Corona • ゲーム向けっぽい 32
  33. 33. しかし Xamarin 最大の利点は 33
  34. 34. C# 34
  35. 35. 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 35
  36. 36. LINQ to Objects 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 36
  37. 37. 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
  38. 38. Swift でたよ? 38 • 「Obj-C嫌だからXamarin」だけだった人はSwift で十分 • 新しい言語だけあってC#より優れていそうな所も ある • クロスPFや.NET資産の利用ならやっぱりXamari • SwiftとObj-Cは相互運用可能なので、 Swift→Xamarinも可能(なはず)
  39. 39. まとめ 39
  40. 40. まとめ • Mac + Xamarin Studio + Xamarin.Android + Xamarin.iOS で クロスPF 開発 • Win は、VS + Xamarin Addin で • PCL でコアロジックをクロスPFでバイナリ共有 • C# >>>>>>> Java, Objective-C 40
  41. 41. 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
  42. 42. Xamarin Advent Calendar 2013 ref http://qiita.com/advent-calendar/2013/xamarin 42
  43. 43. 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
  44. 44. ありがとうございました @amay077

×