プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

Xamarin.iOSでインターネットに接続しているか確認したい

Xamarinにサンプルあるよ。

Reachability Sample - Xamarin

元ネタはappleのサンプルでしょうか。サイト名がappleからgoogleに変わっているのがなんとも。

これコピペで完了です。 と思っていた時期が私にもありました。

実際にこれでいいと思って実装していたんですが、ちょっと私の予想と違う動作になりました。

無線LANルーターとつながっていてそのルーターが外部とつながっていないとき

f:id:puni-o:20160128181948p:plain

こんな状態ですね。 ルーターもって圏外に行っていたり、そもそもWifiしかないiPadを使っているときにこんな状況になるかもしれません。

この時サンプルの

Reachability.RemoteHostStatus();

などは失敗してほしいんですが、正常のままです。(Appleのサンプルも同様の動作です) 内部で何をやっているのかわかりませんが、インターネットにつながっている状態が欲しいのでこれではだめです。

適当に作ってみた

[HTTP Ping]あたりでググった結果で適当に作りました。

try
{
    var request = (HttpWebRequest)WebRequest.Create("http://www.google.com");
    request.Timeout = 3000;
    request.AllowAutoRedirect = false;
    request.Method = "HEAD";
    using (request.GetResponse())
    {
        Console.WriteLine("Network is OK");
    }
}
catch (Exception exp)
{
    Console.WriteLine("Network is NG.");
}

もっとスマートな方法があったら是非教えてくださいお願いします何でもしますから。