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

  • View
    1.045

  • Download
    2

  • Category

    Software

Preview:

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/

Recommended