はじめに
ネットワークに繋がっているかのチェックは下記コードを使っていましたが、正確ではありませんでした。
if( Application.internetReachability != NetworkReachability.NotReachable )
これは「機内モード」など、あくまで端末側の設定をチェックするもので、実際の接続をチェックするものではないとのこと。公式でも注意書きがありました。
注:このプロパティは、実際の接続性を判断するために使用しないでください。例:デバイスはホットスポットに接続されていても、ネットワークへの実際の経路を持っていないことがあります。
https://docs.unity3d.com/ScriptReference/Application-internetReachability.html
今回コードを見直したのでご紹介します。
コードサンプル
実際にネットワークに繋がっているかどうかをチェックするコードです。UniTaskを使います。
- Unity 2021.3.0
- UniTask 2.3.1
using UnityEngine;
using UnityEngine.Networking;
using Cysharp.Threading.Tasks;
using System.Threading;
public static class CheckeOnline
{
//テストアクセスするURL
private static readonly string CHECK_TARGET_URL = "https://www.bing.com";
//インターネット接続確認
public async static UniTask<bool> IsOnline(CancellationToken ct, int timeOut = 2)
{
//端末側で接続制限している
if(Application.internetReachability == NetworkReachability.NotReachable)
{
Debug.LogWarning($"ネット接続確認失敗、端末で接続が制限されています");
return false;
}
Debug.Log($"ネット接続確認開始 {CHECK_TARGET_URL}");
using var request = new UnityWebRequest(CHECK_TARGET_URL) { timeout = timeOut };
//待機
await request.SendWebRequest().WithCancellation(ct);
//失敗
if(request.result != UnityWebRequest.Result.Success)
{
Debug.LogWarning($"ネット接続確認失敗 {CHECK_TARGET_URL} : result {request.result} : error {request.error}");
return false;
}
//成功
Debug.Log($"ネット接続確認成功 {CHECK_TARGET_URL}");
return true;
}
}
CheckeOnline クラスは Static にしているのでシーンに配置する必要はありません。
public static class CheckeOnline
テストアクセスするURLは、このままだとお行儀が悪いので、所持しているサーバーなどに置き換えてください。
private static readonly string CHECK_TARGET_URL = “https://www.bing.com”;
IsOnline メソッドは CancellationToken と タイムアウト用の int 値(デフォルト2秒)を引数にしていて、Unitak で Bool型を戻しています。
public async static UniTask<bool> IsOnline(CancellationToken ct, int timeOut = 2)
端末側で制限されていたらテストすることなく false を返します。
if(Application.internetReachability == NetworkReachability.NotReachable)
{
return false;
}
UnityWebRequest をインスタンスして待機します。
using var request = new UnityWebRequest(CHECK_TARGET_URL) { timeout = timeOut };
//待機
await request.SendWebRequest().WithCancellation(ct);
アクセスに失敗したら false 、成功したら true を返します。
//失敗
if(request.result != UnityWebRequest.Result.Success)
{
return false;
}
//成功
return true;
使い方
StartなどからIsOnline()を呼び出します。CancellationTokenを渡す必要がありますが、MonoBehaviourを継承しているクラスであれば「this.GetCancellationTokenOnDestroy()」を使うと楽です。
void Start()
{
var bo = await CheckeOnline.IsOnline(this.GetCancellationTokenOnDestroy());
if(bo)
{
Debug.Log("成功した処理");
}
else
{
Debug.Log("失敗した処理");
}
}
参考

