この辺でxamarin導入による 効果と限界をしっかり把握してみよう mvp...
TRANSCRIPT
2015.01.31 MVP Community Camp 札幌会場
Objective-CやJavaとの比較によるXamarinの理解・プラットフォーム固有の機能は如何にコーディングされるのか・・・
この辺で、Xamarin導入による 効果と限界をしっかり把握してみよう
自己紹介
識別子 SIN/札幌ワークス
Twitter @furuya02
仕事 某社でシステムサポート
スタッフ CLR/H
ブログ SIN@SAPPOROWORKSの覚書
Microsoft MVP for Visual C# (2013/1~)
フリーソフト BlackJumboDog
紅白歌合戦でNHKがアプリ配信2年連続でフェンリル株式会社製
http://www.fenrir-inc.com/jp/business/app/casestudy_app/nhk_kouhaku.html
2013@amay077氏
Xamarin Advent Calendar 2013 作成:奥山 裕紳 氏(@amay077)http://qiita.com/advent-calendar/2013/xamarin
2014数日で埋まりました
Xamarin Advent Calendar 2014 作成:奥山 裕紳 氏(@amay077)http://qiita.com/advent-calendar/2014/xamarin
Xamarinとは更新の頻度は異常に早い
Xamarin で Android L Developer Preview と Android Wear をサポートhttp://www.xlsoft.com/jp/products/xamarin/android-l-developer-preview.html
Xamarin は iOS 8 に完全対応http://www.xlsoft.com/jp/products/xamarin/xamarin-ios-8.html
Xamarin.iOS Unified API の 64-bit 対応http://www.xlsoft.com/jp/products/xamarin/xamarin-ios-unified-api-with-64-bit-support.html
WatchKit対応(Preview)http://developer.xamarin.com/guides/ios/watch/installation/
XamarinもP/InvokeP/Invoke の仕組みで iOS/Android の API を C# に公開(AndroidはJNI)
Android API
Java Xamarin.Android
iOS API
Objecttive-C Xamarin.iOS
注:個人的理解
実行Androidでは、MonoVM、iOSでは、直前コンパイルでARM命令に変換される
Dalvik VM
Javaバイトコード MSIL
Java
Mono VM
Android
Xamarin.Android
iOS
Objectiv-C Xamarin.iOS
EXE,DLL
Monoランタイム(ARM命令に変換)
ARM命令
注:個人的理解
Android編ボタンの生成を例に比較してみる
Button btn = new Button(this); // ボタンの生成btn.setText("OK"); // キャプションbtn.setLayoutParams(new LayoutParams(100,80)); // サイズlayout.addView(btn); // レイアウトへの追加
Java
Android編サイズ
btn.setLayoutParams(new LayoutParams(100,80));
btn.LayoutParameters = new LayoutParams(100,80);
Java
C#
Android編もはや同じと言っても過言ではない
Button btn = new Button(this);btn.setText("OK");btn.setLayoutParams(new LayoutParams(100,80));layout.addView(btn);
Button btn = new Button(this); btn.Text = "OK";btn.LayoutParameters = new LayoutParams(100,80);layout.AddView(btn);
Java
C#
iOS編ボタンの生成を例に比較してみる
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem]; // ボタンの生成[btn setTitle:@“OK” forState:UIControlStateNormal]; // キャプション[btn setFrame:CGRectMake(110,210,100,40)]; // サイズ・位置[self.view addSubview:btn]; // ビューへの追加
Objectiv-C
iOS編ボタン生成
UIButton *btn =[UIButtonbuttonWithType:UIButtonTypeSystem];
UIButton btn = UIButton.FromType(UIButtonType.System);
Objectiv-C
C#
iOS編キャプション
[btn setTitle:@“OK” forState:UIControlStateNormal];
btn.SetTitle("OK",UIControlState.Normal);
Objectiv-C
C#
iOS編サイズ・位置
[btn setFrame:CGRectMake(110,210,100,40)];
btn.Frame = new CGRect(110,210,100,40);
Objectiv-C
C#
iOS編まー同じ?(似てる)といっても問題ない
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem]; [btn setTitle:@“OK” forState:UIControlStateNormal]; [btn setFrame:CGRectMake(110,210,100,40)];[self.view addSubview:btn];
UIButton btn = UIButton.FromType(UIButtonType.System);btn.SetTitle("OK",UIControlState.Normal);btn.Frame = new CGRect(110,210,100,40);View.AddSubview(btn);
Objectiv-C
C#
iOS・UINavigationController/UIViewController・pushViewController スタック管理・popViewController 画面遷移
Android・Activity単位・Intentに発行・Intent経由でパラメータ渡し
アーキテクチャ画面遷移
アーキテクチャiOSライフサイクル
・localView 画面読み込み・viewDidLoad ビュー読み込み完了・viewWillAppear 画面描画前・viewDidAppear 画面描画後・viewWillDisappear 閉じる前・viewDidDisappear 閉じ終わった
アーキテクチャAndroidライフサイクル
・onCreate 画面作成(初めて)・onStart 画面表示直前・onResume ユーザとの対話開始・onPause 別画面への移行時・onStop ユーザから見えなくなった・onRestart 停止後の再開・onDestroy 画面破棄
.NET BCLプラットフォーム固有+C#Core
ファイル操作 System.IOネットワーク操作 System.NETデータ操作 System.LinqXML操作 System.XML非同期操作 System.Threading
varで書けるバリアントじゃないよ
NagaiName<String,String> n = new NagaiName<String,String>();
var n = new NagaiName<String,String>();
リスナー系がイベントになっている別途リスナークラスを用意する必要はない
//Java リスナークラスを作成してonClickをオーバーライドするbutton.setOnClickListener(new View.OnClickListener() {
@Overridepublic void onClick(View v) {
// 処理}
});
button.Click += 処理
ラムダ式規模の小さい処理を最小スコープで記述できる
runOnUiThread(new Runnable() {@Overridepublic void run() {
//UI処理}
}
RunOnUiThread(() => UI処理 );
Linq好きな人は、無いと辛い
var ans1 = ar.Count(); var and2 = ar.Sum(n => n*2);var ans3 = ar.Where(n => n != 5).Sum();
Parallelやっぱり簡単に書けるのが嬉しいX
foreach (var item in collection) {Thread.Sleep(1000);
}
Tasks.Parallel.ForEach(collection, item => {Thread.Sleep(1000);
});
async await簡単に書けるのが、ただただ嬉しい
button.Click += async (s, a) => {
var res = await HeavyAsync(); //時間のかかる処理button.Text = res.ToString();// UIスレッドで実行される
};
Xamarin.Formsとは独自ライブラリ(コード+XAML+データバインディング)
<?xml … ?><ContentPage … >
<Label Text="{Binding …}"…
BindingContext="{…}“/></ContentPage>
Xamarin.Forms単一コードで、Android、Windows Phone、iOSで動作できる
var map = new Map( ...)var pin = new Pin {
Position = position,Label = "custom pin",・・・
};map.Pins.Add(pin);Content=new StackLayout {
Children = { map } };
DependencyServiceインターフェースによる委譲
//インターフェース定義public interface ICMail {
bool Send(string to, string message);}
//機能の利用DependencyService.Get<ICMail>().Send("to","message");
//機能の実装[assembly: Xamarin.Forms.Dependency (typeof(CMail))]class CMail : ICMail {
public bool Send(string to, string message) {}
PCL
各PF
Xamarin.Formsの拡張各PFで記述可能なものすべてがFormsでも利用可能
//インターフェース定義public interface ICMail {
bool Send(string to, string message);}
//機能の利用DependencyService.Get<ICMail>().Send("to","message");
//機能の実装[assembly: Xamarin.Forms.Dependency (typeof(CMail))]class CMail : ICMail {
public bool Send(string to, string message) {}
独自コントロール
カスタムレンダラー
DependencyService
INDIE・BUSINESSの違いSupport in-house , headless builds , System.Data.SqlClient
Indie個人開発者、5名以内の会社・サポートなし(フォーラムのみ)アプリサイズの制限なしXamarin Studio では、ほぼ制限ない開発
Business法人向けライセンスVisual Studio での開発ビジネス向け機能Email サポート
Xamarin 日本語情報「Xamarin のエディションについて」http://ytabuchi.hatenablog.com/entry/2015/01/28/170126
アカデミック プログラムINDIE無償
http://www.xlsoft.com/jp/products/xamarin/student.html?r=ythb
大学、専門学校、高校などの教育機関に在籍する学生を対象にXamarin INDIE 版を無償提供
Build INSIDER Xamarin逆引きTipshttp://www.buildinsider.net/mobile/xamarintips
Xamarin情報
唯一の日本語解説書「C#によるiOS、Android、Windowsアプリケーション開発入門」増田 智明 (著), 大西 彰 (著)
Build INSIDER インサイドXamarinhttp://www.buildinsider.net/mobile/insidexamarin
Xamarin 日本語情報 田淵義人 氏(@ytabuchi)http://ytabuchi.hatenablog.com/
Xamarin情報
Qiita キーワード「Xamarin」http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=Xamarin&sort=rel
参考にさせて頂いた資料
インサイドXamarin 榎本 温 氏(@atsushieno)http://www.buildinsider.net/mobile/insidexamarin
Xamarin逆引きTips 奥山 裕紳 氏(@amay077)http://www.buildinsider.net/mobile/xamarintips
Xamarin.Formsの概要と カスタムコントロール 増田智明 氏(@moonmile)http://www.slideshare.net/moonmile/xamarinforms-41882310
Xamarin Advent Calendar 2014 作成:奥山 裕紳 氏(@amay077)http://qiita.com/advent-calendar/2014/xamarin
iOS,Android,WindowsPhoneを開発者目線で比較http://www.afp-records.com/android/ios_android_windowsphone_03.html