【问题标题】:Check for internet connectivity from Unity从 Unity 检查互联网连接
【发布时间】:2015-12-07 16:42:52
【问题描述】:

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

  1. Ping 某些东西(例如 Google)- 我完全不喜欢这样的决定,而且我读过关于 Android 上的错误。

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

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

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

【问题讨论】:

  • 为什么Network.TestConnection() 会导致您的应用程序失败?似乎有点错误处理很容易捕捉到这一点。
  • 请用 ping 方法链接到提到的“错误”?
  • @RonBeyer,如果我使用 Network.TestConnection(),并且没有 Internet 连接,我的应用程序将失败并出现以下异常:'无法解析连接测试器地址,您必须在执行此操作之前连接到 Internet或将地址设置为您可以访问的地址。我从docs.unity3d.com/ScriptReference/Network.TestConnection.html复制了应付
  • @AnnaKuleva 如果Network.TestConnection() 仅在没有互联网时抛出异常,只需将其包装在try-catch 中。错误表示没有网络,没有错误表示可以查看测试结果。
  • 这绝对不是链接问题的重复。这个问题询问如何在 PC、Android 和 iOS 上的 Unity3D 中使用 C# 检查连接性。提议的副本是询问如何使用 Cocoa Touch 使用 iOS SDK 中的 Objective-C 检查连接性。这是两种完全独立的编程语言和技术栈。

标签: c# android ios unity3d internet-connection


【解决方案1】:

我实际上并不认为Network.TestConnection() 是适合这项工作的工具。根据the documentation 的说法,在我看来它是用于测试 NAT 是否正常工作以及您的客户端是否可以通过 IP 公开访问,但您要检查的是您是否有一般的互联网连接。

这是用户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 如果不尝试连接到 Internet 上的特定站点,就无法检查真正的 Internet 连接,因此像这样“ping”一个或多个网站可能是确定连接的最佳选择。

【讨论】:

  • 如何调用 Action 动作?用什么?
  • @HahaTTpro 使用StartCoroutine(checkInternetConnection((isConnected)=&gt;{/* handle connection status here */}));
  • 感谢@Maximillian 的回答。然而,这不是我想要的。我的意思是“Action 的命名空间是什么”。它是 System.Action.
  • @HahaTTpro 是的,没错,它是 System.Action。更多信息:answers.unity3d.com/questions/335953/what-is-systemaction.html
  • 这也适用于IOS吗?
【解决方案2】:
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);
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 它是否适用于 Android 和 iOS 的移动设备?
    • 是的,我测试过,这适用于所有设备和平台
    • 你读过这个问题吗?它在那里说这是不够的。文档说这仅表明有网络可用,而不是网络具有连接性。例如,wifi 连接到路由器,但路由器没有外部连接。甚至还有一个重复的否决答案。
    • Application.internetReachability 不适用于实际连接
    【解决方案4】:
    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 代替。

    【讨论】:

      【解决方案5】:

      为此,我创建了一个可用作 Unity 插件的 Android 库。如果有人感兴趣,可以通过https://github.com/rixment/awu-plugin

      至于 iOS 版本,遗憾的是我在这方面的知识还不够。如果有人可以扩展 repo 以包含 iOS 版本,那就太好了。

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 2017-03-16
        • 2014-02-08
        • 2012-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多