Xamarin,AndroidとiPhoneネイティブアプリでWebAPIを呼び出す方法


はじめに

Xamarin を始めてまだ2日目ですが、すでにいろいろな問題に遭遇して四苦八苦しています。

ですが、C# で全て開発できるという利点が徐々に分かってきた気がします。

特に、コードを共有できて生産性が高くなるところがいいですね。 開発環境

開発環境は Macbook Air (2013)で、Web API は正式な SSL/TLS 証明書の HTTPS 通信でないとアプリが動作しないことが分かったので、とりあえず以下の内容のテキストファイルを Web API のリターンとします。

リターンの内容は以下の JSON 形式になります。

["value1","value2"]

本当は、ASP.NET Core Web API + nginx で自己証明書を使って Web API を作ったのですが、どうしても HTTPS 通信がうまくいきませんでした。リバースプロキシまで立てたのに…。

あと、Androidデバッグを実機で行いました。iPhoneエミュレータはそんなに重くないのでいいのですが、Androidエミュレータはまともに私の環境では動作しませんでした。

これがあるから仕事ではみなさん Macbook ProCore i7 モデルを買うのでは?と思ったくらいです。

さて、余談はこのくらいにして Xamarin の Android/iPhoneネイティブアプリで Web API を呼び出す方法をご紹介します。

Xamarin.Android

Xamarin の Android ネイティブアプリは、Visual Studio for MacAndroid のソリューションを作成します。

Web API を呼び出すのに HttpClient を使用するのですが、そのためには Microsoft.Net.Http パッケージを NuGet からインストールする必要があります。インストールがうまくいかない場合は、下記記事を参考にしてみてください。

Microsoft.Net.Http パッケージがインストールできたら、以下のようにコードを記述します。Andoroid の流儀はまだ分かりませんが、とりあえず動いているのでよいかな、と。あと、.NET のライブラリを利用できることで簡潔に処理を記述できるのもよいですね。

using Android.App;
using Android.Widget;
using Android.OS;
using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

namespace test8
{
    [Activity(Label = "test8", MainLauncher = true, Icon = "@mipmap/icon")]
    public class MainActivity : Activity
    {
        HttpClient client = new HttpClient();
        string uri = "https://api.xxxxxx.com/test.txt";

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            SetContentView(Resource.Layout.Main);

            Button button = FindViewById<Button>(Resource.Id.myButton);
            TextView textView = FindViewById<TextView>(Resource.Id.myTextView);

            button.Click += delegate { UpdateButton(textView); };
        }

        private async void UpdateButton(TextView textView)
        {
            //Web API を GET 取得
            var ret = await this.client.GetAsync(uri);

            //テキストビューに取得した値をセット
            textView.Text = await ret.Content.ReadAsStringAsync();
        }
    }
}

このコードを実行すると、この画面でボタンをクリックすると。

f:id:fnyablog:20180907061017p:plain

以下のように Web API の値をセットすることができました。

f:id:fnyablog:20180907061036p:plain

Xamarin.iOS / iPhone

Xamarin の iPhone ネイティブアプリは、Visual Studio for MaciOS のソリューションを作成します。

Web API を呼び出すのに HttpClient を使用するのですが、そのためには Microsoft.Net.Http パッケージを NuGet からインストールします。これは問題なくインストールできると思います。

どちらかと言うと、iPhone の実機で動作させる方が大変かもしれません。

私もかなりつまずきましたが、なんとかクリアできました。

軽く触った感じでは、Android より iPhone アプリの方が .NET の開発に近い印象を受けました。

では、実際のコードになります。Android で同様のコードをご紹介したので必要部分だけ。簡潔ですね。

string uri = "https://api.xxxxx.com/test.txt";
HttpClient client = new HttpClient();

async partial void down(UIButton sender)
{

    //Web API から GET で値を取得
    var ret = await this.client.GetAsync(uri);

    //ラベルに取得した値をセット
    this.myLabel.Text = await ret.Content.ReadAsStringAsync();
}

iPhoneエミュレータの画像ですが、この画面が。

f:id:fnyablog:20180907061116p:plain

こうなります。サーバーの値を取得できていますね。

f:id:fnyablog:20180907061134p:plain

おわりに

ここまで到達するまでに紆余曲折があったのですが、Xamarin は開発環境としてクセはあるけれどもそれを補うメリットがあるのではないかと感じました。

ただ、Web API のサーバーに正式な SSL/TLS 証明書を用意しなければいけないというのがかなり厳しいですね。

普通の開発ではどのようにやっているのか知りたいところです。

Xamarin はいいぞ!