Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Porting Windows Forms App to Xamarin.Mac
Search
ailen0ada
May 07, 2016
Programming
1
3.5k
Porting Windows Forms App to Xamarin.Mac
2016/5/7 JXUGC #13 の発表資料です。
ailen0ada
May 07, 2016
Tweet
Share
More Decks by ailen0ada
See All by ailen0ada
How we create our app using Xamarin;
ailen0ada
3
2.1k
.NET Conf 2017 Tokyo, Japan
ailen0ada
1
190
Say hello to Cocoa development with Xamarin.Mac
ailen0ada
1
160
Other Decks in Programming
See All in Programming
HUIT新歓2024「競技プログラミング、やってみませんか?」
slephy2784
1
250
Java 22 Overview
kishida
1
170
甘い香りに誘われてVanilla Extractを1年間運用してみた
miyahkun
1
110
Javaエンジニアのための Nodejs/Nuxt3入門
hidekatsu_izuno
0
280
FigmaとPHPで作る1ミリたりとも表示崩れしない最強の帳票印刷ソリューション
ttskch
39
18k
CA.swift19 恋するAIアプリ開発の裏側
oskmr
0
330
PostmanでAPIの動作確認が楽になった話
h455h1
0
120
try! Swift Tokyo 初参加報告LT
hinakko2
0
190
二郎系ラーメンのコールで学ぶ AST 解析
memory1994
PRO
7
1.6k
チーム力を高めるスクラム実践法:カンバン公開と課題攻略について - ニフティのスクラムトーク Vol. 2 - NIFTY Tech Talk #18
niftycorp
PRO
1
110
コーンフレークから始める モデリング会話入門
ogurotakayuki
0
280
エンターテイメント業界で利用されるAWS
demuyan
0
200
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
288
19k
What's in a price? How to price your products and services
michaelherold
237
11k
Adopting Sorbet at Scale
ufuk
67
8.6k
YesSQL, Process and Tooling at Scale
rocio
163
13k
Rails Girls Zürich Keynote
gr2m
91
13k
Bootstrapping a Software Product
garrettdimon
PRO
301
110k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
243
20k
Debugging Ruby Performance
tmm1
70
11k
The Language of Interfaces
destraynor
151
23k
Build your cross-platform service in a week with App Engine
jlugia
225
17k
Web development in the modern age
philhawksworth
202
10k
The Invisible Side of Design
smashingmag
294
49k
Transcript
Porting Windows Forms App to Xamarin.Mac Cuminas Corporation Tsubasa HIRANO
@ailen0ada 2016/5/7 JXUGC#13
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
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
Xamarin.Mac nowadays 2016/5/7 JXUGC #13 TOKYO 4
Xamarin.Mac is... C# という共通言語でMac プラットフォームとお話しできる =ほとんどフルの.NET Framework + OSX API
Binding Mac向けアプリケーション開発環境 ◦ 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
Demo MONO,MONOMAC,APPSTORE 2016/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 14 ImageSearchEngine DB読み込み 画像
読み込み 画像の縮小 ビット ベクトル 算出 ハミング 距離 算出 DBの検索 入 力 出 力 System.IO.FileStream System.Drawing.Bitmap System.Drawing.Rectangle プラットフォーム依存なし System.Drawing.Graphics
ImageSearch を移植可能に 2016/5/7 JXUGC #13 TOKYO 15 ImageSearchEngine.Portable DB読み込み 画像の縮小
ビット ベクトル 算出 ハミング 距離 算出 DBの検索 入 力 出 力 PCLStorage XMSearch 画像 読み込み 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 Store 2016/5/7 JXUGC #13 TOKYO
20
Thank you. より詳細なステップバイステップはブログで http://aile.hatenablog.com/ 2016/5/7 JXUGC #13 TOKYO 21