Upload
tsubasa-hirano
View
1.045
Download
2
Embed Size (px)
Citation preview
Xamarin.Mac を これからはじめるあなたへ
2015/04/11 #JXUG Tsubasa HIRANO - @ailen0ada
Self introduction平野 翼 - @ailen0ada 映像ポストプロダクション
WPF + Xamarin.Mac が主戦場
Cocoa での開発は卒業研究で少しやった程度
ポスプロ is 何(ざっくり)
撮影現場から先,全ての工程が業務範囲です
編集=画つなぎ,色補正,合成…
納品=放送,Blu-ray,配信,アーカイブ…
企画 撮影 編集 納品
業務範囲
Agenda
1. Introduction
2. Xamarin.Mac をはじめる準備
3. Xamarin.Mac で Hello, world
4. Mac らしい挙動をさせる
5. フレームワークを使ってみる
6. まとめと今後
導入前に知りたかった情報を 中心にお届けします使い方ガイドではなく、 足を踏み入れるためのとっかかりとして
IntroductionXamarin.Mac とはなにか、導入に至った経緯
Xamarin.Mac
• ネイティブ Mac アプリケーションを C#/F# で書ける!!
Windows UI MacOSX UI
C#/F# Shared Code
どれぐらい共通化できる?体感4割ちょっと、工数はそれなりにかかる
ビュー
ファイルハンドリング
通信
ビュー
ビュー
ファイルハンドリング
通信
ファイルハンドリング
通信
Windows
Mac
Linux
ビュー
ファイルハンドリング
通信
ビュー
ビュー
Windows
Mac Linux
ビューのコード量がそれなりにある場合が多い
Unified API• もうすぐXamarin.Mac 2.0として安定版リリース
• iOS とのランタイム共通化、64bit 対応
• iOS の Unified API はすでに Stable
• そちらの実装 - SGen, NewRefCount etc. をMac側に輸入している段階
• OSX 10.6 SnowLeopard はサポート対象外に
MonoMac ではだめ?• サポートされているAPIレベルが違う
• MonoMac は10.6相当くらい
• Xamarin.Mac は最新に追従
• Mono ランタイムをバンドルできない
• ここがクリアできるならMonoMacでもいいかも
• Unified API 対応はもちろんない
導入に至った経緯
ひしめくプラットフォーム
• 使用者のリテラシーも異なれば文化もまるで違う • マシン、使いどころによりファイルシステムもバラバラ • NTFS, HFS+, ext4, exFAT, xfs, LTFS…
• NFSでつないだりSMBでつないだり • ファイル取り扱いの印象 • しっかり←Win < Linux < (断絶)< Mac→ゆるふわ
導入まで• 各プラットフォーム間の差異をできる限り少ない工数で吸収できることが求められた
• Java, Qt, Python, C++ を検討
• VisualStudio の生産性が決め手
• 開発者は3名なので障壁は低かった
• デスクトップ開発は私だけになりつつあった
Xamarin.Mac をはじめる準備必要なものと注意点
準備するもの• Mac - 52,800円から
• Apple Mac Developer Program - 10,800円
• Xamarin.Mac Subscription - 月額25ドルから
• コード署名用の証明書 - 無料
• 投げ出さない気持ち
証明書について
• Developer ID ApplicationApp Store外で配布する際の証明書Xcodeでは今発行できない様子
• 3rd Party Mac Developer Application (Mac App Distribution)App Store への公開に必要Appleが再署名するまでアプリケーションは起動不可
Business subscription• VisualStudio って…
• われわれにはXamarin Studioがあります。大丈夫です。
• 社内向けの配布って…
• それはiOSのEnterprise Programの話です。Macにはありません(必要もありません)。
• Xamarin.Forms って…
• もしかして:Eto.Forms
クリーンなXamMac環境を得る1. Xcode
2. 証明書
3. Mono MDK
4. Xamarin Studio
5. Xamarin.Mac
iOS も Android もいない 美しい世界へ
Hello, Xamarin.Macなにはともあれ Hello, world
ウィンドウが表示されるまで1.Main @ Main.cs集約例外処理はここ
2.DidFinishLaunching @ AppDelegate アセンブリ読み込み完了=DIとかの登録タイミング
3.AwakeFromNib @ controllerUI初期化 コントロールへの操作が可能に
4.WindowDidLoad @ controller表示された アニメーションをはじめる
Mac らしい挙動をさせる最低限求められそうなもの
Mac らしさはなぜ必要?A. ユーザーのUIに対する期待が違うから!
※当社比
期待度 大
期待度 小
今回はこんな感じなのね… 無理にUIつけなくてもいいよ、動けば
おっなんか華やかでかっこいい やることがわかりやすいのがいいな
Finder ではこう見えるじゃん? メニューのこれはなんで動かないの? Safariのアレっぽくならない?(謎)
Mac っぽさはどこから?
https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/OSXHIGuidelines/index.html
見えてきた傾向• Mac はガイドラインに則っているものが多い
• 初見でもなんとなくなんとかなる • Windows のUIはOSレベルでもアプリレベルでも多種多様に変化を遂げてきた • ユーザーも「いろんなやつがいる」ことに寛容
• Linux ベースシステムの業務で使用するアプリは独自のUIを実装することが多い
Mac っぽい挙動のいくつか• ウィンドウを閉じたとき
• シート
• 通知センター
• アニメーション
AppDelegateで抑えるポイント• アプリケーションの動作を規定する
• ApplicationShouldTerminateユーザーが終了を要求した。キャンセルと延期が可能
• DidFinishLaunching起動完了、ウィンドウを表示する準備ができた
• ApplicationShouldTerminateAfterLastWindowClosed 最後のウィンドウを閉じた時の動作
• ApplicationShouldHandleReopenDockアイコンを再度クリックされた時など
シート• アラート
• NSAlert を作る
• RunSheetModal or BeginSheetForResponse • ウィンドウ
• Window with Controllerを作る
• VisibleAtLaunch を外しておく
• StopModal まで状態維持 or CloseWindowを定義して呼び出し側から閉じる or TaskCompletionSource
NSAlert as sheet
using(var alert = new NSAlert()){alert.MessageText = “タイトル”;alert.InformativeText = “メッセージテキスト”;alert.RunSheetModal();
}
Qiita: NSAlert編 Qiita: NSWindow編 Qiita: FileDialog編
通知センター• NSUserNotification
• 10.8 以降 要バージョンチェック
• 通知時間、表示期間、クリック時の動作
• DidActivateNotification, DidDeliverNotification
• NSUserNotificationCenter
• 表示を予約する感じ
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);
}
フレームワークを使ってみる深くはやりません
ReactiveUI
ReactiveUI
• MVVM + Rx で見通しはすごくいい
• ドキュメントもしっかり,ユーザーも多い
• Xamarin.Mac では様々なおまじないが必要
• おおむねNull回避,Reflection.TargetInvocationException回避
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
Eto.Forms• コード量は一番少なくて済む
• 各PFでやることはそのPFに合った方法で立ち上げるだけ
• カスタムコントロール・プラットフォームごとのスタイルも定義可能
• Gtk# 対応のせいでバンドルできない
• Gtk2, Gtk3両対応しててアセンブリ名が被る
• UI構築は Write & Pray
まとめハマりどころと今後の展望
導入効果のあるところ• C#/F# で書いた資産をうまく使い回したい
• 素早くMacアプリケーションを書きたい
• Xamarin Studio の生産性は Xcode より高い
• アプリケーション配布の手間を減らしたい
導入してからの変化• Model = ビジネスロジックを各PFで動くよう意識して書くようになった
• テストの時間・コード量が増大した
• プラットフォームごとに実行
• Windows / Mac どちらから開発しても翌週には同じことができる体制に
Mono ≠ .NET の再確認• 同様の動作をすると「期待」できるだけ
• ユニットテストは全プラットフォームで
• Windows, Mac
• Linux はディストロごとに
• どうにもならなければサポートに投げる
• Businessならメールで問い合わせ可能
Xamarin.Mac 2.0• Available during summer. • Unified API対応 SGen, New Ref Count • Trial 対応 • モバイルプロファイル追加 • 名前空間をiOSと統一 などなど • OSX 10.6 がサポート対象外に • StoryBoard は未対応 • Alpha channel で入手可能
まとめ• Xamarin.Mac は業務にがっつり導入して問題ないレベルにこなれてきている
• Win/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/