通过uni-app的条件编译,分别在H5与APP-PLUS环境上适配返回内容
/**
* 获取 Android 设备当前 IP 地址
* @param _ - 未使用的参数(通常用作占位符)
* @returns {Promise<string>} 返回一个 Promise,解析为设备的本地 IP 地址或空字符串
*/
export const getLocalIpAddress = _ => {
// 条件编译:仅在 H5、APP-PLUS 或 APP 平台下执行
// #ifdef H5 || APP-PLUS || APP
if (window.plus || typeof plus !== 'undefined') {
// 判断是否运行在 HTML5+ 环境(如 App 的 Webview 中)
return new Promise((resolve, reject) => {
// 导入 Android 的 Context 类
const Context = plus.android.importClass('android.content.Context')
// 获取当前运行时的主 Activity
const main = plus.android.runtimeMainActivity()
// 获取连接服务(ConnectivityService)
const cm = main.getSystemService(Context.CONNECTIVITY_SERVICE)
plus.android.importClass(cm)
// 获取当前活动的网络
const network = cm.getActiveNetwork()
if (!network) {
// 如果没有活动的网络连接,则拒绝 Promise
reject('')
return true
}
// 获取网络链接属性
const linkProperties = cm.getLinkProperties(network)
// 获取所有链接地址
let linkAddrs = plus.android.invoke(linkProperties, 'getLinkAddresses')
plus.android.importClass(linkAddrs)
// 遍历所有链接地址
for (var i = 0; i < linkAddrs.size(); i++) {
// 获取网络地址对象
const inetAddr = plus.android.invoke(linkAddrs.get(i), 'getAddress')
// 获取 IP 地址字符串
const ip = plus.android.invoke(inetAddr, 'getHostAddress')
// 过滤掉 IPv6 本地地址(::1)、链路本地地址(fe80)和本地回环地址(127.*)
if (
!ip.includes('::1') &&
!ip.includes('fe80') &&
!ip.startsWith('127.')
) {
// 返回符合条件的第一个 IP 地址
resolve(ip)
return true
}
}
})
} else {
// 如果不在 HTML5+ 环境(如普通浏览器中),返回空字符串
return Promise.resolve('')
}
// #endif
}
注意事项:
- 此代码仅适用于 Android 平台
- 需要应用具有访问网络状态的权限
- 在 iOS 平台或某些 Android 版本上可能需要不同的实现
- 在普通浏览器环境中无法获取本地 IP 地址(出于安全限制)