【Unity】実際にネットワークに繋がっているか確認する

  • URLをコピーしました!
目次

はじめに

ネットワークに繋がっているかのチェックは下記コードを使っていましたが、正確ではありませんでした。

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("失敗した処理");
    }
}

参考

teratail[テラテイル]
Unityでネットのアクセス状況を調べてたい ### 前提・実現したいこと Unityでインターネットのアクセス状況を調べて処理を分岐させたいと 思っております。 ### 発生している問題・エラーメッセージ ネッ...
(:3[kanのメモ帳]
本当にインターネットに接続出来るかを確認する方法【Unity】 - (:3[kanのメモ帳] この記事でのバージョン Unity 2021.1.16f1 はじめに UnityはApplication.internetReachabilityを使うことで、 インターネットのアクセス状態を返します。 簡単にインター...

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次
閉じる