检查Unity的互联网连接

Ann*_*eva 11 c# android internet-connection unity-game-engine ios

我有一个Unity项目,我为Android和iOS平台构建.我想检查桌面,Android和iOS设备上的互联网连接.我读过三个不同的解决方案:

  1. Ping一些东西(例如谷歌) - 我完全不喜欢这样的决定,而且我已经读过关于Android的错误.

  2. Application.internetReachability - 根据Unity的文档,此功能仅确定我具有连接到Internet的可能性(它不保证真正的连接).

  3. Network.TestConnection() - 如果我没有Internet连接,我的应用程序将失败.所以这也不正确.

如何确定我是否在Unity内部具有互联网连接?

Max*_*ter 10

我实际上并不相信这Network.TestConnection()是这项工作的正确工具.根据文档,它看起来像是用于测试NAT是否正常工作以及您的客户端是否可以通过IP公开访问,但您要检查的是您是否具有一般的互联网连接.

这是我在Unity Answers上由用户pixel_fiend 找到解决方案,它只是测试网站以查看用户是否具有连接.此代码的一个好处是它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
     }));
 }
Run Code Online (Sandbox Code Playgroud)

您可以将网站更改为您想要的任何内容,甚至可以修改代码以在多个站点中的任何一个可访问时返回成功.AFAIK无法在不尝试连接到互联网上的特定网站的情况下检查真正的互联网连接,因此"ping"这样的一个或多个网站可能是您确定连接时的最佳选择.


Kir*_*gov 6

    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);
    }
Run Code Online (Sandbox Code Playgroud)