场景描述

网络连接管理提供管理网络一些基础能力,包括获取默认激活的数据网络、获取所有激活数据网络列表、开启关闭飞行模式、获取网络能力信息等功能。

场景一:应用内部获取当前使用网络类型为wifi / 移动数据 及当前网络可连接状态做业务处理

场景二:应用侧需要知道用户当前连接网络状态并作对应的业务处理,如网络断开返回弹框提示、应用中是否按缓存数据展示图片等

场景三:获取当前连接网卡链路地址、DNS地址等信息判断处理用户连接网络位置等应用侧能力

方案描述

场景一:

应用内部获取当前使用网络类型为wifi / 移动数据 及当前网络可连接状态做业务处理

效果图

核心代码

connection.getDefaultNet().then((netHandle: connection.NetHandle) => {
  connection.getNetCapabilities(netHandle).then((data: connection.NetCapabilities) => {
    console.log(JSON.stringify(data));
  })
});

场景二:

应用侧需要知道用户当前连接网络状态并作对应的业务处理,如网络断开返回弹框提示、应用中是否按缓存数据展示图片等

效果图

以wifi切换为例监听成功返回日志,可参考打印日志如图

方案

调用connection模块能力,使用前需要调用register开启监听,监听结束后需要调用unregister关闭当前监听请求,可参考:[connection.netConnect](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-connection-0000001774281662#ZH-CN_TOPIC_0000001774281662__netconnection)

netLost\(网络丢失\) 与 netUnavailable\(网络不可用\)区别,可参考[常见问题Q6](https://wiki.huawei.com/domains/6375/wiki/8/WIKI202404073269607?title=_af4f4c95)

核心代码

//网络状态监听
netCon : connection.NetConnection  = connection.createNetConnection();
connTest(){
  //开启监听事件
  this.netCon.register((error: BusinessError) => {
    console.log(JSON.stringify(error));
  });

  //监听网络是否可用
  this.netCon.on('netAvailable', (data) => {
    console.log("1---- net status netAvailable" + JSON.stringify(data))
  })

  //网络切换监听
  this.netCon.on('netCapabilitiesChange', (data: connection.NetCapabilityInfo) => {
    console.log(JSON.stringify(data));
  });

  //网络丢失()
  this.netCon.on("netLost",(data) => {
    console.log("1---- net lost" + JSON.stringify(data))
  })

  //网络不可用()
  this.netCon.on('netUnavailable', (data) => {
    console.log("1---- net status netUnavailable" + JSON.stringify(data))
  })

  //取消监听
  this.netCon.unregister((error: BusinessError) => {
    console.log(JSON.stringify(error));
  });
}

场景三:

获取当前连接网卡链路地址、DNS地址等信息判断处理用户连接网络位置等应用侧能力

效果图

方案

步骤:1、如需要获取蜂窝网络信息,创建时需要添加关注

      2、调用getConnectionProperties能力获取连接信息

核心代码

//1、 指定蜂窝网络类型获取

// 关注蜂窝网络,需要传入相关网络特征,
let netConnectionCellular = netConn.createNetConnection({
  netCapabilities: {
    bearerTypes: [connection.NetBearType.BEARER_CELLULAR]
  }
});

try {
  const ipAddresses: string[] = []; // 使用数组来收集IP地址
  // 获取所有网络句柄
  const allNets =  connection.getAllNets();

  for (const net of allNets) { // 使用for...of循环
    // 获取当前网络句柄的能力信息
    const netCap =  connection.getConnectionProperties(net);
    if (!netCap.interfaceName.includes('wlan') && Array.isArray(netCap.dnses)) {
      // 确保netCap.dnses是一个数组,然后提取IP地址并添加到数组中
      const dnsAddresses = netCap.dnses.map(NetAddress => NetAddress.address);
      ipAddresses.push(...dnsAddresses);
    }
  }
  // 将IP地址数组转换为逗号分隔的字符串并返回
  return ipAddresses.join(',').toString();
} catch (error) {
  // 打印错误并抛出,或进行其他错误处理
  console.error('获取IP列表时出错:', error);
  // 抛出包含原始错误信息的错误
  throw new Error(`获取IP列表时出错: ${error.message}`);
}


-------

//2、默认网络获取
// 关注默认网络
let netConn = connection.createNetConnection();

connection.getDefaultNet().then((netHandle: connection.NetHandle) => {
  connection.getConnectionProperties(netHandle).then((data: connection.ConnectionProperties) => {
    console.log(JSON.stringify(data));
  })
});

HarmonyOS码上奇行
5k 声望2.5k 粉丝