- ping一些东西(例如Google)- 我完全不喜欢这样的决定,并且我已经阅读了有关Android错误的信息。
Application.internetReachability
- 根据Unity的文档,此函数仅确定我是否有可能连接到互联网(它不能保证真正连接)。Network.TestConnection()
- 如果我没有互联网连接,则我的应用程序会失败。因此,这也不正确。
Application.internetReachability
- 根据Unity的文档,此函数仅确定我是否有可能连接到互联网(它不能保证真正连接)。Network.TestConnection()
- 如果我没有互联网连接,则我的应用程序会失败。因此,这也不正确。我实际上不认为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
}));
}
您可以更改网站为任何您想要的内容,甚至可以修改代码以在可达到若干个站点中任意一个成功时返回。据我所知,没有办法在不尝试连接互联网上的特定站点的情况下检查真正的互联网连接性,因此通过类似这样的“ping”一个或多个网站可能是确定连接性的最佳选择。
StartCoroutine(checkInternetConnection((isConnected)=>{/* 在这里处理连接状态 */}));
- Maximillian Laumeisteryield return
。请参阅 Unity 文档中的 WWW,它在示例中使用了 yield return
。 - Maximillian Laumeisterpublic 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);
}
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代替。
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);
}
}
}
public bool CheckInternetConnection(){
return !(Application.internetReachability == NetworkReachability.NotReachable)
}
随着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是什么,在我的代码中,它是一个单独的非Monobehavior脚本,其中包含我计划在项目中重用的所有持久变量(如字符串和哈希)。简而言之:
UniversalEnum.String_Empty = "";
UniversalEnum.WebHtml_isOnline = "http://www.ENTER_YOUR_WEBSITE_HERE.com/games-latestnews/isOnline.html"
那个isOnline.html文件,正如你所看到的,是托管在我的网站HTML_content文件夹下的“games-latestnews”文件夹中的一个文件,它只包含[1]作为其内容。它没有标题,没有实际内容,基本上就像一个在线的.txt文件。我之所以使用这种方法,也是因为我可以通过在该文件夹中添加新的HTML页面来添加新闻到我的游戏中。我还用Try{}将内容检查包围起来,以便如果任何事情失败,它会返回Catch{}值,然后通过比较内容(一个字符串)是否为空字符串或包含任何内容,我们知道用户既在线又是否有访问您的网站的权限。
为什么要检查用户是否同时具有访问网络和访问您的网站的权限的一个很好的例子是,如果用户正在使用诸如学校之类的受限网络。如果学校由于任何原因决定禁止您的网站,仅仅查找连接是否可行将返回错误的结果,因为它无法访问实际的网页。
我创建了一个 Android 库,可以用作 Unity 插件。如果有人感兴趣,可以在 https://github.com/rixment/awu-plugin 下载。
至于 iOS 版本,很遗憾我在这个领域的知识不够。如果有人能扩展该存储库以包括 iOS 版本,那就太好了。
您可以使用此代码检查网络连接
if(Application.internetReachability == NetworkReachability.NotReachable){
Debug.Log("Error. Check internet connection!");
}
Network.TestConnection()
为什么会导致应用程序失败?似乎加入一些错误处理就可以轻松解决。 - Ron BeyerNetwork.TestConnection()
只在没有网络连接时抛出异常,那么只需将其包装在try-catch
中。错误意味着没有网络连接,而没有错误则意味着您可以查看测试结果。 - SimpleVar