从零开始开发纯血鸿蒙应用之网络检测
从零开始开发纯血鸿蒙应用
- 〇、前言
- 一、认识 connection 模块
- 1、获取默认网络
- 2、获取网络能力信息
- 3、解析网络能力信息
- 3.1、NetCap
- 3.2、NetBearType
- 二、实现网络检测功能
- 1、申请权限
- 2、获取默认网路的 NetCap 数组
- 三、总结
〇、前言
在之前的博文里,介绍了如何实现简单的 RSS 订阅功能,然而,当时是默认手机处于有网状态的,这显然是有缺陷的,因为手机必然会出现无网络的时候,而鸿蒙 SDK 中 WebView 并没有提供默认的白页,也即当手机无网时,用WebView 实现的页面不会有什么网络状态相关的提示,就更不用说那些显示内容来自网络请求的原生页面。
为了提高用户的体验,APP 必然需要具备网络检测能力,当出现网络连接断开时,可以给出相应的正确提示,那么,在鸿蒙应用中,如何才能实现这一功能呢?下面就像大家介绍如何使用 connection
模块实现网络检测能力。
一、认识 connection 模块
在鸿蒙SDK中,有一个专门负责网络相关功能的 Network Kit,其中又包含名为 @ohos.net.connection的网络连接管理模块,提供管理网络的一些基础能力,如获取默认网络及其网络能力信息
。
使用 connection 模块完成网络检测,可以按照如下步骤进行:
1)获取默认网络对应的 handle 实例
2)利用 NetHandle 获取具体的网络能力信息
3)解析网络能力信息,判断网络类型以及连接状态
1、获取默认网络
想要获取鸿蒙设备的默认网络对应的 handle 实例,可以使用 connection 模块提供的 getDefaultNet
方法,或者使用对应的非异步方法 getDefaultNetSync
;使用异步回调的方法,则需要透传一个回调函数,而 Promise 方式的异步方法和同步方法,都不需要透传参数。
2、获取网络能力信息
这一步,可以使用 connection 模块的 getNetCapabilities
方法或 getNetCapabilitiesSync
方法,这两个方法都需要透传一个 NetHandle 类型的参数,也就是上一步的结果。
getNetCapabilitiesSync 方法或 getNetCapabilities 方法返回的 NetCapabilities 对象中,包含了一下网络能力相关的信息:
主要就是网速、网络连接状态和网络类型。
3、解析网络能力信息
主要就是进一步解析 NetCapabilities 对象中包含的 networkCap 字段和 bearerTypes 字段。
3.1、NetCap
NetCap 对象,表示网络具体能力,是一个枚举值类型
,当前版本的 API 中,一共有如下7个枚举值:
- NET_CAPABILITY_MMS:表示网络可以访问运营商的MMSC(Multimedia Message Service,多媒体短信服务)发送和接收彩信。
- NET_CAPABILITY_NOT_METERED:表示网络流量未被计费
- NET_CAPABILITY_INTERNET:表示该网络应具有访问Internet的能力,该能力由网络提供者设置,但该网络访问Internet的连通性并未被网络管理成功验证。
- NET_CAPABILITY_NOT_VPN:表示网络不使用VPN(Virtual Private Network,虚拟专用网络)。
- NET_CAPABILITY_VALIDATED:表示网络管理通过该网络与华为云地址成功建立连接,该能力由网络管理模块设置。
请注意,网络管理可能会与华为云地址建立连接失败,导致网络能力不具备此标记位,但不完全代表该网络无法访问互联网。另外,对于新完成连接的网络,由于网络正在进行连通性验证,此值可能无法反映真实的验证结果。
- NET_CAPABILITY_PORTAL:表示系统发现该网络存在强制网络门户,需要用户登陆认证,该能力由网络管理模块设置。
- NET_CAPABILITY_CHECKING_CONNECTIVITY:表示网络管理正在检验当前网络的连通性,此值会在网络连接时设置,直到连通性检测结束后不再设置,当此值存在时,NET_CAPABILITY_VALIDATED的值可能不准确。
如果,通过 getNetCapabilitiesSync 方法获取到的 NetCapabilities 对象中的 NetCap 数组,就包含了 NET_CAPABILITY_INTERNET 或 NET_CAPABILITY_VALIDATED,就表明具有访问互联网的能力。
3.2、NetBearType
网络类型,具体分为如下:
二、实现网络检测功能
1、申请权限
由于网络检测功能,需要使用到设备硬件,因此,需要向系统申请权限,具体权限名为 ohos.permission.GET_NETWORK_INFO
,由于该权限是非受限的,可以直接在 entry 模块的 module.json5 文件中配置:
2、获取默认网路的 NetCap 数组
由于网络检测功能,可以作为APP的基础功能,在多个页面中进行使用,因此,可以在 util 模块中,实现一个 NetworkCapabilityUtil
方法,并在其中实现获取 NetHandle 和 NetCapabilities 等对象的方法:
结合 NetworkCapabilityUtil 类的 getNetworkCapability 方法,在需要集成网络检测功能的页面,封装一个进一步判断网络能力的方法:
两相结合,再加上适当的辅助代码,就可以完成网络检测:
像这段代码,可以放在任意一个点击之后需要访问互联网的组件的点击事件处理函数中。而类似网络类型的解析,则可以用如下代码实现:
三、总结
鸿蒙设备如手机,虽然可以同时打开数据开关和WIFI开关,但具体访问网络时,通常只会使用到一种网络连接,默认情况下,WIFI优先级高于手机数据,因此,有WIFI的情况下,默认网络就是WIFI,没有WIFI的情况下默认网络就是手机数据(蜂窝网络)。
特别的,在一些IoT应用场景,如查看监控视频的APP,则需要反其道行之,即当默认网络为无互联网访问能力的时候,才表示与监控的连接是没有断开的,反之,当默认网络变成了可以访问互联网的,则意味着与监控的连接断开了。