WIFI网络没有互联网连接时,.net或Xamarin互联网可用性检查

时间:2019-01-15 11:13:02

标签: android ios .net xamarin timeout

我知道如何检查设备是否有互联网连接是一个大讨论。

我尝试了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时。

有人知道其他方法无法达到给定超时的原因吗?

2 个答案:

答案 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];
    }
}

看看这个: https://github.com/xamarin/Essentials