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

如何在Xamarin Forms中实现iOS和Android设备的网络(蜂窝/WiFi)测速?

Xamarin Forms 跨平台检测网络连接速度方案

Xamarin Essentials 仅提供网络连通性判断,没有直接的测速API。要检测网络是否缓慢,需通过DependencyService调用原生平台实现,以下是适配iOS和Android的具体方案:


1. 定义跨平台接口

先在共享项目中定义测速服务的接口,统一调用入口:

public interface INetworkSpeedService
{
    // 返回当前网络速度(单位:Kbps)
    Task<long> GetCurrentNetworkSpeedKbps();
}

2. Android 平台实现

利用系统TrafficStats统计流量变化计算速度,或结合网络类型快速判断:

[assembly: Dependency(typeof(NetworkSpeedService_Android))]
namespace YourApp.Droid
{
    public class NetworkSpeedService_Android : INetworkSpeedService
    {
        private long _lastRxBytes;
        private long _lastTimeStamp;

        public async Task<long> GetCurrentNetworkSpeedKbps()
        {
            var connectivityManager = (ConnectivityManager)Android.App.Application.Context.GetSystemService(Context.ConnectivityService);
            var activeNetwork = connectivityManager.ActiveNetworkInfo;
            
            if (activeNetwork == null || !activeNetwork.IsConnected)
                return 0;

            // 获取当前接收流量和时间戳
            long currentRxBytes = TrafficStats.TotalRxBytes;
            long currentTime = Java.Lang.JavaSystem.CurrentTimeMillis();

            // 计算时间差和流量差
            long timeDiff = currentTime - _lastTimeStamp;
            long byteDiff = currentRxBytes - _lastRxBytes;

            // 初始化首次数据
            if (timeDiff <= 0)
            {
                _lastRxBytes = currentRxBytes;
                _lastTimeStamp = currentTime;
                await Task.Delay(1000);
                return await GetCurrentNetworkSpeedKbps();
            }

            // 转换为Kbps:(字节数*8) / (时间秒数*1024)
            long speedKbps = (byteDiff * 8) / ((timeDiff / 1000) * 1024);

            // 更新历史数据
            _lastRxBytes = currentRxBytes;
            _lastTimeStamp = currentTime;

            return speedKbps;
        }
    }
}

Android 权限配置:在AndroidManifest.xml中添加

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

3. iOS 平台实现

结合NWPathMonitor判断网络类型,或发起小文件请求进行实际测速:

[assembly: Dependency(typeof(NetworkSpeedService_iOS))]
namespace YourApp.iOS
{
    public class NetworkSpeedService_iOS : INetworkSpeedService
    {
        public async Task<long> GetCurrentNetworkSpeedKbps()
        {
            var monitor = new NWPathMonitor();
            var currentPath = monitor.CurrentPath;
            monitor.Cancel();

            // 先通过网络类型返回大致速度范围
            if (currentPath.Status != NWPathStatus.Satisfied)
                return 0;

            if (currentPath.UsesInterfaceType(NWInterfaceType.WiFi))
            {
                // WiFi 场景建议实际测速
                return await MeasureActualSpeed();
            }
            else if (currentPath.UsesInterfaceType(NWInterfaceType.Cellular))
            {
                var cellularTech = currentPath.CellularDetails?.RadioAccessTechnology;
                return cellularTech switch
                {
                    NWRadioAccessTechnology.Gsm or NWRadioAccessTechnology.Cdma1x => 10,
                    NWRadioAccessTechnology.Wcdma or NWRadioAccessTechnology.Hsdpa => 500,
                    NWRadioAccessTechnology.Lte => 5000,
                    NWRadioAccessTechnology.Nr => 50000,
                    _ => await MeasureActualSpeed()
                };
            }

            return await MeasureActualSpeed();
        }

        // 发起小文件请求测速(需替换为实际的小资源URL)
        private async Task<long> MeasureActualSpeed()
        {
            var url = new NSUrl("https://example.com/10kb-test-file.txt");
            var request = NSUrlRequest.FromUrl(url);
            var startTime = DateTime.Now;
            
            var response = await NSUrlSession.SharedSession.DataTaskAsync(request);
            var endTime = DateTime.Now;

            if (response.Data == null)
                return 0;

            long bytesReceived = response.Data.Length;
            double timeTaken = (endTime - startTime).TotalSeconds;

            if (timeTaken <= 0)
                return 0;

            return (long)((bytesReceived * 8) / (timeTaken * 1024));
        }
    }
}

iOS 配置:若使用实际测速,需在Info.plist中配置网络权限(或添加特定域名的ATS例外):

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

4. 在共享项目中调用

// 获取测速服务实例
var speedService = DependencyService.Get<INetworkSpeedService>();
long currentSpeed = await speedService.GetCurrentNetworkSpeedKbps();

// 根据业务需求判断是否为缓慢网络,比如低于200Kbps视为缓慢
bool isSlowNetwork = currentSpeed < 200;

补充说明

  • 基于网络类型的判断速度快但精度低,适合快速场景;实际测速精度高但会消耗少量流量,适合需要精确判断的场景。
  • Android的TrafficStats可能在部分设备上需要额外权限,但大部分场景下ACCESS_NETWORK_STATE足够。
  • iOS的NWPathMonitor要求iOS 12+,若需兼容更低版本,可替换为传统的Reachability类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:50:23