安卓端可用plus.android调用WifiManager获取WiFi内网IP,需配置权限并位运算转换;iOS及H5无法直取,须依赖后端从请求头提取IP,最可靠方式是服务端获取客户端真实地址。

uni-app安卓端直接读WiFi局域网IP:用plus.android原生调用
在Android真机上,想拿到设备当前连接WiFi的内网IP(比如192.168.1.105),不能靠网络请求——那是服务器看到的IP,不是手机自己的。必须走原生层读取WifiManager。
前提是你已配置了权限:manifest.json 的 app-plus 节点下加了:
"permissions": {
"network": {
"description": "用于获取网络状态和IP地址"
}
}
然后才能安全调用以下函数:
function getWifiIp() {
if (typeof plus === 'undefined' || plus.os.name !== 'Android') return '';
const MainActivity = plus.android.runtimeMainActivity();
const Context = plus.android.importClass('android.content.Context');
const WifiManager = plus.android.importClass('android.net.wifi.WifiManager');
const wifiManager = MainActivity.getSystemService(Context.WIFI_SERVICE);
const wifiInfo = wifiManager.getConnectionInfo();
const ipAddress = wifiInfo.getIpAddress();
if (!ipAddress) return '';
return (
(ipAddress & 0xff) + '.' +
((ipAddress >> 8) & 0xff) + '.' +
((ipAddress >> 16) & 0xff) + '.' +
((ipAddress >> 24) & 0xff)
);
}
- 这个函数只在Android真机有效,iOS、H5、模拟器均返回空字符串
-
wifiInfo.getIpAddress()返回的是小端序int,必须位运算转成点分十进制,否则你会看到类似16885953这种数字 - 如果手机没连WiFi或WiFi未获取到IP(比如刚连上还没DHCP完成),
getIpAddress()会返回0,需做判空
uni-app通过后端拿公网/局域网IP:FastAPI/Node.js配合uni.request
你想知道用户从哪来?公网出口IP或路由器分配的局域网IP——这类信息前端根本拿不到,必须让后端从HTTP请求头里提取。
后端(以FastAPI为例)要这样写:
@app.get("/get-ip")
async def get_ip(request: Request):
ip = request.headers.get("X-Real-IP") or request.client.host
return {"ip": ip}
uni-app端就普通发请求:
uni.request({
url: 'https://your-api.com/get-ip',
success: res => console.log('设备可见IP:', res.data.ip),
fail: err => console.error('请求失败', err)
});
- 如果安卓和后端在同一WiFi(如本地调试),
res.data.ip就是类似192.168.1.105的局域网IP - 如果安卓走4G/5G或后端部署在云服务器,拿到的就是运营商NAT后的公网IP(如
117.136.xx.xx) - 反向代理(Nginx)必须加
proxy_set_header X-Real-IP $remote_addr,否则request.client.host会变成Nginx本机IP
uni-app iOS无法直接读IP:只能靠服务端或妥协方案
iOS系统封闭,uni-app没有等效于Android WifiManager 的API,plus.android 在iOS完全不可用。
目前只有两种可行路径:
- 走后端接口(同上一节),这是最稳定、兼容所有平台的方式
- 用
uni.getNetworkType()+ 地理位置粗略判断网络环境,但无法获得任何IP值
别信网上“iOS用ifconfig或getifaddrs”的方案——uni-app不提供原生模块扩展入口,也没法打包自定义iOS插件(除非你放弃uni-app,改用纯原生或uni-app+原生混合开发)。
常见错误:为什么总拿到127.0.0.1或::1?
这不是代码写错了,而是环境或配置问题:
- 本地开发时请求
http://localhost:3000,后端看到的request.client.host就是127.0.0.1(因为uni-app请求发给了本机) - 使用HBuilderX真机运行调试,且后端也跑在本机,同样会得到
127.0.0.1——得把后端部署到局域网另一台机器或公网 - 某些Android厂商定制ROM会屏蔽
WifiManager.getConnectionInfo(),返回0,此时只能退回到后端方案 - 微信小程序里调
https://api.ipify.org等第三方接口,在正式版会被拦截(未配置合法域名或HTTPS限制),报错net::ERR_CERT_COMMON_NAME_INVALID或request:fail net::ERR_CONNECTION_REFUSED
真正可靠的IP来源永远只有一个:你的后端服务从TCP连接中提取的客户端地址。其它所有“前端直取”的方式,要么平台受限,要么环境脆弱,要么被系统策略拦死。

















