菜鸟教程小白 发表于 2022-12-13 05:21:32

android - 当 WIFI 网络没有 Internet 连接时检查 .net 或 Xamarin Internet 可用性


                                            <p><p>我知道如何检查设备是否有可用的互联网连接是一个很大的讨论。</p>

<p>我尝试过 Ping、WebClient 和 HTTPClient。
我还使用 Xamarin Essentials 和连接插件。</p>

<p>所有这些都有效,只需向谷歌或您选择的服务器发出请求,您就会得到答案。
您还可以设置 2 秒的超时时间等等。</p>

<p>但现在我遇到了我连接到 WIFI 但 WIFI 本身没有 Activity 的互联网连接的情况。</p>

<p>所以我写的所有东西都不再起作用了。问题是超时会以某种方式被忽略。也许.net中的错误?我不知道。</p>

<p>现在我发现了最后一件事:</p>

<pre><code>try
      {
            var request = (HttpWebRequest)WebRequest.Create(&#34;https://www.google.com&#34;);
            request.KeepAlive = false;
            request.Timeout = 2000;

            using (var response = (HttpWebResponse)await request.GetResponseAsync())
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                  //Connection to internet available
                  return true;
                }
                else
                {
                  //Connection to internet not available
                  return false;
                }
            }
      }
      catch (WebException webEx)
      {
            if (webEx.Status == WebExceptionStatus.Timeout)
            {
                return false;
            }
      }
      catch (Exception e)
      {
            return false;
      }
</code></pre>

<p>这是在达到 2 秒超时时我得到 WebException 的唯一解决方案。
在所有其他解决方案中,我坚持超过 1 分钟,直到达到超时。另外,当我将其设置为 500 毫秒或其他值时。</p>

<p>有人知道为什么没有达到给定超时的原因,例如使用其他方法吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><strong>解决方案:</strong></p>

<p>您可以使用<code>DependencyService</code>来实现它。引用以下代码。</p>

<blockquote>
<p>in Forms ,create an interface</p>
</blockquote>

<pre><code>using System;
namespace app1
{
public interface INetworkAvailable
{

    bool IsNetworkAvailable();
}
}
</code></pre>

<blockquote>
<p>in iOS project</p>
</blockquote>

<pre><code>using System;
using Xamarin.Forms;
using Foundation;


namespace xxx.iOS
{
public class IsNetworkAvailableImplement:INetworkAvailable
{
    public IsNetworkAvailableImplement()
    {
    }

    bool INetworkAvailable.IsNetworkAvailable()
    {
      NSString urlString = new NSString(&#34;http://captive.apple.com&#34;);

      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(&#34;Success&#34;)))
      {
            return true;
      }

      else
      {
            return false;
      }

    }
}
}
</code></pre>

<p>不要忘记允许 HTTP 访问。在 info.plist 中添加以下代码</p>

<pre><code>&lt;key&gt;NSAppTransportSecurity&lt;/key&gt;
&lt;dict&gt;
    &lt;key&gt;NSAllowsArbitraryLoads&lt;/key&gt;
    &lt;true/&gt;
&lt;/dict&gt;
</code></pre>

<blockquote>
<p>in Android project</p>
</blockquote>

<pre><code>using System;
using Java.Lang;
using Xamarin.Forms;


namespace xxx.Droid
{
public class IsNetworkAvailableImplement:INetworkAvailable
{
    public IsNetworkAvailableImplement()
    {
    }

    public bool IsNetworkAvailable()
    {
      Runtime runtime = Runtime.GetRuntime();

      Process process = runtime.Exec(&#34;ping -c 3 www.google.com&#34;);

      int result = process.WaitFor();

      if(result==0)
      {
            return true;
      }

      else
      {
            return false;
      }
    }
}
}
</code></pre>

<p>现在你可以在表单中调用它,就像</p>

<pre><code>bool isAvailable= DependencyService.Get&lt;INetworkAvailable&gt;().IsNetworkAvailable();

if(isAvailable)
{
Console.WriteLine(&#34;network is available&#34;);
}

else
{
Console.WriteLine(&#34;network is unavailable&#34;);
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于android - 当 WIFI 网络没有 Internet 连接时检查 .net 或 Xamarin Internet 可用性,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/54197727/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/54197727/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: android - 当 WIFI 网络没有 Internet 连接时检查 .net 或 Xamarin Internet 可用性