.net или проверка доступности интернета Xamarin, когда сеть WIFI не подключена к интернету - PullRequest
0 голосов
/ 15 января 2019

Я знаю, что это большая дискуссия о том, как проверить, доступно ли подключение к Интернету для устройства.

Я пробовал Ping, WebClient и HTTPClient. Я также использую Xamarin Essentials и подключаемый модуль.

Все это работает, просто сделайте запрос в Google или на сервер по вашему выбору, и вы получите ответ или нет. Вы также можете установить тайм-аут на 2 секунды и т. Д.

Но теперь я попал в ситуацию, когда я подключен к WIFI, НО сам WIFI не имеет активного подключения к Интернету.

Так что все, о чем я писал, больше не работало. Проблема в том, что тайм-аут будет как-то игнорироваться. Может быть, ошибка в .net? Я не знаю.

Теперь я нашел одну последнюю вещь:

try
        {
            var request = (HttpWebRequest)WebRequest.Create("https://www.google.com");
            request.KeepAlive = false;
            request.Timeout = 2000;

            using (var response = (HttpWebResponse)await request.GetResponseAsync())
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    //Connection to internet available
                    return true;
                }
                else
                {
                    //Connection to internet not available
                    return false;
                }
            }
        }
        catch (WebException webEx)
        {
            if (webEx.Status == WebExceptionStatus.Timeout)
            {
                return false;
            }
        }
        catch (Exception e)
        {
            return false;
        }

Это было единственное решение, где я получил исключение WebException, когда был достигнут тайм-аут 2 секунды. Во всех других решениях я придерживался более 1 минуты до истечения времени ожидания. Кроме того, когда я установил его на 500 мс или что-то.

Кто-нибудь знал причину, по которой данный тайм-аут не достигается, например, другими методами?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Xamarin Essentials в лучшем решении, поскольку оно предлагает больше возможностей, это пример того, как его использовать

            if (Xamarin.Essentials.Connectivity.NetworkAccess == Xamarin.Essentials.NetworkAccess.Internet)
            {
                IsBusy = true;
                var products = new ObservableRangeCollection<Product>();
                var apiProducts = await _homeService.GetProducts();
                IsBusy = false;
                return apiProducts.ToModel<Product>();
            }
            else
            {
                await DialogService.ShowAlertAsync("No Internet Connection", "Internet", "Ok");
                IsBusy = false;
                return new ObservableRangeCollection<Product>();                   
            }

посмотрите на это: https://github.com/xamarin/Essentials

0 голосов
/ 17 января 2019

Решение:

Вы можете использовать DependencyService для его реализации. См. Следующий код.

в Forms, создайте интерфейс

using System;
namespace app1
{
  public interface INetworkAvailable
  {

    bool IsNetworkAvailable();
  }
}

в проекте iOS

using System;
using Xamarin.Forms;
using Foundation;

[assembly: Dependency(typeof(IsNetworkAvailableImplement))]
namespace xxx.iOS
{
  public class IsNetworkAvailableImplement:INetworkAvailable
  {
    public IsNetworkAvailableImplement()
    {
    }

    bool INetworkAvailable.IsNetworkAvailable()
    {
        NSString urlString = new NSString("http://captive.apple.com");

        NSUrl url = new NSUrl(urlString);

        NSUrlRequest request = new NSUrlRequest(url, NSUrlRequestCachePolicy.ReloadIgnoringCacheData, 3);

        NSData data = NSUrlConnection.SendSynchronousRequest(request, out NSUrlResponse response, out NSError error);

        NSString result = NSString.FromData(data,NSStringEncoding.UTF8);

        if(result.Contains(new NSString("Success")))
        {
            return true;
        }

        else
        {
            return false;
        }

    }
  }
}

Не забудьте разрешить доступ HTTP. Добавьте следующий код в info.plist

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict> 

в проекте Android

using System;
using Java.Lang;
using Xamarin.Forms;

[assembly: Dependency(typeof(IsNetworkAvailableImplement))]
namespace xxx.Droid
{
  public class IsNetworkAvailableImplement:INetworkAvailable
  {
    public IsNetworkAvailableImplement()
    {
    }

    public bool IsNetworkAvailable()
    {
        Runtime runtime = Runtime.GetRuntime();

        Process process = runtime.Exec("ping -c 3 www.google.com");

        int result = process.WaitFor();

        if(result==0)
        {
            return true;
        }

        else
        {
            return false;
        }
    }
  }
}

Теперь вы можете называть это в формах, как

bool isAvailable= DependencyService.Get<INetworkAvailable>().IsNetworkAvailable();

if(isAvailable)
{
  Console.WriteLine("network is available");
}

else
{
  Console.WriteLine("network is unavailable");
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...