web-dev-qa-db-ja.com

Unityからインターネット接続を確認する

AndroidおよびiOSプラットフォーム用にビルドしたUnityプロジェクトがあります。デスクトップ、Android、およびiOSデバイスでインターネット接続を確認したいと思います。3つの異なるソリューションについて読みました:

  1. Pingの何か(たとえばGoogle)-私はそのような決定を完全に嫌いです、そして私はAndroidの間違いについて読んだことがあります。

  2. _Application.internetReachability_-Unityのドキュメントによると、この関数は私がインターネットに接続する可能性があることのみを決定します(実際の接続を保証するものではありません)。

  3. Network.TestConnection()-インターネットに接続していない場合、アプリケーションが失敗します。したがって、これも正しくありません。

Unity内からインターネットに接続しているかどうかを確認するにはどうすればよいですか?

12
Anna Kuleva

私は実際にNetwork.TestConnection()がこの仕事に適したツールだとは信じていません。 ドキュメント によると、NATが機能していて、クライアントがIPでパブリックに到達可能であるが、確認したいことは一般的なインターネット接続があるかどうかです。

これは nity Answersで見つけたソリューション ユーザーによる pixel_fiend です。これは、ユーザーが接続しているかどうかを確認するためにWebサイトをテストするだけです。このコードの利点の1つは、非同期操作にIEnumeratorを使用するため、接続テストでアプリケーションの残りの部分が保持されないことです。

IEnumerator checkInternetConnection(Action<bool> action){
     WWW www = new WWW("http://google.com");
     yield return www;
     if (www.error != null) {
         action (false);
     } else {
         action (true);
     }
 } 
 void Start(){
     StartCoroutine(checkInternetConnection((isConnected)=>{
         // handle connection status here
     }));
 }

Webサイトを好きなように変更したり、コードを変更して、複数のサイトのいずれかにアクセスできる場合に成功を返すようにすることもできます。私の知る限り、インターネット上の特定のサイトに接続することなく本当のインターネット接続を確認する方法はないため、このような1つ以上のWebサイトに「ping」を実行すると、接続を決定するのに最善の方法となるでしょう。

    public static IEnumerator CheckInternetConnection(Action<bool> syncResult)
    {
        const string echoServer = "http://google.com";

        bool result;
        using (var request = UnityWebRequest.Head(echoServer))
        {
            request.timeout = 5;
            yield return request.SendWebRequest();
            result = !request.isNetworkError && !request.isHttpError && request.responseCode == 200;
        }
        syncResult(result);
    }
4

これは古いのですが、おそらくあなたを助けることができます。

public bool CheckInternetConnection(){
    return !(Application.internetReachability == NetworkReachability.NotReachable)
}
4
kamiyar

「保証された」インターネット接続をテストする適切な方法は、コンテンツが既知の場所へのhttp(s)リクエストを使用してキャプティブポータルを検出することです。これは、オペレーティングシステム自体がユーザーにwifiログイン画面を表示する必要があるかどうかをテストする方法です。

Wwwリクエストの単純なpingまたはエラー/成功ステータスのチェックだけでは不十分です。ホテル/空港のwifiログインページは、エラーコードなしで(必要なページの代わりに)返すことができます。

さらに、例えばiOSでは、新しい追加の制限があります(アプリトランスポートセキュリティでは、明示的にホワイトリストに登録されている場合にのみhttpが許可されます)。

私のアセットは無料ではありませんが、簡単なソリューションです。アセットストアの Internet Reachability Verifier

2
tonic

この目的でUnityのプラグインとして使用できるAndroidのライブラリを作成しました。誰かが興味を持っているなら、それは https://github.com/rixment/awu-plugin で利用可能です

残念ながらiOS版については、この分野の知識が十分にありません。誰かがレポジトリを拡張してiOSバージョンも含めることができるといいですね。

0
Rixment

このコードを使用してネットワーク接続を確認できます

if(Application.internetReachability == NetworkReachability.NotReachable){
       Debug.Log("Error. Check internet connection!");
}
0
Codemaker