uni-app无法直接获取系统级实时带宽,必须通过下载已知大小文件并计算耗时来间接估算;uni.getnetworktype仅返回粗粒度网络类型,与实际吞吐量无关,且受信号、限速、后台策略等影响极大。

不能直接获取带宽数值,必须通过测速请求间接估算。uni-app 没有 API 能读取系统级的实时带宽(如 Mbps),uni.getNetworkType 只返回 wifi/4g 这类粗粒度类型,和实际吞吐量无关;真机上所谓“5G”可能只有 2MB/s,而满格 WiFi 也可能因路由器限速卡在 100KB/s。
为什么不能用 networkType 判断真实带宽
这个字段本质是操作系统上报的「接入方式」,不是性能指标:
-
networkType: "5g"不代表你当前能跑满 5G 理论速率——可能正挤在基站下、信号弱、运营商限速或后台占满带宽 -
networkType: "wifi"也不等于“高速”,连的是老旧 802.11n 路由器 or 公司内网限速策略,实测下载可能不到 1MB/s - Android/iOS 均未向应用层开放底层 PHY 层速率接口,uni-app 更不可能绕过系统限制
如何用 uni.request 实现简易带宽估算
核心思路:下载一个已知大小的文件(如 5MB 二进制 blob),记录耗时,算出平均速率。关键是要避开缓存、控制并发、适配弱网:
- URL 必须带时间戳或随机参数(如
?t=1718659240),否则 CDN 或浏览器缓存会返回 0ms,结果失真 - 推荐用
uni.downloadFile而非uni.request,前者原生支持进度回调且不走 JS 内存缓冲,更贴近真实 IO 行为 - 至少测 3 次取中位数,单次结果受 DNS、TCP 握手、服务端排队影响太大
- 超时设为 15s —— 弱网下 5MB 下载可能卡住,别让 UI 长时间假死
示例片段:
const testUrl = 'https://your-cdn.com/speedtest-5mb.bin?t=' + Date.now();
uni.downloadFile({
url: testUrl,
success: (res) => {
if (res.statusCode === 200) {
const duration = Date.now() - startTime;
const speedKbps = Math.round((5 * 1024 * 8) / (duration / 1000)); // 5MB → kbps
}
}
});
真机上容易被忽略的三个硬坑
很多开发者测出来“100Mbps”就以为准了,但线上反馈常是“测速虚高”或“根本起不来”:
- iOS 真机必须关闭 ATS(App Transport Security)或使用 HTTPS 且证书有效,否则
downloadFile直接 fail,错误码net::ERR_CONNECTION_REFUSED - Android 某些厂商(华为 EMUI、小米 MIUI)会拦截后台下载,切到桌面后测速中断,必须在
onShow中启动,且提示用户“请保持前台运行” - 别用本地开发服务器(如
http://localhost:8080)——真机无法解析,得换成局域网 IP 或公网测试地址
最终带宽值只是参考,它反映的是「此刻从你的服务器到该设备的单向下载能力」,不代表上行、延迟、抖动或其它设备表现。如果业务强依赖带宽(比如视频自适应),务必搭配 uni.onNetworkStatusChange 监听切换,并在 WiFi 切 4G 时主动降级,而不是等测速失败才反应。











