Xamarin проверяет соединение Wi-Fi на iOS - PullRequest
0 голосов
/ 26 января 2019

Я разрабатываю приложение, которое программно подключается к точке доступа.Мне нужно проверить, полностью ли установлено соединение, и для этой цели я использую пакет Xamarin.Essentials.Connectivity и следующий метод:

public bool IsWifiConnected()
{
    IEnumerable<ConnectionProfile> profiles = Connectivity.ConnectionProfiles;
    return profiles.Contains(ConnectionProfile.WiFi);
}

К сожалению, метод возвращает значение true с момента начала соединенияустановлен и не полностью готов (все еще рукопожатие).Есть ли способ проверить, что соединение полностью готово?

Ответы [ 2 ]

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

Решение: Если вы хотите проверить доступность Интернета, когда сеть WIFI не имеет подключения к Интернету в формах. Вы можете использовать DependencyService для его реализации. См. Следующий код.

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

using System;
namespace xxx
{
  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("https://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;
        }

    }
  }
}

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

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

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

else
{
  Console.WriteLine("network is unavailable");
} 
0 голосов
/ 26 января 2019

Да, вы можете сделать это и с Xamarin.Essentials.Connectivity. Следуя вашему примеру, вы можете сделать что-то вроде этого:

public bool IsWifiConnected()
{
    var profiles = Connectivity.ConnectionProfiles;
    var access = Connectivity.NetworkAccess;

    if (profiles.Contains(ConnectionProfile.WiFi) && access == NetworkAccess.Internet)
    {
         return true;
    }
    else
    {
         return false;
    }
}

Вы также можете получить событие при изменении профиля подключения или доступа к сети, например:

public class ConnectivityTest
{
     public ConnectivityTest()
     {
         // Register for connectivity changes, be sure to unsubscribe when finished
         Connectivity.ConnectivityChanged += Connectivity_ConnectivityChanged;
     }

     void Connectivity_ConnectivityChanged(object sender, ConnectivityChangedEventArgs  e)
     {
         var access = e.NetworkAccess;
         var profiles = e.ConnectionProfiles;

         if (profiles.Contains(ConnectionProfile.WiFi) && current == NetworkAccess.Internet)
         {
              //Here you can do whatever you want to do when the connection profile is wifi and has internet access.
         }
         else
         {
              //Here you can execute what ever you want if the connection profile is not wifi or has no internet access.
         }
     }
}

Обратите внимание, что все эти примеры вы можете найти в документации Xamarin Essentials на https://docs.microsoft.com/en-us/xamarin/essentials/connectivity?context=xamarin%2Fxamarin-forms&tabs=android

...