この辺でxamarin導入による 効果と限界をしっかり把握してみよう mvp...

83
2015.01.31 MVP Community Camp 札幌会場 Objective-CJavaとの比較によるXamarinの理解・プラットフォーム固有の機能は如何にコーディ ングされるのか・・・ この辺で、Xamarin導入による 効果と限界 をしっかり把握してみよう

Upload: sin-furuya02

Post on 16-Jul-2015

2.497 views

Category:

Technology


2 download

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

Xamarin人気

紅白歌合戦でNHKがアプリ配信2年連続でフェンリル株式会社製

http://www.fenrir-inc.com/jp/business/app/casestudy_app/nhk_kouhaku.html

はてぶ・Qiitaの投稿件数国内での人気を検索してみた

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とはCreate native

XamarinとはUI+固有機能は、C#ラッパーで各PFごと記述

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/

P/Invoke.NETにおけるネイティブコードを呼び出すしくみ

Win32

.NET

DllImport… System.IO…

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編ボタンの生成

Button btn = new Button(this);

Button btn = new Button(this);

Java

C#

Android編キャプション

btn.setText("OK");

btn.Text = "OK";

Java

C#

Android編サイズ

btn.setLayoutParams(new LayoutParams(100,80));

btn.LayoutParameters = new LayoutParams(100,80);

Java

C#

Android編レイアウトへの追加

layout.addView(btn);

layout.AddView(btn);

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編ビューへの追加

[self.view addSubview:btn];

View.AddSubview(btn);

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 画面破棄

Androidの構成Android Studio で「Blank Activity」を新規作成

Xamarin.Androidの構成Visual Studioで「Blank App(Android)」を新規作成

①AndroidManifest.xml最初に起動するActivityの指定、Xamarinでは定義なし

Java

C#

②MainActivitySetContentView()でレイアウトを指定している

Java

C#

③レイアウト拡張子は、AndroidStudioではXML、Xamarinではaxml(中身は同じ)

Java

C#

iOSの構成Xcode で「Single View Application」を新規作成

④⑤

iOSの構成(Swift)Xcode で「Single View Application」を新規作成

①②

④⑤

①②

③④

Xamarin.iOSの構成Visual Studioで「Single View(iPhone)」を新規作成

①MainUIApplicationMainによる初期化(メインクラス:AppDelegate)

Objecttiv-C

C#

②AppDelegateアプリケーションの起動や終了や中断などの処理

Objecttiv-C

C#

③Info.plistルートビューの指定など

Objecttiv-C

C#

④Storyboardコントロールの配置など(ビューコントローラのクラス名指定)

Objecttiv-C

C#

⑤ViewControllerビューの表示と管理を担当するオブジェクト

Objecttiv-C

C#

C#メリット

Visual Studioが使えるIDEの学習コストがゼロ(Buisnessライセンスが必要)

.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

Xamarin.Formsとは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 } };

独自のライブラリ最初から学習する必要がある

ContentPage

NavigationPage

TabbedPage

独自のライブラリ最初から学習する必要がある

StackLayout

AbsoluteLayout

Grid

独自のライブラリ最初から学習する必要がある

UIのレンダリングはネイティブで行われるコントロールによっては見た目が違う

TimePicker

UIのレンダリングはネイティブで行われるコントロールによっては見た目が違う

Switch

Xamarin.Forms共通的なコントロールを使用する限りは、それなりに書ける

ListView Image

Label

Xamarin.Forms一部のコントロールを拡張することで、それなりに書ける

TextView

Button

BoxView

Xamarin.Forms固有のUIにこだわらないのであれば、すすんで1つに統一(超コストダウン)

Image

Label

Xamarin.Forms固有のUIにこだわらないのであれば、すすんで1つに統一(超コストダウン)

Image

Label

Xamarin.Forms固有UIが一部なら、あまり違和なく共存できる

ToolBar

BoxView

Xamarin.Formsの拡張

独自コントロールBalloonView = Image + BoxView + Label

XAMLで作成してclr-namespaceでインクルードして利用可能(コードビハイドあり)

カスタムレンダラーコントロールの実装を各PF側で記述する

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

料金

月・年単位https://store.xamarin.com/

各PFごとにライセンスが必要

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

MSDN subscribershttps://xamarin.com/msdn

can save 20% on the Business or Enterprise editions

エクセルソフト株式会社国内代理店

Xamarin製品は、英語製日本語によるテクニカルサポート

アカデミック プログラム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情報

SIN@SAPPOROWORKSの覚書http://furuya02.hatenablog.com/entry/20140523/1400966058

参考にさせて頂いた資料

インサイド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

ご清聴ありがとうございました

札幌ワークス

http://www.sapporoworks.ne.jp/spw