42
Xamarin.Mac これからはじめるあなたへ 2015/04/11 #JXUG Tsubasa HIRANO - @ailen0ada

Xamarin.Mac をこれからはじめるあなたへ

Embed Size (px)

Citation preview

Page 1: Xamarin.Mac をこれからはじめるあなたへ

Xamarin.Mac を これからはじめるあなたへ

2015/04/11 #JXUG Tsubasa HIRANO - @ailen0ada

Page 2: Xamarin.Mac をこれからはじめるあなたへ

Self introduction平野 翼 - @ailen0ada 映像ポストプロダクション

WPF + Xamarin.Mac が主戦場

Cocoa での開発は卒業研究で少しやった程度

Page 3: Xamarin.Mac をこれからはじめるあなたへ

ポスプロ is 何(ざっくり)

撮影現場から先,全ての工程が業務範囲です

編集=画つなぎ,色補正,合成…

納品=放送,Blu-ray,配信,アーカイブ…

企画 撮影 編集 納品

業務範囲

Page 4: Xamarin.Mac をこれからはじめるあなたへ

Agenda

1. Introduction

2. Xamarin.Mac をはじめる準備

3. Xamarin.Mac で Hello, world

4. Mac らしい挙動をさせる

5. フレームワークを使ってみる

6. まとめと今後

Page 5: Xamarin.Mac をこれからはじめるあなたへ

導入前に知りたかった情報を 中心にお届けします使い方ガイドではなく、 足を踏み入れるためのとっかかりとして

Page 6: Xamarin.Mac をこれからはじめるあなたへ

IntroductionXamarin.Mac とはなにか、導入に至った経緯

Page 7: Xamarin.Mac をこれからはじめるあなたへ

Xamarin.Mac

• ネイティブ Mac アプリケーションを C#/F# で書ける!!

Windows UI MacOSX UI

C#/F# Shared Code

Page 8: Xamarin.Mac をこれからはじめるあなたへ

どれぐらい共通化できる?体感4割ちょっと、工数はそれなりにかかる

ビュー

ファイルハンドリング

通信

ビュー

ビュー

ファイルハンドリング

通信

ファイルハンドリング

通信

Windows

Mac

Linux

ビュー

ファイルハンドリング

通信

ビュー

ビュー

Windows

Mac Linux

ビューのコード量がそれなりにある場合が多い

Page 9: Xamarin.Mac をこれからはじめるあなたへ

Unified API• もうすぐXamarin.Mac 2.0として安定版リリース

• iOS とのランタイム共通化、64bit 対応

• iOS の Unified API はすでに Stable

• そちらの実装 - SGen, NewRefCount etc. をMac側に輸入している段階

• OSX 10.6 SnowLeopard はサポート対象外に

Page 10: Xamarin.Mac をこれからはじめるあなたへ

MonoMac ではだめ?• サポートされているAPIレベルが違う

• MonoMac は10.6相当くらい

• Xamarin.Mac は最新に追従

• Mono ランタイムをバンドルできない

• ここがクリアできるならMonoMacでもいいかも

• Unified API 対応はもちろんない

Page 11: Xamarin.Mac をこれからはじめるあなたへ

導入に至った経緯

Page 12: Xamarin.Mac をこれからはじめるあなたへ

ひしめくプラットフォーム

• 使用者のリテラシーも異なれば文化もまるで違う • マシン、使いどころによりファイルシステムもバラバラ • NTFS, HFS+, ext4, exFAT, xfs, LTFS…

• NFSでつないだりSMBでつないだり • ファイル取り扱いの印象 • しっかり←Win < Linux < (断絶)< Mac→ゆるふわ

Page 13: Xamarin.Mac をこれからはじめるあなたへ

導入まで• 各プラットフォーム間の差異をできる限り少ない工数で吸収できることが求められた

• Java, Qt, Python, C++ を検討

• VisualStudio の生産性が決め手

• 開発者は3名なので障壁は低かった

• デスクトップ開発は私だけになりつつあった

Page 14: Xamarin.Mac をこれからはじめるあなたへ

Xamarin.Mac をはじめる準備必要なものと注意点

Page 15: Xamarin.Mac をこれからはじめるあなたへ

準備するもの• Mac - 52,800円から

• Apple Mac Developer Program - 10,800円

• Xamarin.Mac Subscription - 月額25ドルから

• コード署名用の証明書 - 無料

• 投げ出さない気持ち

Page 16: Xamarin.Mac をこれからはじめるあなたへ

証明書について

• Developer ID ApplicationApp Store外で配布する際の証明書Xcodeでは今発行できない様子

• 3rd Party Mac Developer Application (Mac App Distribution)App Store への公開に必要Appleが再署名するまでアプリケーションは起動不可

Page 17: Xamarin.Mac をこれからはじめるあなたへ

Business subscription• VisualStudio って…

• われわれにはXamarin Studioがあります。大丈夫です。

• 社内向けの配布って…

• それはiOSのEnterprise Programの話です。Macにはありません(必要もありません)。

• Xamarin.Forms って…

• もしかして:Eto.Forms

Page 18: Xamarin.Mac をこれからはじめるあなたへ

クリーンなXamMac環境を得る1. Xcode

2. 証明書

3. Mono MDK

4. Xamarin Studio

5. Xamarin.Mac

iOS も Android もいない 美しい世界へ

Page 19: Xamarin.Mac をこれからはじめるあなたへ

Hello, Xamarin.Macなにはともあれ Hello, world

Page 20: Xamarin.Mac をこれからはじめるあなたへ

ウィンドウが表示されるまで1.Main @ Main.cs集約例外処理はここ

2.DidFinishLaunching @ AppDelegate アセンブリ読み込み完了=DIとかの登録タイミング

3.AwakeFromNib @ controllerUI初期化 コントロールへの操作が可能に

4.WindowDidLoad @ controller表示された アニメーションをはじめる

Page 21: Xamarin.Mac をこれからはじめるあなたへ

Mac らしい挙動をさせる最低限求められそうなもの

Page 22: Xamarin.Mac をこれからはじめるあなたへ

Mac らしさはなぜ必要?A. ユーザーのUIに対する期待が違うから!

※当社比

期待度 大

期待度 小

今回はこんな感じなのね… 無理にUIつけなくてもいいよ、動けば

おっなんか華やかでかっこいい やることがわかりやすいのがいいな

Finder ではこう見えるじゃん? メニューのこれはなんで動かないの? Safariのアレっぽくならない?(謎)

Page 23: Xamarin.Mac をこれからはじめるあなたへ

Mac っぽさはどこから?

https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/OSXHIGuidelines/index.html

Page 24: Xamarin.Mac をこれからはじめるあなたへ

見えてきた傾向• Mac はガイドラインに則っているものが多い

• 初見でもなんとなくなんとかなる • Windows のUIはOSレベルでもアプリレベルでも多種多様に変化を遂げてきた • ユーザーも「いろんなやつがいる」ことに寛容

• Linux ベースシステムの業務で使用するアプリは独自のUIを実装することが多い

Page 25: Xamarin.Mac をこれからはじめるあなたへ

Mac っぽい挙動のいくつか• ウィンドウを閉じたとき

• シート

• 通知センター

• アニメーション

Page 26: Xamarin.Mac をこれからはじめるあなたへ

AppDelegateで抑えるポイント• アプリケーションの動作を規定する

• ApplicationShouldTerminateユーザーが終了を要求した。キャンセルと延期が可能

• DidFinishLaunching起動完了、ウィンドウを表示する準備ができた

• ApplicationShouldTerminateAfterLastWindowClosed 最後のウィンドウを閉じた時の動作

• ApplicationShouldHandleReopenDockアイコンを再度クリックされた時など

Page 27: Xamarin.Mac をこれからはじめるあなたへ

シート• アラート

• NSAlert を作る

• RunSheetModal or BeginSheetForResponse • ウィンドウ

• Window with Controllerを作る

• VisibleAtLaunch を外しておく

• StopModal まで状態維持 or CloseWindowを定義して呼び出し側から閉じる or TaskCompletionSource

Page 28: Xamarin.Mac をこれからはじめるあなたへ

NSAlert as sheet

using(var alert = new NSAlert()){alert.MessageText = “タイトル”;alert.InformativeText = “メッセージテキスト”;alert.RunSheetModal();

}

Qiita: NSAlert編 Qiita: NSWindow編 Qiita: FileDialog編

Page 29: Xamarin.Mac をこれからはじめるあなたへ

通知センター• NSUserNotification

• 10.8 以降 要バージョンチェック

• 通知時間、表示期間、クリック時の動作

• DidActivateNotification, DidDeliverNotification

• NSUserNotificationCenter

• 表示を予約する感じ

Page 30: Xamarin.Mac をこれからはじめるあなたへ

NSNotification sample

public static void Raise(string message, string title){var not = new NSUserNotification ();not.Title = title;not.InformativeText = message;not.Subtitle = DateTime.Now.ToShortDateString ();not.DeliveryDate = NSDate.Now;

var center = NSUserNotificationCenter.DefaultUserNotificationCenter;center.DidActivateNotification += (s,e ) => //クリックされたcenter.ShouldPresentNotification = (c, n) => true; // 表示を継続center.ScheduleNotification (not);

}

Page 31: Xamarin.Mac をこれからはじめるあなたへ

フレームワークを使ってみる深くはやりません

Page 32: Xamarin.Mac をこれからはじめるあなたへ

ReactiveUI

Page 33: Xamarin.Mac をこれからはじめるあなたへ

ReactiveUI

• MVVM + Rx で見通しはすごくいい

• ドキュメントもしっかり,ユーザーも多い

• Xamarin.Mac では様々なおまじないが必要

• おおむねNull回避,Reflection.TargetInvocationException回避

Page 34: Xamarin.Mac をこれからはじめるあなたへ

Gtk#

WPF

Xamarin.Mac

UI libraryw/Eto.Forms

CoreBusiness logic

Xamarin.iOS

Xamarin.Android

Xaml

Eto.FormsA cross platform desktop/mobile user interface framework

by Curtis Wensley, Vivek Jhaveri - BSD like license

As you like System Eto Eto.Forms Eto.Drawing

System Eto.Forms

WIP

Page 35: Xamarin.Mac をこれからはじめるあなたへ

Eto.Forms• コード量は一番少なくて済む

• 各PFでやることはそのPFに合った方法で立ち上げるだけ

• カスタムコントロール・プラットフォームごとのスタイルも定義可能

• Gtk# 対応のせいでバンドルできない

• Gtk2, Gtk3両対応しててアセンブリ名が被る

• UI構築は Write & Pray

Page 36: Xamarin.Mac をこれからはじめるあなたへ

まとめハマりどころと今後の展望

Page 37: Xamarin.Mac をこれからはじめるあなたへ

導入効果のあるところ• C#/F# で書いた資産をうまく使い回したい

• 素早くMacアプリケーションを書きたい

• Xamarin Studio の生産性は Xcode より高い

• アプリケーション配布の手間を減らしたい

Page 38: Xamarin.Mac をこれからはじめるあなたへ

導入してからの変化• Model = ビジネスロジックを各PFで動くよう意識して書くようになった

• テストの時間・コード量が増大した

• プラットフォームごとに実行

• Windows / Mac どちらから開発しても翌週には同じことができる体制に

Page 39: Xamarin.Mac をこれからはじめるあなたへ

Mono ≠ .NET の再確認• 同様の動作をすると「期待」できるだけ

• ユニットテストは全プラットフォームで

• Windows, Mac

• Linux はディストロごとに

• どうにもならなければサポートに投げる

• Businessならメールで問い合わせ可能

Page 40: Xamarin.Mac をこれからはじめるあなたへ

Xamarin.Mac 2.0• Available during summer. • Unified API対応 SGen, New Ref Count • Trial 対応 • モバイルプロファイル追加 • 名前空間をiOSと統一   などなど • OSX 10.6 がサポート対象外に • StoryBoard は未対応 • Alpha channel で入手可能

Page 41: Xamarin.Mac をこれからはじめるあなたへ

まとめ• Xamarin.Mac は業務にがっつり導入して問題ないレベルにこなれてきている

• Win/Mac のデスクトップアプリケーション開発で高い生産性を発揮できる

• フレームワークを使えばさらに共通化部分が増える

• ユーザー数も着々と増えている(と思う)

• フォーラムは要チェック

Page 42: Xamarin.Mac をこれからはじめるあなたへ

参考• Xamarin.Mac - Advanced Topics

APIデザインやネイティブバインディング,例外の見方など

http://developer.xamarin.com/guides/mac/advanced_topics/

• Mac SamplesADCのサンプル移植がほとんど C#っぽくないコードはそのせい

https://developer.xamarin.com/samples/mac/all/

• ReactiveUIhttp://reactiveui.net/

• Eto.Formshttps://github.com/picoe/Eto/