Xamarin形式检查iOS上的wifi连接

时间:2019-01-26 01:26:05

标签: ios xamarin wifi connectivity

我正在开发以编程方式连接到热点的应用。我需要检查连接是否已完全建立,为此,我使用Xamarin.Essentials.Connectivity包和以下方法:

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

不幸的是,该方法从连接开始建立并且尚未完全准备就绪(仍然握手)开始就返回true。有没有办法检查连接是否已准备就绪?

2 个答案:

答案 0 :(得分:0)

是的,您也可以使用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.
         }
     }
}

请注意,所有这些示例都可以在https://docs.microsoft.com/en-us/xamarin/essentials/connectivity?context=xamarin%2Fxamarin-forms&tabs=android的Xamarin Essentials文档中找到

答案 1 :(得分:0)

解决方案: 如果您要检查WIFI网络在Forms中没有互联网连接时的互联网可用性。您可以使用DependencyService来实现它。请参考以下代码。

  

在表单中,创建一个界面

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