news 2026/10/10 14:29:39

ArkWeb开发手记02|权限、网络白名单与页面缓存控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ArkWeb开发手记02|权限、网络白名单与页面缓存控制

搞定了 ArkWeb 基础页面搭建,把 Web 组件生命周期做了绑定,解决最头疼的内存泄漏问题。但很多同学照着代码跑通之后,马上遇到新麻烦:H5 页面调用摄像头直接拒绝、上传图片无响应;更换 H5 资源之后 APP 里面还是旧页面,缓存脏数据清不掉;部分内网域名直接拦截打不开。

这些问题大多不是代码逻辑 bug,而是 ArkWeb 的权限、网络访问策略和缓存机制没配置到位。很多新手会误以为只要申请INTERNET网络权限,所有网页就能随便跑。实际 HarmonyOS7 对 ArkWeb 做了严格的访问隔离,网页想调用设备能力、访问指定域名,都需要单独授权;浏览器缓存也需要手动管控,否则上线之后会埋下一堆隐性问题。

本篇手记,我们就把 ArkWeb 配套配置一次性讲透:网页设备权限申请、网络域名白名单配置、页面缓存策略管理,同时演示手动清理缓存、禁用缓存的实战代码。

前置阅读:掌握 ArkWeb 基础页面与生命周期管理 前置环境:DevEco Studio 白色皮肤,HarmonyOS7 SDK

一、先分清两个权限:系统权限 和 ArkWeb 网页权限

很多人在这里混淆,踩坑率极高。

  1. 应用系统权限:在module.json5里面声明,是 APP 整体向操作系统申请权限,比如网络、相机、存储。没有这个声明,APP 根本没有调用硬件的资格。
  2. ArkWeb 网页权限:H5 页面在 Web 内核里发起权限请求(比如 H5 调用摄像头、麦克风、相册),需要我们在 ArkTS 代码中写回调,手动同意或者拒绝网页的请求。 就算你在 module.json5 声明了相机权限,如果 ArkWeb 没有配置权限回调,H5 发起摄像头调用时,依然会直接被拦截,H5 拿不到摄像头流。

类比理解:系统权限相当于小区给你办了门禁卡,允许你进入小区;ArkWeb 权限回调相当于家里的房门,H5 访客想进房间,你需要开门放行。门禁有了,房门不开,访客依旧进不来。

1.1 module.json5 基础权限配置

首先在 module.json5 中,除了 INTERNET,把 H5 常用能力对应的系统权限提前声明。

"requestPermissions": [ { "name": "ohos.permission.INTERNET" }, { "name": "ohos.permission.CAMERA" }, { "name": "ohos.permission.MICROPHONE" }, { "name": "ohos.permission.READ_MEDIA" } ]

注意:ohos.permission.READ_MEDIA用于 H5 选择相册图片。HarmonyOS7 不再推荐旧的 READ_EXTERNAL_STORAGE,媒体文件读取统一使用 READ_MEDIA。

1.2 ArkWeb 网页权限回调代码

Web 组件提供onPermissionRequest回调,专门拦截 H5 发起的权限申请,我们在这里做判断,决定允许或者拒绝。

Web({ src: "https://example.com", controller: this.webController }) .width('100%') .height('80%') .onPermissionRequest((permissionReq) => { console.info("H5发起权限请求,类型:", permissionReq.getPermissionType()) // 允许H5使用摄像头、麦克风 if(permissionReq.getPermissionType() === WebPermissionType.CAMERA || permissionReq.getPermissionType() === WebPermissionType.MICROPHONE){ permissionReq.grant(); }else{ permissionReq.deny(); } })
  • grant():放行,允许 H5 使用该设备能力
  • deny():拒绝本次权限申请

踩坑提醒:这个回调只处理 H5 网页发起的权限。原生页面弹窗申请权限,还是要用requestPermissionFromUser,不要混在一起。

二、网络域名白名单:网络安全策略配置

HarmonyOS7 默认开启网络安全限制。如果访问 HTTP 非加密地址,或者访问未加入白名单的内网域名,网页直接拦截,报网络错误。很多人本地测试内网 H5,死活打不开网页,根源就是没有配置域名白名单。

网络安全配置写在module.json5的networkSecurity节点,支持配置:允许明文 HTTP 访问、域名白名单。

"networkSecurity": { "cleartextTraffic": { "allow": true }, "domainRules": [ { "domains": ["192.168.1.*", "localhost"], "cleartextTraffic": { "allow": true } }, { "domains": ["*.example.com"], "cleartextTraffic": { "allow": false } } ] }

参数说明:

  1. cleartextTraffic allow:true:允许 HTTP 明文请求;生产环境公网域名建议关闭,只给内网、本地调试开启。
  2. domainRules域名规则:支持通配符*.xxx.com,可以针对不同域名单独控制是否允许 HTTP。

重要提醒:上线正式包,公网业务域名不要开启 cleartextTraffic,尽量全部使用 HTTPS,避免通信内容被抓包篡改。内网调试环境才打开 HTTP 明文访问。

常见坑

配置完白名单之后,修改 module.json5,必须卸载模拟器 / 真机上旧应用,重新编译安装。缓存的应用配置不会自动更新,很多人改完配置直接热重载,结果一直不生效,白白浪费大量调试时间。

三、ArkWeb 页面缓存机制与管控

ArkWeb 内核自带缓存,会自动保存网页资源:JS、CSS、图片、HTML。好处是二次打开页面加载更快;坏处是发布 H5 新版本之后,用户 APP 依旧加载旧缓存页面,出现版本不一致、bug 无法修复,也就是大家常说的缓存脏数据。

我们有三种缓存控制方案:

  1. 全局关闭缓存(调试阶段常用)
  2. 加载页面时禁用本次请求缓存
  3. 代码主动清理全部 Web 缓存

3.1 全局缓存设置:WebController.setCacheMode

通过控制器设置缓存模式,支持 4 种模式:

  • CacheMode.Default:默认,根据 http header 自动判断是否缓存(线上默认)
  • CacheMode.None:不使用缓存,全部从网络拉取(调试首选)
  • CacheMode.Online:优先网络,网络失败才读缓存
  • CacheMode.Offline:优先本地缓存,离线模式
aboutToAppear() { // 调试环境,禁用缓存,每次都拉最新资源 this.webController.setCacheMode(CacheMode.None); }

注意:setCacheMode 建议在页面初始化 aboutToAppear 调用,不要在页面加载中途修改,中途修改容易失效。

3.2 主动清除缓存代码

产品版本更新的时候,我们可以提供一个 “清除网页缓存” 按钮,一键清理 ArkWeb 内核缓存。

Button("清空Web缓存") .margin(10) .onClick(async ()=>{ await this.webController.clearCache(true); // true:同时清除cookie,false只清理资源缓存 console.info("ArkWeb缓存清理完成"); })

clearCache(boolean includeCookie):参数 true,清理缓存同时删除网页 Cookie;false 只清理静态资源。

四、整合完整代码(权限回调 + 缓存控制 + 生命周期)

把《Web 组件 H5 加载与生命周期管理》的生命周期代码 + 权限回调 + 缓存设置整合在一起,完整可直接运行:

import { Web, WebController, WebLoadStatus, WebPermissionType, CacheMode } from '@kit.ArkWeb'; import { router } from '@ohos/router'; @Entry @Component struct ArkWebConfigPage { private webController: WebController = new WebController(); @State loadStatus: string = "待加载"; @State hasError: boolean = false; aboutToAppear() { console.info("aboutToAppear:页面准备渲染"); // 设置缓存模式,调试环境禁用缓存 this.webController.setCacheMode(CacheMode.None); } onPageShow() { console.info("onPageShow 页面前台"); this.webController.resume(); } onPageHide() { console.info("onPageHide 页面后台"); this.webController.pause(); } aboutToDisappear() { console.info("aboutToDisappear 页面销毁"); this.webController.destroy(); } build() { Column() { Text(`H5加载状态:${this.loadStatus}`) .fontSize(16) .margin({top:10}) Button("清空Web缓存") .margin(10) .onClick(async ()=>{ await this.webController.clearCache(true); }) if(this.hasError){ Column(){ Text("页面加载失败") .fontSize(20) .margin(10) Button("重新加载") .onClick(()=>{ this.hasError = false; this.webController.reload(); }) } } Web({ src: "https://example.com", controller: this.webController }) .width('100%') .height('70%') .onLoadStatusChange((status: WebLoadStatus) => { switch(status) { case WebLoadStatus.StartLoading: this.loadStatus = "开始加载H5页面"; this.hasError = false; break; case WebLoadStatus.FinishLoading: this.loadStatus = "页面加载完成"; this.hasError = false; break; case WebLoadStatus.ErrorLoading: this.loadStatus = "页面加载失败,请检查网络/域名白名单"; this.hasError = true; break; } }) .onErrorReceive((err)=>{ console.error("H5加载异常", JSON.stringify(err)); this.hasError = true; }) .onPermissionRequest((permissionReq) => { console.info("H5权限请求", permissionReq.getPermissionType()) // 放行摄像头、麦克风 if(permissionReq.getPermissionType() === WebPermissionType.CAMERA || permissionReq.getPermissionType() === WebPermissionType.MICROPHONE){ permissionReq.grant(); }else{ permissionReq.deny(); } }) } .width('100%') .height('100%') } }

五、实战测试,验证配置效果

测试 1:H5 相机权限

写一个简单 H5 页面,调用 navigator.mediaDevices 获取摄像头。

  1. module.json5 声明 CAMERA 权限
  2. ArkWeb 增加 onPermissionRequest 放行相机权限
  3. 真机打开页面,H5 正常唤起摄像头;注释 grant 改为 deny,H5 获取媒体流直接报错。

注意:模拟器没有摄像头硬件,权限测试必须真机测试,模拟器只能做代码语法校验。

测试 2:内网域名访问

配置 networkSecurity 白名单,填写本地局域网 IP,开启 cleartextTraffic。

  • 配置正确:内网 H5 页面正常打开;
  • 不配置白名单:页面直接加载失败,报网络拦截。

测试 3:缓存验证

  1. CacheMode.Default,打开页面,修改服务端 H5 页面内容,再次访问,展示旧页面(缓存生效)
  2. 切换 CacheMode.None,刷新页面,直接拿到最新 H5 内容
  3. 点击清空缓存按钮,清理所有资源与 Cookie

这里有个坑:clearCache只能清理 ArkWeb 内核的缓存。H5 前端代码里 localStorage、sessionStorage 不属于这个缓存,不会被 clearCache 清除。如果 H5 业务数据存在 localStorage,要让前端 H5 自己清理,原生这边无法直接清除。很多同学误以为 clearCache 能清理 H5 本地存储,结果上线踩坑。

六、本篇小结

本篇我们搞定 ArkWeb 配套的三大核心配置:网页设备权限、网络域名白名单、页面缓存管理。很多 ArkWeb 线上问题,根源都在这些配置项,不是业务代码问题。

知识点回顾

  1. 区分 APP 系统权限(module.json5)和 ArkWeb 网页权限(onPermissionRequest 回调),二者缺一不可;
  2. HarmonyOS7 网络安全策略默认拦截未配置的内网域名、HTTP 明文请求,内网调试需要配置 networkSecurity 域名白名单;
  3. CacheMode 四种缓存模式,调试优先 CacheMode.None,生产环境默认 Default;
  4. webController.clearCache () 清理 Web 资源缓存 + Cookie,但无法清除 H5 localStorage/sessionStorage;
  5. 修改 module.json5 配置之后,需要卸载重装应用,热重载不会更新安全配置。

实践指南:

  1. 搭建本地简易 HTTP 服务,在内网放一个 H5 页面,配置域名白名单,在 ArkWeb 访问内网页面;
  2. 写 H5 的摄像头调用页面,真机测试 onPermissionRequest 放行 / 拒绝两种情况的效果;
  3. 分别切换 CacheMode.Default 和 CacheMode.None,观察页面资源缓存差异。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 14:29:22

[鼎捷 ERP] BOM批量导入、工单和采集序列号相关问题排错合集(二)

目录 E10-P-MFG-013 BOM导入主件品号或工厂错误E10-P-MFG-014 BOM变更与导入报错处理E10-P-MFG-015 工单ICD信息字段无法选择E10-P-MFG-016 库存改制入库单审核提示未采集序列号E10-P-MFG-017 生产入库单提示须存在且未审核E10-P-MFG-018 生产入库单序列号采集未完成E10-P-MFG-…

作者头像 李华
网站建设 2026/10/10 14:28:29

租赁门店押金自动原路退回系统设计与实现:以汉服礼服为例

1. 汉服礼服租赁,为什么押金原路退回是个“硬需求”前阵子帮一个做汉服体验馆的朋友梳理订单流程,聊到押金这块,他给我看后台的退款记录,基本上每周都有几笔退款纠纷。有的是顾客说“押金怎么还没到账”,有的是“我当时…

作者头像 李华
网站建设 2026/10/10 14:28:20

英语六级翻译纲领

目录 : 🌈 “主” 和 “顺” 原则 🌈 局部倒译法 🌈 With/As 来相助 🌈 句子衔接 第一讲 “主” 和 “顺” 原则 一. 主语的选择决定了译文的语态 ( 主动还是被动 ) 比如 : 人们经常夸方世玉很帅 主动语态 : People often com…

作者头像 李华
网站建设 2026/10/10 14:25:23

数据结构(链表)

链表 链表是节点这种存储结构加上对节点的一套操作方法 目录 节点操作方法 add方法remove方法insert方法contains方法测试 节点 节点的结构包括存储的数据类型以及指向下一个节点的指针。 public class MyLinkedList {//节点属性:节点 指向下一个的指针publi…

作者头像 李华
网站建设 2026/10/10 14:24:31

滑动窗口算法从原理到模板:固定窗口、可变窗口与单调队列优化

如果说算法题里有什么是“背过模板还得跪”的,滑动窗口绝对算一个。很多朋友刷题的时候都遇到过这种情况:明明把模板抄下来了,也知道left和right两个指针怎么挪,但题目稍微一变就晕——比如窗口什么时候收缩,收缩到什么…

作者头像 李华