团结检查互联网连接可用性

我将我们的游戏移植到Unity,并需要在Unity中进行互联网连接检查。 Unity官方文档说'不要使用Application.internetReachability。 所以我很困惑哪些代码会在这里工作。 没有在任何论坛find任何突出的解决scheme。 我想检查是否Wi-Fi或GPRS是否适用于iOS和Android。 提前致谢。

Application.internetReachability是你所需要的。 可能与Ping一起。

这是一个例子:

using UnityEngine; public class InternetChecker : MonoBehaviour { private const bool allowCarrierDataNetwork = false; private const string pingAddress = "8.8.8.8"; // Google Public DNS server private const float waitingTime = 2.0f; private Ping ping; private float pingStartTime; public void Start() { bool internetPossiblyAvailable; switch (Application.internetReachability) { case NetworkReachability.ReachableViaLocalAreaNetwork: internetPossiblyAvailable = true; break; case NetworkReachability.ReachableViaCarrierDataNetwork: internetPossiblyAvailable = allowCarrierDataNetwork; break; default: internetPossiblyAvailable = false; break; } if (!internetPossiblyAvailable) { InternetIsNotAvailable(); return; } ping = new Ping(pingAddress); pingStartTime = Time.time; } public void Update() { if (ping != null) { bool stopCheck = true; if (ping.isDone) { if (ping.time >= 0) InternetAvailable(); else InternetIsNotAvailable(); } else if (Time.time - pingStartTime < waitingTime) stopCheck = false; else InternetIsNotAvailable(); if (stopCheck) ping = null; } } private void InternetIsNotAvailable() { Debug.Log("No Internet :("); } private void InternetAvailable() { Debug.Log("Internet is available! ;)"); } } 

注意事项

  1. Unity的ping不做任何域名parsing,也就是只接受IP地址。 所以,如果某个玩家有互联网接入,但是有一些DNS问题,这个方法会说他有互联网。
  2. 这只是一个检查。 不要期望它是100%准确的。 在一些罕见的情况下,它会为您提供虚假信息。

要真正知道你在线,你需要实施“强制门户检测”,要知道你是否打了公共的WiFilogin页面。 所以只要检查Application.internetReachability或者做一个Ping到某个地址并不能保证你可以成功连接或者发出WWW请求。

我已经做了一个简单的资产称为互联网可达性validation。 它让你保持最新是否你已经validation了互联网访问(WWW请求可以完成)。 更多信息: http : //j.mp/IRVUN

我所做的是testing连通性的Network.TestConnection ,是否可以作为服务器,以及是否能够成功使用NAT穿透。

这是他们给我们的示例代码。 如果结果是ConnectionTesterStatus.Error ,则可能是没有互联网访问。

 var testStatus = "Testing network connection capabilities."; var testMessage = "Test in progress"; var shouldEnableNatMessage : String = ""; var doneTesting = false; var probingPublicIP = false; var serverPort = 9999; var connectionTestResult = ConnectionTesterStatus.Undetermined; // Indicates if the useNat parameter be enabled when starting a server var useNat = false; function OnGUI() { GUILayout.Label("Current Status: " + testStatus); GUILayout.Label("Test result : " + testMessage); GUILayout.Label(shouldEnableNatMessage); if (!doneTesting) TestConnection(); } function TestConnection() { // Start/Poll the connection test, report the results in a label and // react to the results accordingly connectionTestResult = Network.TestConnection(); switch (connectionTestResult) { case ConnectionTesterStatus.Error: testMessage = "Problem determining NAT capabilities"; doneTesting = true; break; case ConnectionTesterStatus.Undetermined: testMessage = "Undetermined NAT capabilities"; doneTesting = false; break; case ConnectionTesterStatus.PublicIPIsConnectable: testMessage = "Directly connectable public IP address."; useNat = false; doneTesting = true; break; // This case is a bit special as we now need to check if we can // circumvent the blocking by using NAT punchthrough case ConnectionTesterStatus.PublicIPPortBlocked: testMessage = "Non-connectable public IP address (port " + serverPort +" blocked), running a server is impossible."; useNat = false; // If no NAT punchthrough test has been performed on this public // IP, force a test if (!probingPublicIP) { connectionTestResult = Network.TestConnectionNAT(); probingPublicIP = true; testStatus = "Testing if blocked public IP can be circumvented"; timer = Time.time + 10; } // NAT punchthrough test was performed but we still get blocked else if (Time.time > timer) { probingPublicIP = false; // reset useNat = true; doneTesting = true; } break; case ConnectionTesterStatus.PublicIPNoServerStarted: testMessage = "Public IP address but server not initialized, "+ "it must be started to check server accessibility. Restart "+ "connection test when ready."; break; case ConnectionTesterStatus.LimitedNATPunchthroughPortRestricted: testMessage = "Limited NAT punchthrough capabilities. Cannot "+ "connect to all types of NAT servers. Running a server "+ "is ill advised as not everyone can connect."; useNat = true; doneTesting = true; break; case ConnectionTesterStatus.LimitedNATPunchthroughSymmetric: testMessage = "Limited NAT punchthrough capabilities. Cannot "+ "connect to all types of NAT servers. Running a server "+ "is ill advised as not everyone can connect."; useNat = true; doneTesting = true; break; case ConnectionTesterStatus.NATpunchthroughAddressRestrictedCone: case ConnectionTesterStatus.NATpunchthroughFullCone: testMessage = "NAT punchthrough capable. Can connect to all "+ "servers and receive connections from all clients. Enabling "+ "NAT punchthrough functionality."; useNat = true; doneTesting = true; break; default: testMessage = "Error in test routine, got " + connectionTestResult; } if (doneTesting) { if (useNat) shouldEnableNatMessage = "When starting a server the NAT "+ "punchthrough feature should be enabled (useNat parameter)"; else shouldEnableNatMessage = "NAT punchthrough not needed"; testStatus = "Done testing"; } } 

这是一个简单的解决scheme,我已经用于Internet检查。 它适用于IOS和Android。 我知道这可能需要改进,但这里是:

 public static bool InternetStatus () { if (Application.internetReachability != NetworkReachability.NotReachable) { return true; }else{ return false; } }