我知道如何检查设备是否有互联网连接是一个大讨论。
我尝试了Ping,WebClient和HTTPClient。 我还使用Xamarin Essentials和连接插件。
所有这些东西都在起作用,只需向Google或您选择的服务器发出请求,您是否会得到答案。 您还可以将超时设置为2秒,依此类推。
但是现在我遇到了这样的情况:我已连接到WIFI,但WIFI本身没有有效的互联网连接。
所以我写的所有东西都不再起作用了。问题在于超时将以某种方式被忽略。可能是.net中的错误?我不知道。
现在我发现了最后一件事:
<object data='http://localhost:4000/file.pdf'
type='application/pdf'
width='100%'
height='700px' />
这是到达2秒超时时获得WebException的唯一解决方案。 在所有其他解决方案中,我坚持超过1分钟直到超时。另外,当我将其设置为500ms时。
有人知道其他方法无法达到给定超时的原因吗?
答案 0 :(得分:2)
解决方案:
您可以使用DependencyService
来实现它。请参考以下代码。
在表单中,创建一个界面
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");
}
答案 1 :(得分:0)
Xamarin Essentials是最佳解决方案,因为它提供了更多选项,这是如何使用它的示例
String[] split = str.split(" ");
for ( int i = 0 ; i < split.length ; i++ ) {
if ( split[i].contains("http://") ) {
return split[i];
}
}