2016/5/7 JXUGC #13 の発表資料です。
Porting Windows Forms App toXamarin.MacCuminas CorporationTsubasa HIRANO @ailen0ada2016/5/7 JXUGC#13
View Slide
About me平野 翼 a.k.a. Xamarin.Macの人◦ クミナス株式会社 と 五反田の会社◦ Xamarin 3年生◦ Blog: http://aile.hatenablog.com/◦ Facebook: ailen0ada◦ Twitter: @ailen0ada2016/5/7 JXUGC #13 TOKYO 2
Agenda1. Did you know Xamarin.Mac?2. Remember Windows Forms3. Introducing Gochiusearch4. Develop strategy of porting App5. Summary2016/5/7 JXUGC #13 TOKYO 3
Xamarin.Mac nowadays2016/5/7 JXUGC #13 TOKYO 4
Xamarin.Mac is...C# という共通言語でMac プラットフォームとお話しできる=ほとんどフルの.NET Framework + OSX API BindingMac向けアプリケーション開発環境◦ Xamarin.Forms 非対応◦ VisualStudio 非対応◦ Xamarin University クラスなし2016/5/7 JXUGC #13 TOKYO 5
Windows Forms意外と強力なクロスプラットフォームフレームワーク◦ Mono の互換実装 WinForms により Linux, Mac でも動作可能◦ Windows でビルドした exe ファイルを Mono 経由で叩くだけ◦ Wine との相性も◎標準コントロールだけの業務アプリなら別にこれでよし?2016/5/7 JXUGC #13 TOKYO 6
Gochiusearchアニメご注文はうさぎですか?全画像約100万枚を対象とした検索エンジン2016/5/7 JXUGC #13 TOKYO 7
Gochiusearch 選定の理由Mac といえば Cocoa◦ ココアさん推しですWindows Forms で作られている◦ 3 プラットフォームで共通のUIで動作する大きすぎず,適度な難易度◦ グラフィックス周り◦ ドラッグ&ドロップ(ファイル&ブラウザ)とにかく堂々と発表できる事例が作りたかった2016/5/7 JXUGC #13 TOKYO 8
DemoMONO,MONOMAC,APPSTORE2016/5/7 JXUGC #13 TOKYO 9
そりゃまあ動くけどMacでのユーザーインタフェースは問題だらけ◦ メニューバーがクリックできない◦ アプリケーション名がmono, アイコンも変更できない◦ フォントレンダリングがちょっと…◦ ブラウザからのドラッグ&ドロップに対応できない動作するのと,快適に使うことができるかは別問題2016/5/7 JXUGC #13 TOKYO 10
試作: MonoMac で薄くラップするバンドル化の機能を使う◦ mkbundle でもできるはず,うまくいかなかった◦ MainForm.cs のドラッグ&ドロップ周りだけオーバーライドするユーザーインタフェースの問題は解決しない◦ WinForms には変わりない◦ ただ Mac アプリっぽく振る舞うことはできるようになるコレジャナイ2016/5/7 JXUGC #13 TOKYO 11
Xamarin! Xamarin! Xamarin!1. Windows プラットフォーム依存コードを洗い出す◦ System.Drawing, System.Windows 名前空間への依存2. ユーザーインタフェースを xib で実装◦ Storyboard を使うと 10.9 で起動できなくなる3. ImageSearch はそのままに,まず Full Mono で実装4. ImageSearch を PCL 化,Xamarin.Mac Mobile に移行5. AppStore 提出2016/5/7 JXUGC #13 TOKYO 12
Xamarin.Mac Mobile Framework可能な限りこのフレームワークを使う◦ ランタイムがiOS向けチューンされたものと同等になる◦ ライブラリのリンクが可能,バイナリサイズの削減=起動時間の短縮◦ .NETアセンブリはPCL限定,Cocoa 側はフルに利用可能ImageSearch ライブラリのPCL化System.Drawing.Graphics の排除2016/5/7 JXUGC #13 TOKYO 13
ImageSearch を移植可能に2016/5/7 JXUGC #13 TOKYO 14ImageSearchEngineDB読み込み画像読み込み画像の縮小ビットベクトル算出ハミング距離算出DBの検索入力出力System.IO.FileStreamSystem.Drawing.BitmapSystem.Drawing.Rectangleプラットフォーム依存なしSystem.Drawing.Graphics
ImageSearch を移植可能に2016/5/7 JXUGC #13 TOKYO 15ImageSearchEngine.PortableDB読み込み 画像の縮小ビットベクトル算出ハミング距離算出DBの検索入力出力PCLStorageXMSearch画像読み込みCGImage 経由で画像の読み込み32bppARGB のバイト列に展開
Sandboxingセキュリティの向上,AppStore 提出基準への適合◦ ユーザーが指定したファイル・フォルダのみ読み書き可能◦ ネットワークアクセスなども制限◦ アプリケーションの生成したファイルはすべてコンテナフォルダへ◦ ~/Library/Containers/{app bundle name}/Data◦ Environment.SpecialFolderも影響を受けるSecurityException は送出されない◦ 行おうとした操作によって例外は異なる コンソールで特定◦ ex) Outgoing connectionを許可していなかった場合はWebException – 名前解決エラー◦ mDNSResponderへのアクセスが拒否されるため2016/5/7 JXUGC #13 TOKYO 16
Cocoaの使いどころ画像かどうかの判定◦ 元ソースでは拡張子による判定◦ Macではシステムがある程度判別してくれる=Uniform Type Identifier◦ UTI が画像だったら CGImage も大体作れるパスの分解・結合をNSString/NSUrl にやらせる◦ PathComponents を使って部分パスの取得や追加ができるCGImageによる画像読み込み,ローカライゼーション無理に共通化にこだわらない◦ プラットフォームAPIを使った方が高速,便利な場面を見極める2016/5/7 JXUGC #13 TOKYO 17
Practiceまず Full Mono で動くところまで持って行く◦ ユーザーインタフェースをXcodeで作って,元ソースを切り貼りする◦ MessageBoxなどコモンダイアログ系はこの段階で移行Mobile Frameworkに変更してみる◦ 動けばよし,動かない点をピックアップする◦ データアクセス部分をPCLにしていけばほぼ終わりどうにもならないときだけ Xamarin.Mac 4.5 Framework◦ PCL として配布されてないNuGet パッケージに依存している場合で,代替もないときに限られるはず2016/5/7 JXUGC #13 TOKYO 18
Unleash the power of Xamarin.Mac.NET と Cocoa のいいとこ取りができる◦ すべてを .NET Framework 内で完結する必要はない◦ Mac には Mac の流儀がある!◦ もちろん共通項は PCL にまとめておけるフル機能の Mono を使うこともできる◦ System.Drawing とか System.Configuration に依存していても大丈夫◦ 期待通りに動作しない部分だけ Cocoa を使えばいいデバッグが高速,シミュレータなんて不要!すぐ試せます2016/5/7 JXUGC #13 TOKYO 19
Now available on the App Store2016/5/7 JXUGC #13 TOKYO 20
Thank you.より詳細なステップバイステップはブログでhttp://aile.hatenablog.com/2016/5/7 JXUGC #13 TOKYO 21