More Related Content
Similar to Win/Mac/Android/iOS向けクロスプラットフォーム開発にXamarinがうまくハマりそうだった話
Similar to Win/Mac/Android/iOS向けクロスプラットフォーム開発にXamarinがうまくハマりそうだった話 (20)
Win/Mac/Android/iOS向けクロスプラットフォーム開発にXamarinがうまくハマりそうだった話
- 2. 目次
• 自己紹介
• 開発事例紹介
– アプリ概要
– アーキテクチャ
– コード共通化事情
– Binding事情
• まとめ
– なぜうまくハマったか
– 楽しかった思い出
– 辛かった思い出
- 3. 自己紹介
• 菊池 琢弥 (@_pochi)
– P2P技術ベンチャーに勤務
• Slack用の絵文字を描く人 兼 エンジニア
– 社内ひとりC#er
– 埼玉県民
- 7. C++ C# (.NET / Xamarin)
アーキテクチャ
ViewModelModel
Native
Library
(ファイル転送
機能を提供)
Binding
Binding
オレオレ
Binding
P/Invoke
Callback
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
• コア機能を提供するNativeLibraryを抱いたC#アプリ
• C#レイヤはMVVMパターンに従って設計
– 各プラットフォーム向けにViewを実装
- 9. Modelのコード共通化事情
C++ C# (.NET / Xamarin)
ViewModelModel
Native
Library
(ファイル転送
機能を提供)
Binding
Binding
オレオレ
Binding
P/Invoke
Callback
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
• 全プラットフォームでほぼ全て共通化
– NativeLibraryの薄いラッパでしかないのでそんなもんか
– P/Invoke周りが無事動いてホッとした
- 10. Modelのコード共通化事情
C++ C# (.NET / Xamarin)
ViewModelModel
Native
Library
(ファイル転送
機能を提供)
Binding
Binding
オレオレ
Binding
P/Invoke
Callback
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
• 全プラットフォームでほぼ全て共通化
– NativeLibraryの薄いラッパでしかないのでそんなもんか
– P/Invoke周りが無事動いてホッとした
(余談)
基本的にOS依存はboostやSTLが吸収して
くれてたみたい
「clangでビルド通るのにVC++で通らない」
という悲鳴はよく聞こえた
- 11. ViewModelのコード共通化事情
C# (.NET / Xamarin)
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
• Win/OSXのデスクトップOSどうしは90%程度共通
• Android/iOSのモバイルOSどうしも90%程度共通
– 共通化できない処理はDependency Injection
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
- 15. C# (.NET / Xamarin)
Viewのコード共通化事情
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
• Android/iOSはXamarin.Formsの力でほぼ共通化
• Win/OSXはそれぞれ別々に実装。共通化はできてない
– おかげでOSネイティブのUXを得られたので悪いことばかりではない
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
- 17. C# (.NET / Xamarin)
Binding事情
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
• おや、Macのようすが
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
- 18. C# (.NET / Xamarin)
Binding事情
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
• おや、Macのようすが
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
ごくふつうのWPFアプリなので当然
- 19. C# (.NET / Xamarin)
Binding事情
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
• おや、Macのようすが
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
辛いところも多いが、
思い返せばXamarin.Forms最高でした
- 20. C# (.NET / Xamarin)
Binding事情
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
• おや、Macのようすが
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
いい感じのBindingフレームワークが無
かった
(reactiveui、MvvmCrossといった
フレームワークは存在しますが、
少なくとも当時は必要な機能がそろっていなかった。。。)
→泣く泣くバインディング処理を
自前で実装
おかげでCocoaと仲良しになれました
- 22. なぜXamarinがいい感じにハマったか
• アプリのコア部分がNative Library化されていた
– プラットフォーム依存処理(ファイル入出力とか)をNativeLibraryが吸収してくれた
• おかげで、「.NET/Monoの細かい挙動の違い」はあまり気にならなかった
– C#のネイティブライブラリ呼び出し周りのケアが非常に手厚いからこそ
• 関数ポインタ渡し、構造体のアラインメント、呼び出し規約、、、等々
• Xamarinでもきちんと動いてくれる
– パフォーマンスが最重要な部分は、黒魔術師たちがC++使ってカリカリにチューニング。
フロントエンドはC#で生産性高く、というスタイル。
• (C#が遅いとはいってない)
• (C++が生産性低いとはいってない)
• Desktop/Mobile横断の開発だった
– Desktopだけ、Mobileだけ、ではなかった
• DesktopだけならJavaでもいいよね!となることもあり得たかもしれない
• そこまで凝ったUIが求められなかった
– おかげでXamarin.Formsが最高で助かった
- 23. よかったところ
• クロスプラットフォーム開発ながら、Visual Studioメインで開発できた
– VSでデバッグ時、NativeLibrary側にもシームレスにステップインできるのが、
特に素晴らしい
– まずWindows向けに機能実装してから他プラットフォームに取り掛かればいい
• Win環境で実装~テストまでほとんど済ませたうえで他OS向け作業に取り掛かれる
• P/Invoke周りの不安はすべて朴鬱だった
– DllImportのDLL検索がやたら柔軟
– 呼び出し規約とか
– 構造体のアラインメントとか
– ネイティブ側に関数ポインタどうやってわたすの?とか
• Xamarin.iOSでは制限は多いが…
– どれもどうにかなる手段が用意されていた
- 24. つらかったところ
• Xcode(InterfaceBuilder)が気難しい
– 慣れの問題だとは思うが…
• MacのBinding
– オレオレ実装とか正直やりたくないし、やるべきでないと思う
– MvvmCrossとか、使えるようになってるといいな
– このあたりが整備されてきたら、Xamarinはデスクトップ向けクロスプラット
フォーム開発環境として本当に有力な選択肢になりえると思う
• デスクトップアプリ自体もうそんな流行らないかな…
• Xamarin.MacでInvalidProgramExceptionが結構起きる
– 深追いしてないが、書き方を変えるときちんと動いたりする
• Xamarin.FormsのXAML≠WPFのXAML
– 特にBehaviorのBindingPropertyあたりでハマった