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