質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

2回答

2590閲覧

Xamarinでのアプリ開発について

otoko

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2018/11/12 03:48

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の固有のクラスで実装しようと考えています。みなさんがどのようにやらているのか、ご教授いただけますと幸いです。

以上、宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Xamarin.Forms について

Android と iOS 向けと限定しますが、両者特有の凝ったUIは使わず(もっと言えばプラットフォーム毎のUIガイドラインも意図的に無視して)画面を簡潔化、共通設計としたので大きな問題は出ていません。設計が重要と思います。

非同期通信など

基本的には Task<T> を使っています。
MVVM での ViewModel の NotifyPropertyChanged で ReactiveProperty を使うのが便利なので、結果 Reactive Extensions も使うことになっている人も多いだろうと思います。

通信処理は単純な WebAPI の呼び出しならば refit を使っています(これは Android で人気の高い retrofit の .NET 向け移植版です)。自力での通信が必要な場合は System.Net.Http.HttpClient を使っています。

より重要なのは HttpClient stack の選択かと思います。

iOS では NSURLSession、Android では AndroidClientHandler を選択すると、それぞれのプラットフォーム固有の実装が使用され、これが推奨されています。

ライブラリについて

海外の著名なものは大抵ラッパー(バインディングライブラリ)が揃っています。
はい View 系は少ない印象ですね。これらは Xamarin.Forms について でも回答したとおり、「どれだけ凝らないか」が重要になります。

アーキテクチャなど

ServiceとなるInterfaceをつくって、iOS,Androidの固有のクラスで実装しよう

アプローチの方法としてはこれがすべてと言って良いと思います。
これを実現する方法がいくつかあります。

カスタムレンダラー

Xamarin.Forms Custom Renderers - Xamarin | Microsoft Docs

画面上に配置する View に対してプラットフォーム固有の実装に描画を委譲させるなら、この方法しかありません。

Bait and switch

多くの .NET Standard 準拠ライブラリで取られている手法です。Xamarin に依存しません。
実装の無い空っぽのクラスライブラリを作成し、プラットフォーム固有側でもまったく同じインターフェースでライブラリを実装します。
そのプラットフォーム版アプリのビルド時に、空っぽのクラスライブラリから実装されたクラスライブラリに置き換える、という方法です。

Xamarin Essentials は作り方の参考になるでしょう。

DIフレームワーク/ライブラリ

Prism, MvvmCross などのフレームワークが DI機能を保っていたり、単純な DI を提供するライブラリもあります。
シンプルなライブラリのひとつに Splat があります。DI というよりは ServiceLocator に分類されるものですが、ご参考まで。

投稿2018/11/12 10:57

amay077

総合スコア1075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otoko

2018/11/14 02:44

貴重なご意見、多々ありがとうございました。 いくつか調べた上での疑問点がございます。 ■カスタムレンダラーにつきまして こちらは、あくまでXamarin.Formsを使用した場合に生じる、プラットフォーム固有の機能の実装をする場合という認識であってますでしょうか?つまりは、プラットフォーム固有でViewを管理している場合、カスタムレンダラーは特に関係ないですよね? ■Xamarin.Formsにつきまして 上記質問にも通づることで、そもそもの疑問なのですが、Xamarin.Formsを使用するということは、各プラットフォームでViewは書かなくて、プラットフォーム固有なものであれば、上記カスタムレンダラーを使用するということでしょうか? MvvmCrossなどを拝見していますと、共通になる部分にはView関係は書かず、各プラットフォームでViewを管理している様に見えます。 そこで、例えば簡単なよくあるスライドメニューを作成したいときには、どのように作成されますでしょうか?個人の見解といたしましては以下の2つだと思っているのですが、誤りがありましたらご指摘いただけますと幸いです。 1:DI系のライブラリを使用せずXamarin.Formsを使用する場合 xamlで共通部分を作成し、固有のものがあれば、カスタムレンダラーで実装する。 2:Di系のライブラリを使用する場合 プラットフォームごとにViewを管理すれば、問題はないと思いますが、このスライドメニューだけを共通の部分としてXamarin.Formsで管理したいと考えたときにどのように管理するのが得策でしょうか?ここがわからず困惑しております。 恐れ入りますが、ご回答宜しくお願い申し上げます。
amay077

2018/11/14 05:30

> プラットフォーム固有でViewを管理している場合、カスタムレンダラーは特に関係ないですよね? ちょっと認識が正しくないと思いました。 まず Xamarin.Forms は 「『Xamarin.Android, Xamarin.iOS で使える View』に共通のインターフェースを与える」というものです。なので Xamarin.Forms でオリジナルのView(例: MySlideMenu.Forms)を作るということは、「1. Xamarin.AndroidMySlideMenu.Android を作る」「2. Xamarin.iOS で MySlideMenu.iOS を作る」「3. Xamarin.Forms で MySlideMenu.Forms を作り、MySlideMenu.Forms内の描画を MySlideMenu.Android、MySlideMenu.iOS に委譲させる(これがカスタムレンダラー)」というステップが必要になります。 MvvmCross は Xamarin.Forms とは関係なく、また MvvmCross は UI の共通化まではカバーしないライブラリなので共通化できるのはロジックのみであり、共通なViewという概念はないはずです。
otoko

2018/11/14 09:00

認識がズレておりました。ご指摘ありがとうございます。そして大変わかりやすい具体例もありがとうございました!
guest

0

Xamarin.formsについて

画面が簡単なものであればいいのですが、ちょっと凝ったものにしようとするとXamarin.formsだと面倒なことが多いです。カスタムレンダラーで、プラットフォームごとに作っていけば何とかなるのですが、その比率が大きくなってくるとXamarin.formを使うメリットが薄くなってきます。前にformで作ろうとして、formで作る意味ないなと感じて、諦めたこともあります。

非同期通信など

普通に書いていたら、async,awaitでやりますが、全体的にRxを使って書いているのなら、Observableにすることもあります。
通信処理は、System.Net.Http.HttpClientで大丈夫です。

ライブラリについて

View関連はあまりないかもです。iOSやAndroidの有名なライブラリなんかは、バインディングされていることもあるので、NuGetで探してみればいいです。見つからない場合は、自分でバインディングすることもできますが、結構大変です。

アーキテクチャなど

Interfaceを作って固有で実装するので大丈夫です。
自分は、MVVMフレームワークのMVVMCrossを使っていますが、その機能で、ViewModelにDIして呼び出しています。

投稿2018/11/12 05:33

f-miyu

総合スコア1625

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otoko

2018/11/13 02:13

貴重なご意見ありがとうございました。やはりVIew関連でこりすぎないことが大事そうですね。また、MVVMCross良さそうですね。使用してみたいと思います。
otoko

2018/11/13 02:54

MVVMCrossにつきまして、少々お尋ねしたいことがあります。 想定といたしましてよくあるようなスライドメニューを作りたいとします。 個々のViewで書けば、できることなんでしょうが、仮にこのメニューの部分だけXamrin.Formsを使用して共通化したいと考えた場合、どのようにxamlファイルを管理するのでしょうか? https://www.mvvmcross.com/documentation/platform/xamarin.forms/xamarin-forms-view-presenter.html このあたりを見たのですが、少々わからなかったので質問させていただきます。 ご回答いただけますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問