You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Xam.Plugin.Connectivity v4异步检测网络连接,Ping始终返回false求助

解决Xam.Plugin.Connectivity v4 Ping返回始终为False的问题

我来帮你排查这个Ping始终返回false的问题,结合处理这类Xamarin插件问题的经验,给你几个核心排查方向和解决方案:

1. 先确认Ping目标地址与参数的合理性

  • 确保你Ping的是公开可访问的HTTPS地址(比如"https://www.google.com"),避免使用需要认证的内部服务或HTTP地址(iOS ATS默认会拦截HTTP请求)。
  • 调用Ping时指定正确的端口和超时时间:比如用HTTPS的默认端口443,超时设置为5000毫秒(5秒),太短的超时会导致网络延迟时误判。示例代码:
    var isReachable = await CrossConnectivity.Current.IsRemoteReachable("www.google.com", port: 443, timeout: 5000);
    

2. 检查平台权限配置

这个插件的网络检测依赖平台权限,缺权限会导致Ping失效:

  • Android:在AndroidManifest.xml中必须添加以下权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  • iOS:如果目标地址是HTTP,需要在Info.plist中配置ATS例外(更推荐改用HTTPS):
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    

3. 验证你的CheckConnection方法实现

确保你的apiService.CheckConnection()逻辑正确,没有遗漏关键步骤:

using Plugin.Connectivity;
using Plugin.Connectivity.Abstractions;

public async Task<(bool IsSuccess, string Message)> CheckConnection()
{
    // 先检查设备是否连网
    if (!CrossConnectivity.Current.IsConnected)
    {
        return (false, "设备未连接网络");
    }

    // 再验证是否能访问互联网
    var canReachInternet = await CrossConnectivity.Current.IsRemoteReachable("www.google.com", 443, 5000);
    if (!canReachInternet)
    {
        return (false, "网络已连接,但无法访问互联网");
    }

    return (true, "网络连接正常");
}

4. 检查Login方法的潜在问题

你的Login方法用了async void,这种写法的异常无法被常规捕获,建议改成async Task(如果是按钮点击事件可以保留async void,但要添加异常处理):

private async Task Login() 
{ 
    IsRunning = true; 
    IsEnabled = false; 
    try
    {
        var connection = await apiService.CheckConnection(); 
        if (!connection.IsSuccess) 
        { 
            // 提示用户网络问题
            await DisplayAlert("提示", connection.Message, "确定");
            return;
        }
        // 执行登录逻辑
    }
    catch(Exception ex)
    {
        await DisplayAlert("错误", ex.Message, "确定");
    }
    finally
    {
        IsRunning = false; 
        IsEnabled = true;
    }
}

5. 备选方案:迁移到官方Xamarin.Essentials

如果这个第三方插件问题始终无法解决,推荐改用微软官方的Xamarin.Essentials.Connectivity,它的网络检测更稳定:

using Xamarin.Essentials;
using System.Net.NetworkInformation;

public async Task<bool> CheckInternetAccess()
{
    var networkAccess = Connectivity.NetworkAccess;
    if (networkAccess != NetworkAccess.Internet)
    {
        return false;
    }

    // 可选:Ping验证
    try
    {
        var pingResult = await Ping.SendAsync("www.google.com", 5000);
        return pingResult.Status == IPStatus.Success;
    }
    catch
    {
        return false;
    }
}

内容的提问来源于stack exchange,提问作者fytoahse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:32:14