uni-app 获取 Android 当前IP

通过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
}

注意事项:

  1. 此代码仅适用于 Android 平台
  2. 需要应用具有访问网络状态的权限
  3. 在 iOS 平台或某些 Android 版本上可能需要不同的实现
  4. 在普通浏览器环境中无法获取本地 IP 地址(出于安全限制)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值