Xamarin.iOS

45
Xamarin.iOS 宇佐見 公輔

Transcript of Xamarin.iOS

Xamarin.iOS!

宇佐見 公輔

自己紹介• 宇佐見 公輔(twitter: @usamik26)

• フェンリル株式会社 共同開発部

• CotEditor 開発(OS X テキストエディタ)

最近の仕事• 普段は Objective-C で iOS アプリ開発

• 最近は Xamarin + MvvmCross はじめました

Agenda・Xamarin とは何か

・C# を使う

・Xamarin Studio

・MVVM とは

・MvvmCross

・Xamarin ライセンス

Xamarin とは何か

Xamarin とは何か• C# でアプリ開発

• iOS / Android / Mac

• .NET / Mono ベース

• MonoTouch / MonoDroid / MonoMac

Xamarin.iOS• ネイティブアプリとしてコンパイル

• 従って、App Store 申請が可能

Xamarin.iOS

• MonoTouch 経由で全 iOS API にアクセス可能

• 最新 SDK への追随も早い(既に iOS 8 対応)

• 命名は C# の流儀にあわせてある

バインディング例

[UIImage imageNamed:@“hoge”] (Objective-C)!UIImage.FromBundle(“hoge”) (C#)

[MonoTouch.Foundation.Export("imageNamed:")]public static UIImage FromBundle (string name)

既存コードの利用• Objective-C で書かれたコードを利用可能

• ネイティブバインディングを自分で生成

Xamarin 解説

Xamarin 開発実績

C# を使う

C#

• Objective-C や Swift の代わりに C# を使う

• C# 固有の文法が使える

型推論

var x = 1; // x は int!var obj = new Hoge(); // obj は Hoge オブジェクト

ラムダ式

// 一番簡潔な記法(型推論)x => x > 0!// 型や return を省略しない記法(int x) => { return x > 0; }!// 通常の関数で書いた場合bool Hoge(int x) { return x > 0; }

LINQ !(クエリ)

var list1 = list.Where(x => x > 0);!var list2 = list.Where(x => x > 0) .Select(x => x.Name);

async / await !(非同期処理)

async void Hoge(){ Work1(); // 普通に呼ばれる var result = await WorkAsync(); // 別スレッド Work2(); // WorkAsync の後で呼ばれる}

Xamarin Studio

開発環境• Xamarin Studio(以前は MonoDevelop)

• Storyboard の編集も Xamarin Studio で可能

• xib の編集は Xcode を起動して連動

Storyboard

AutoLayout

NuGet

• NuGet で各種ライブラリを導入できる

• 後述の MvvmCross も NuGet で

MVVM とは

MVVM

• Model - View - ViewModel

ロジックとビューの分離• ロジック部分はプラットフォーム非依存

ビューはプラットフォームごと• 各プラットフォームの世界観を大事にする

MVVM を使うには• C# / .NET 文化圏でつちかわれてきた

• このため、Xamarin と MVVM は相性がよい

• 余談:Objective-C or Swift でやるなら

ReactiveCocoa を使うのが良い

MvvmCross

MvvmCross

• Xamarin で MVVM 設計をサポートするライブラリの1つ

• https://github.com/MvvmCross/MvvmCross

プロジェクト構成• Core

• Touch (iOS)

• Droid (Android)

プロジェクト構成• Core Project

• プラットフォーム固有の機能は使えない

• Touch / Droid Project

• プラットフォーム固有の機能が使える

• でも、View にはロジックを書かない

プラットフォーム依存の機能• プラットフォーム依存の機能を使いたい

• たとえばカメラとか

• プラグインを作ることで解決

View の作成• MVVM の View = UIViewController

• View のコードは最小限におさえる

• 画面ロジックは ViewModel

• xib + AutoLayout を活用

• (現状 MvvmCross は Storyboard 非対応)

画面遷移• 画面遷移の論理は ViewModel に記述

• アニメーション処理などは View に記述

• Storyboard の Segue とは相性悪い・・・

バインディング• View と ViewModel のバインディング記述

• これはコードで書くしかない(iOS の場合)

バインディング

var set = this.CreateBindingSet<HogeView, HogeViewModel>();set.Bind(HogeLabel).To(vm => vm.HogeText);set Bind(HogeButton).To(vm => vm.HogeCommand);set.Apply();

その他• MvvmCross はバインディングを楽にするクラスをいくつか用意している

• MvxImageView

• MvxTableViewSource

• など

Xamarin ライセンス

Xamarin ライセンス• ライセンス高い・・・

• 1ヶ月の Trial あり

お知らせ

エンジニア募集中

Xamarin に興味がある人は ぜひどうぞ