SlideShare a Scribd company logo
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. まとめと今後
導入前に知りたかった情報を
中心にお届けします
使い方ガイドではなく、
足を踏み入れるためのとっかかりとして
Introduction
Xamarin.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 Application

App 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 @ controller

UI初期化 コントロールへの操作が可能に
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

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

Dockアイコンを再度クリックされた時など
シート
• アラート
• 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 library
w/Eto.Forms
Core
Business logic
Xamarin.iOS
Xamarin.Android
Xaml
Eto.Forms
A 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 Samples

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

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

http://reactiveui.net/
• Eto.Forms

https://github.com/picoe/Eto/

More Related Content

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