我正在开发以编程方式连接到热点的应用。我需要检查连接是否已完全建立,为此,我使用Xamarin.Essentials.Connectivity包和以下方法:
public bool IsWifiConnected()
{
IEnumerable<ConnectionProfile> profiles = Connectivity.ConnectionProfiles;
return profiles.Contains(ConnectionProfile.WiFi);
}
不幸的是,该方法从连接开始建立并且尚未完全准备就绪(仍然握手)开始就返回true。有没有办法检查连接是否已准备就绪?
答案 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");
}