質問: Xamarinでの開発手法についてお尋ねします。当方は、iOSやAndroidでの開発はしたことがありますが、Xamarinでの開発経験はほぼありません。そこでいくつかお尋ねしたいことがありますので、ご回答いただきますと幸いです。 Xamarin.formsについて ----------------- 私は、この機能を使用するつもりはなく、Viewはそれぞれで作ろうと思っています。今、現在でXamarin.formsをする恩恵もあると思いますが、何かあったときのデメリットのがやや大きいように感じます。使用されている方は、過去に大きな問題はありませんでしたか?もし、何かあれば、ご教授ください。 非同期通信など ------- AndroidやiOSではRxJavaや、Rxswiftを使用していたのですが、Xamarinではasync,awaitで書くのが良さそうなんですが、皆さんどうされていますか?またhttp通信はSystem.Net.Httpでやられている方のがおおいんでしょうか? ライブラリについて --------- iOSやAndroidで定番だったライブラリなどはXamarinにはラッパーでもよいのであるものなのでしょうか?どうにもView関連はほとんどなさそうに感じているのですが、あるのでしたらソースを頂戴ますと幸いです。また、共通化できそうな部分としてのライブラリならここを参照していますが、他にもXamarinでの定番ライブラリであったりまとめてる情報などがありましたら教えていただければと思います。(特にView関連) アーキテクチャなど --------- MVVMが基本になるとおもうのですが、その際にOS固有の機能などを呼び出す場合はどのようにしていますか?個人的には今のところ、共通ができそうなViewModelとModelやAPIなどのロジックなどをMainとし、 固有の機能に関しては、ServiceとなるInterfaceをつくって、iOS,Androidの固有のクラスで実装しようと考えています。みなさんがどのようにやらているのか、ご教授いただけますと幸いです。 以上、宜しくお願いします。
回答: > > Xamarin.Forms について > > > Android と iOS 向けと限定しますが、両者特有の凝ったUIは使わず(もっと言えばプラットフォーム毎のUIガイドラインも意図的に無視して)画面を簡潔化、共通設計としたので大きな問題は出ていません。設計が重要と思います。 > > 非同期通信など > > > 基本的には `Task` を使っています。 MVVM での ViewModel の NotifyPropertyChanged で ReactiveProperty を使うのが便利なので、結果 Reactive Extensions も使うことになっている人も多いだろうと思います。 通信処理は単純な WebAPI の呼び出しならば refit を使っています(これは Android で人気の高い retrofit の .NET 向け移植版です)。自力での通信が必要な場合は `System.Net.Http.HttpClient` を使っています。 より重要なのは HttpClient stack の選択かと思います。 iOS では NSURLSession、Android では AndroidClientHandler を選択すると、それぞれのプラットフォーム固有の実装が使用され、これが推奨されています。 * HttpClient and SSL/TLS Implementation Selector for iOS/macOS - Xamarin | Microsoft Docs * HttpClient Stack and SSL/TLS Implementation Selector for Android - Xamarin | Microsoft Docs > > ライブラリについて > > > 海外の著名なものは大抵ラッパー(バインディングライブラリ)が揃っています。 はい View 系は少ない印象ですね。これらは Xamarin.Forms について でも回答したとおり、「どれだけ凝らないか」が重要になります。 > > アーキテクチャなど > > > ServiceとなるInterfaceをつくって、iOS,Androidの固有のクラスで実装しよう > > > アプローチの方法としてはこれがすべてと言って良いと思います。 これを実現する方法がいくつかあります。 ### カスタムレンダラー Xamarin.Forms Custom Renderers - Xamarin | Microsoft Docs 画面上に配置する View に対してプラットフォーム固有の実装に描画を委譲させるなら、この方法しかありません。 ### Bait and switch 多くの .NET Standard 準拠ライブラリで取られている手法です。Xamarin に依存しません。 実装の無い空っぽのクラスライブラリを作成し、プラットフォーム固有側でもまったく同じインターフェースでライブラリを実装します。 そのプラットフォーム版アプリのビルド時に、空っぽのクラスライブラリから実装されたクラスライブラリに置き換える、という方法です。 Xamarin Essentials は作り方の参考になるでしょう。 * xamarin/Essentials: Essential cross platform APIs for your mobile apps. ### DIフレームワーク/ライブラリ Prism, MvvmCross などのフレームワークが DI機能を保っていたり、単純な DI を提供するライブラリもあります。 シンプルなライブラリのひとつに Splat があります。DI というよりは ServiceLocator に分類されるものですが、ご参考まで。 * reactiveui/splat: A library to make things cross-platform that should be