狠狠撸
Submit Search
Win/Mac/Android/iOS向けクロスプラットフォーム開発にXamarinがうまくハマりそうだった話
?
Download as PPTX, PDF
?
2 likes
?
3,254 views
Takuya Kikuchi
Follow
JXUG #13向け資料です
Read less
Read more
1 of 25
Download now
Downloaded 17 times
More Related Content
Win/Mac/Android/iOS向けクロスプラットフォーム開発にXamarinがうまくハマりそうだった話
1.
Win/Mac/Android/iOS向け クロスプラットフォーム開発にXamarinが うまくハマりそうだった話 JXUGC #13 東京 2016/5/7
@_pochi
2.
目次 ? 自己紹介 ? 开発事例绍介 –
アプリ概要 – アーキテクチャ – コード共通化事情 – Binding事情 ? まとめ – なぜうまくハマったか – 楽しかった思い出 – 辛かった思い出
3.
自己紹介 ? 菊池 琢弥
(@_pochi) – P2P技術ベンチャーに勤務 ? Slack用の絵文字を描く人 兼 エンジニア – 社内ひとりC#er – 埼玉県民
4.
开発事例绍介
5.
アプリ概要 ? サーバ/クライアント間ファイル転送アプリ の、クライアントアプリケーション – FTPクライアント的なものです↓ ?
対象OS: – Android – iOS – Windows(Desktop) – OSX
6.
アプリ概要
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を実装
8.
コード共通化事情 どれくらい楽できたのかな
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
12.
C++ Native Library (ファイル転送 機能を提供) P/Invoke Callback ? Win/OSXのデスクトップOSどうしは90%程度共通 ? Android/iOSのモバイルOSどうしも90%程度共通 –
共通化できない処理はDependency Injection C# (.NET / Xamarin) ViewModelModel Binding Binding オレオレ Binding Win向けView (WPF) モバイル向けView (Xamarin.Forms) OSX向けView (Xamarin.Mac) ViewModelのコード共通化事情 Desktop/Mobile間はざっくりとこんな感じ だと思います Win/OSX Android/iOS Desktop/Mobile
13.
? サーバ上のファイル一覧画面ViewModel – Desktop/Mobileで表示方法は異なるが、ViewModelクラスは同一 ViewModelのコード共通化事情
14.
ViewModelのコード共通化事情 ? ファイル転送処理の進捗画面ViewModel – モバイル/Desktopで画面遷移は異なるが、ViewModelクラスは同一
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
16.
BINDING事情 これがないと話にならない
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と仲良しになれました
21.
まとめ
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あたりでハマった
25.
おしまい
Download