Проверьте подключение к Интернету от Unity

У меня есть проект Unity, который я создаю для платформ Android и iOS. Я хочу проверить подключение к Интернету на устройствах Desktop, Android и iOS. Я читал о трех разных решениях:

  • Пинг что-то (например, Google) - мне совершенно не нравится такое решение, и я читал об ошибках на Android.

  • Application.internetReachability - Согласно документации Unity, эта функция будет определять только то, что у меня есть ВОЗМОЖНОСТЬ подключения к Интернету (это не гарантирует реального соединения).

  • Network.TestConnection() - Если у меня нет подключения к Интернету, мое приложение не работает. Так что это неверно.

Как определить, есть ли у меня интернет-соединение внутри Unity?

Ответ 1

На самом деле я не верю, что Network.TestConnection() является подходящим инструментом для этой работы. Согласно документации, мне кажется, что она предназначена для проверки работоспособности NAT и доступности вашего клиента по IP, но вы хотите проверить, есть ли у вас общее подключение к Интернету.

Вот решение, которое я нашел в Unity ответы пользователя 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
     }));
 }

Вы можете изменить веб-сайт на любой другой или изменить код так, чтобы он возвращал успех, если любой из нескольких сайтов доступен. На самом деле, нет способа проверить подлинность интернет-соединения, не пытаясь подключиться к определенному сайту в интернете, поэтому "пинг" одного или нескольких веб-сайтов, подобных этому, вероятно, будет лучшим выбором для определения интернет-соединения.

Ответ 2

я знаю, что это старо, но, возможно, может помочь вам.

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

Ответ 3

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

Ответ 4

Правильный способ проверить "гарантированное" подключение к Интернету - это сделать обнаружение портативного портала с помощью HTTP-запроса на место с известным содержимым. Это то, как сами операционные системы проверяют, должны ли они предоставить пользователю экран входа в wifi.

Простой пинг или проверка состояния ошибки/успеха запроса www не достаточно, например. страница входа в систему гостиницы/аэропорта wifi может быть возвращена без кода ошибки (вместо желаемой страницы).

Дополнительно, например, на iOS есть новые дополнительные ограничения (безопасность транспорта приложений, позволяющая использовать http только при явном разрешении белого).

Мой актив - простое решение, хотя и не бесплатное: Проверка доступности Интернета в хранилище активов.

Ответ 5

Вы можете попробовать следующее:

 if(Application.internetReachability == NetworkReachability.NotReachable)
    {
        // There is no internet connection
        Debug.Log("Error. Check internet connection!");
    }
  else {// there is internet connection , do stuff here}