Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Porting Windows Forms App to Xamarin.Mac

Porting Windows Forms App to Xamarin.Mac

2016/5/7 JXUGC #13 の発表資料です。

ailen0ada

May 07, 2016
Tweet

More Decks by ailen0ada

Other Decks in Programming

Transcript

  1. About me 平野 翼 a.k.a. Xamarin.Macの人 ◦ クミナス株式会社 と 五反田の会社

    ◦ Xamarin 3年生 ◦ Blog: http://aile.hatenablog.com/ ◦ Facebook: ailen0ada ◦ Twitter: @ailen0ada 2016/5/7 JXUGC #13 TOKYO 2
  2. Agenda 1. Did you know Xamarin.Mac? 2. Remember Windows Forms

    3. Introducing Gochiusearch 4. Develop strategy of porting App 5. Summary 2016/5/7 JXUGC #13 TOKYO 3
  3. Xamarin.Mac is... C# という共通言語でMac プラットフォームとお話しできる =ほとんどフルの.NET Framework + OSX API

    Binding Mac向けアプリケーション開発環境 ◦ Xamarin.Forms 非対応 ◦ VisualStudio 非対応 ◦ Xamarin University クラスなし 2016/5/7 JXUGC #13 TOKYO 5
  4. Windows Forms 意外と強力なクロスプラットフォームフレームワーク ◦ Mono の互換実装 WinForms により Linux, Mac

    でも動作可能 ◦ Windows でビルドした exe ファイルを Mono 経由で叩くだけ ◦ Wine との相性も◎ 標準コントロールだけの業務アプリなら別にこれでよし? 2016/5/7 JXUGC #13 TOKYO 6
  5. Gochiusearch 選定の理由 Mac といえば Cocoa ◦ ココアさん推しです Windows Forms で作られている

    ◦ 3 プラットフォームで共通のUIで動作する 大きすぎず,適度な難易度 ◦ グラフィックス周り ◦ ドラッグ&ドロップ(ファイル&ブラウザ) とにかく堂々と発表できる事例が作りたかった 2016/5/7 JXUGC #13 TOKYO 8
  6. 試作: MonoMac で薄くラップする バンドル化の機能を使う ◦ mkbundle でもできるはず,うまくいかなかった ◦ MainForm.cs のドラッグ&ドロップ周りだけオーバーライドする

    ユーザーインタフェースの問題は解決しない ◦ WinForms には変わりない ◦ ただ Mac アプリっぽく振る舞うことはできるようになる コレジャナイ 2016/5/7 JXUGC #13 TOKYO 11
  7. 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
  8. ImageSearch を移植可能に 2016/5/7 JXUGC #13 TOKYO 14 ImageSearchEngine DB読み込み 画像

    読み込み 画像の縮小 ビット ベクトル 算出 ハミング 距離 算出 DBの検索 入 力 出 力 System.IO.FileStream System.Drawing.Bitmap System.Drawing.Rectangle プラットフォーム依存なし System.Drawing.Graphics
  9. ImageSearch を移植可能に 2016/5/7 JXUGC #13 TOKYO 15 ImageSearchEngine.Portable DB読み込み 画像の縮小

    ビット ベクトル 算出 ハミング 距離 算出 DBの検索 入 力 出 力 PCLStorage XMSearch 画像 読み込み CGImage 経由で画像の読み込み 32bppARGB のバイト列に展開
  10. Sandboxing セキュリティの向上,AppStore 提出基準への適合 ◦ ユーザーが指定したファイル・フォルダのみ読み書き可能 ◦ ネットワークアクセスなども制限 ◦ アプリケーションの生成したファイルはすべてコンテナフォルダへ ◦

    ~/Library/Containers/{app bundle name}/Data ◦ Environment.SpecialFolderも影響を受ける SecurityException は送出されない ◦ 行おうとした操作によって例外は異なる コンソールで特定 ◦ ex) Outgoing connectionを許可していなかった場合はWebException – 名前解決エラー ◦ mDNSResponderへのアクセスが拒否されるため 2016/5/7 JXUGC #13 TOKYO 16
  11. Cocoaの使いどころ 画像かどうかの判定 ◦ 元ソースでは拡張子による判定 ◦ Macではシステムがある程度判別してくれる=Uniform Type Identifier ◦ UTI

    が画像だったら CGImage も大体作れる パスの分解・結合をNSString/NSUrl にやらせる ◦ PathComponents を使って部分パスの取得や追加ができる CGImageによる画像読み込み,ローカライゼーション 無理に共通化にこだわらない ◦ プラットフォームAPIを使った方が高速,便利な場面を見極める 2016/5/7 JXUGC #13 TOKYO 17
  12. Practice まず Full Mono で動くところまで持って行く ◦ ユーザーインタフェースをXcodeで作って,元ソースを切り貼りする ◦ MessageBoxなどコモンダイアログ系はこの段階で移行 Mobile

    Frameworkに変更してみる ◦ 動けばよし,動かない点をピックアップする ◦ データアクセス部分をPCLにしていけばほぼ終わり どうにもならないときだけ Xamarin.Mac 4.5 Framework ◦ PCL として配布されてないNuGet パッケージに依存している場合で, 代替もないときに限られるはず 2016/5/7 JXUGC #13 TOKYO 18
  13. 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