unity3d 检查Unity的互联网连接

rvpgvaaj  于 2022-11-25  发布在  其他
关注(0)|答案(8)|浏览(274)

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

  1. Ping一些东西(例如谷歌)-我完全不喜欢这样的决定,我读过关于Android的错误。
  2. Application.internetReachability-根据Unity的文档,此函数将仅确定我有连接到Internet的可能性(它不保证真实的的连接)。
  3. Network.TestConnection()-如果我没有Internet连接,我的应用程序将失败。因此这也是不正确的。
    如何确定我是否在Unity中具有互联网连接?
yuvru6vn

yuvru6vn1#

实际上我并不认为Network.TestConnection()是适合这项工作的工具。根据the documentation,在我看来,它似乎是用来测试NAT是否正常工作,以及客户端是否可以通过IP公开访问,但您需要检查的是您是否具有一般的Internet连接。
下面是用户pixel_fiend的一个solution that I found on Unity Answers代码,它只是测试一个网站,看看用户是否有连接。这个代码的一个好处是它使用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
     }));
 }

您可以将网站更改为任何您想要的网站,甚至修改代码,以返回成功,如果任何一个网站是可达的。AFAIK没有办法检查真正的互联网连接,而不尝试连接到互联网上的一个特定的网站,所以“ping”一个或多个这样的网站可能是您最好的赌注,在确定连接。

a1o7rhls

a1o7rhls2#

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);
}
q9yhzks0

q9yhzks03#

void Start()
{
    StartCoroutine(CheckInternetConnection(isConnected =>
    {
        if (isConnected)
        {
            Debug.Log("Internet Available!");
        }
        else
        {
            Debug.Log("Internet Not Available");
        }
    }));
}

IEnumerator CheckInternetConnection(Action<bool> action)
{
    UnityWebRequest request = new UnityWebRequest("http://google.com");
    yield return request.SendWebRequest();
    if (request.error != null) {
        Debug.Log ("Error");
        action (false);
    } else{
        Debug.Log ("Success");
        action (true);
    }
}

由于WWW已被弃用,因此可以改用UnityWebRequest。

ct2axkht

ct2axkht4#

我知道这是旧的,但也许可以帮助你。

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

vsdwdz235#

我已经创建了一个Android的库,可以用作Unity的插件。
至于iOS版本,不幸的是我在这方面的知识不够。如果有人能扩展回购包括iOS版本太好了。

nmpmafwu

nmpmafwu6#

在Unity的最新版本中,WWW已经过时,因此您需要使用WebRequest。
下面是我用来检查用户是否在线的代码:

private string HtmlLookUpResult_Content;
private char[] HtmlLookUpResult_Chars;
private StreamReader HtmlLookUpResult_Reader;
private bool HtmlLookUpResult_isSuccess;
private HttpWebRequest HtmlLookUpResult_Request;
private HttpWebResponse HtmlLookUpResult_Response;
public bool CheckIfOnline()
{
    HtmlLookUpResult_Content = UniversalEnum.String_Empty;
    HtmlLookUpResult_Request = (HttpWebRequest)WebRequest.Create(UniversalEnum.WebHtml_isOnline);
    HtmlLookUpResult_Request.Timeout = 5000;
    try
    {
        using (HtmlLookUpResult_Response = (HttpWebResponse)HtmlLookUpResult_Request.GetResponse())
        {
            HtmlLookUpResult_isSuccess = (int)HtmlLookUpResult_Response.StatusCode < 299 && (int)HtmlLookUpResult_Response.StatusCode >= 200;
            if (HtmlLookUpResult_isSuccess)
            {
                using (HtmlLookUpResult_Reader = new StreamReader(HtmlLookUpResult_Response.GetResponseStream()))
                {
                    HtmlLookUpResult_Chars = new char[1];
                    HtmlLookUpResult_Reader.Read(HtmlLookUpResult_Chars, 0, 1);
                    HtmlLookUpResult_Content += HtmlLookUpResult_Chars[0];
                }
            }
        }
    }
    catch
    {
        HtmlLookUpResult_Content = UniversalEnum.String_Empty;
    }
    if (HtmlLookUpResult_Content != UniversalEnum.String_Empty)
    {
        return true;
    }
    else
    {
        return false;
    }
}

如果你想知道用户是否在线,你可以从代码中的HtmlLookUpResult_isSuccess得到结果。但是,实际上,你最有可能想确认用户是否也可以访问你的服务器或你在项目中使用的任何远程系统,对吗?这就是剩下的代码所做的。
如果你想知道什么是UniversalEnum,在我的代码中,它是一个独立的非Monobhavior脚本,包含了我计划在项目中重用的所有持久变量(比如字符串和哈希)。
通用枚举。字符串_空=“";
网站http://www.ENTER:
正如你所看到的,isOnline.html文件是我托管的网站的HTML_content中的“games-latestnews”文件夹中的一个文件,它只包含**[1]**作为它的内容。没有实际的内容,很像一个.txt文件设置在线。我使用这种方法也是因为我可以添加新的新闻到我的游戏,只是添加新的HTML页面在该文件夹。我'我还使用Try{}来包围内容检查,这样如果ANYTHING失败,它将返回Catch{}值,然后通过比较内容(字符串)是空字符串还是包含任何内容,我们可以知道用户是否在线以及他/她是否可以访问您的网站。
一个很好的例子,为什么你会想检查用户是否有访问网络和您的网站是如果用户使用一个有限的网络,如你可能会发现在一所学校。如果一所学校决定禁止您的网站由于任何原因,只是查找如果连接是可能的,将返回一个假阳性,因为它不会访问实际的网页反正。

tyu7yeag

tyu7yeag7#

Ping 8.8.8.8而不是发送GET Unity已经提供了这样的工具:
Ping
Ping操作是异步的,可以使用Ping. isDone轮询Ping对象的状态。收到响应时,它位于Ping. time中。
Windows应用商店应用:流套接字用于模拟ping功能,它将尝试使用端口80打开与指定IP地址的连接。要使此功能正常工作,必须在Package. appxmanifest中启用InternetClient功能。
Android:如果ICMP套接字可用,则将其用于ping操作,否则Unity将生成一个子进程/system/bin/ping用于ping操作。要检查ICMP套接字是否可用,您需要读取/proc/sys/net/ipv4/ping_group_range的内容。如果ICMP套接字可用,则此文件应包含0 2147483647的条目。

using UnityEngine;
using System.Collections.Generic;
 
public class PingExample : MonoBehaviour
{
    bool isConnected = false;
    private IEnumerator Start()
    {
        while(true)
        {
            var ping = new Ping("8.8.8.8");
 
            yield return new WaitForSeconds(1f);
            while (!ping.isDone) 
            {
                isConnected = false;
                yield return null;
            }
            isConnected = true;
            Debug.Log(ping.time);
        }
    }
}
6mw9ycah

6mw9ycah8#

您可以使用此代码检查网络连接

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

相关问题