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

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

ただいまの
回答率

90.34%

  • C#

    7749questions

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

  • Xamarin

    535questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 254

otoko

score 6

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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/14 11:44

    貴重なご意見、多々ありがとうございました。
    いくつか調べた上での疑問点がございます。

    ■カスタムレンダラーにつきまして

    こちらは、あくまでXamarin.Formsを使用した場合に生じる、プラットフォーム固有の機能の実装をする場合という認識であってますでしょうか?つまりは、プラットフォーム固有でViewを管理している場合、カスタムレンダラーは特に関係ないですよね?

    ■Xamarin.Formsにつきまして

    上記質問にも通づることで、そもそもの疑問なのですが、Xamarin.Formsを使用するということは、各プラットフォームでViewは書かなくて、プラットフォーム固有なものであれば、上記カスタムレンダラーを使用するということでしょうか?

    MvvmCrossなどを拝見していますと、共通になる部分にはView関係は書かず、各プラットフォームでViewを管理している様に見えます。

    そこで、例えば簡単なよくあるスライドメニューを作成したいときには、どのように作成されますでしょうか?個人の見解といたしましては以下の2つだと思っているのですが、誤りがありましたらご指摘いただけますと幸いです。

    1:DI系のライブラリを使用せずXamarin.Formsを使用する場合

    xamlで共通部分を作成し、固有のものがあれば、カスタムレンダラーで実装する。

    2:Di系のライブラリを使用する場合

    プラットフォームごとにViewを管理すれば、問題はないと思いますが、このスライドメニューだけを共通の部分としてXamarin.Formsで管理したいと考えたときにどのように管理するのが得策でしょうか?ここがわからず困惑しております。

    恐れ入りますが、ご回答宜しくお願い申し上げます。

    キャンセル

  • 2018/11/14 14:30

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

    MvvmCross は Xamarin.Forms とは関係なく、また MvvmCross は UI の共通化まではカバーしないライブラリなので共通化できるのはロジックのみであり、共通なViewという概念はないはずです。

    キャンセル

  • 2018/11/14 18:00

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

    キャンセル

+1

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/13 11:13

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

    キャンセル

  • 2018/11/13 11:54

    MVVMCrossにつきまして、少々お尋ねしたいことがあります。
    想定といたしましてよくあるようなスライドメニューを作りたいとします。

    個々のViewで書けば、できることなんでしょうが、仮にこのメニューの部分だけXamrin.Formsを使用して共通化したいと考えた場合、どのようにxamlファイルを管理するのでしょうか?

    https://www.mvvmcross.com/documentation/platform/xamarin.forms/xamarin-forms-view-presenter.html

    このあたりを見たのですが、少々わからなかったので質問させていただきます。
    ご回答いただけますと幸いです。

    キャンセル

  • 2018/11/13 12:13

    参照されているページは、Xamarin.Formsをメインとした場合の記述なので、基本ネイティブで、一部、Xamarin.FormsのPageを使うやり方は別にあります。

    https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/platform/native-forms

    キャンセル

同じタグがついた質問を見る

  • C#

    7749questions

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

  • Xamarin

    535questions

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