当前位置: 首页 > news >正文

HarmonyOS/OpenHarmony 离线加载web资源,并实现web资源更新

关键词:h5离线包加载、h5离线包更新、沙箱

在上一篇文章中,我们已经介绍了如何将 rawfile 资源文件中的文件数据拷贝到沙箱下,那么该篇文章将介绍如何加载该沙箱目录下的文件资源(此处以打包后的web资源为例),用webview加载出页面,并实现在线获取新包更新web页面的效果。

如何将rawfile中文件拷贝到沙箱中,可参考我的上一篇文章:HarmonyOS/OpenHarmony 如何将rawfile中文件复制到沙箱中

该片文章首先需要介绍我这边准备的 ohosInteractive.zip 离线包,该离线包中仅存放了一个简易的html文件

1. 解压文件

解压zip文件到 webSources 下,因为涉及到文件加载需要一段时间,所以此处的解压建议放到ability生命周期中进行,不建议在页面需要加载时进行解压。

let boxPath = getContext().getApplicationContext().filesDir
let unzipPath = boxPath + "/webSources"
let zipPath = boxPath + "/webSources/ohosInteractive.zip"zlib.decompressFile(zipPath, unzipPath, {}, (err, data) => {if (err != null) {console.error(err.message)} else {console.log("luvi > decompress succeed")fs.unlinkSync(zipPath);}})

2. webview 加载页面

此处的 webUrl 是我们在上一步解压后的文件所在位置,不要写错了。因为当前 web 为加载沙箱文件,所以需要开启 fileAccess 属性,不然 h5 将无法加载。

当文件解压完后,页面就会加载出来了,若不能加载,可连接设备点击 IDE 右下角的 Device File Browser 文件管理,查看文件拷贝和解压是否正确,有些页面需要设置 domStorageAccess 属性才可以加载,此处也不能遗忘。

@Entry
@Component
export struct WebPage {webController: WebviewController = new webview.WebviewController()webUrl: string = "file://" + getContext().getApplicationContext().filesDir + "/webSources/index.html";build() {Column() {Web({ src: this.webUrl, controller: this.webController }).fileAccess(true).domStorageAccess(true).zoomAccess(false).width("100%").height("100%")}}
}

3. h5离线包更新

在第一步时,我们就已经把文件管理在了沙箱中,沙箱中的文件我们可以进行任意操作,如删除或替换,那么我们可以利用该特性进行资源包的在线下载并解压替换,即可实现h5页面的更新。

该 updateResources 方法自行修改按业务调用即可,此处需要注意的是,在app中本地 rawfile 已经存在离线包拷贝解压后需要进行标记或自行检查文件的存在与否,避免在线的离线包下载替换完成后下次启动app再一次把 rawfile 中的文件拷贝到了沙箱中,那么最新的在线包始终不会被更新进沙箱。

3.1 使用 request.downloadFile 下载离线包并解压
updateResources() {// 下载最新离线包let boxPath = getContext().getApplicationContext().filesDirlet unzipPath = boxPath + "/webSources"let zipPath = boxPath + "/webSources/ohosInteractive.zip"try {// 需要手动将 url 替换为真实服务器的 HTTP 协议地址,此处我就不给我的服务器了request.downloadFile(getContext(), {url: "https://xxxxxx/ohosInteractive.zip",filePath: zipPath}).then((data: request.DownloadTask) => {let downloadTask: request.DownloadTask = data;downloadTask.on("complete", () => {// 解压下载的新资源包zlib.decompressFile(zipPath, unzipPath, {}, (err, data) => {if (err != null) {console.error("luvi > " + err.message)} else {console.log("luvi > decompress succeed")// 解压成功后删除源zip包fs.unlinkSync(zipPath);}})console.log("luvi > 新离线包下载成功!")promptAction.showToast({message: "luvi > 新离线包下载成功!重启展示新页面"})})}).catch((err: BusinessError) => {console.error(`luvi> Failed to request the download. Code: ${err.code}, message: ${err.message}`);})} catch (err) {console.error(`luvi > Failed to request the download. err: ${JSON.stringify(err)}`);}}

师傅领进门,修行靠个人,本文章只介绍核心功能,因业务功能而异,所以不提供完整代码了。

相关文章:

HarmonyOS/OpenHarmony 离线加载web资源,并实现web资源更新

关键词:h5离线包加载、h5离线包更新、沙箱 在上一篇文章中,我们已经介绍了如何将 rawfile 资源文件中的文件数据拷贝到沙箱下,那么该篇文章将介绍如何加载该沙箱目录下的文件资源(此处以打包后的web资源为例)&#xf…...

【Spark 实战】基于spark3.4.2+iceberg1.6.1搭建本地调试环境

基于spark3.4.2iceberg1.6.1搭建本地调试环境 文章目录 基于spark3.4.2iceberg1.6.1搭建本地调试环境环境准备使用maven构建sparksql编辑SparkSQL简单任务附录A iceberg术语参考 环境准备 IntelliJ IDEA 2024.1.2 (Ultimate Edition)JDK 1.8Spark 3.4.2Iceberg 1.6.1 使用mave…...

TCP连接建立中不携带数据的报文段为何不消耗序号解析

在TCP协议中,序号的使用是为了确保数据能够按照正确的顺序被接收端重组和确认。每个TCP报文段都有一个序号字段,用于标识该报文段中数据的起始位置相对于整个数据流的偏移量。 初始序号和三次握手 在TCP连接的建立过程中,三次握手是确保双方…...

JS设计模式之状态模式:优雅地管理应用中产生的不同状态

一. 前言 在过去,我们经常使用条件语句(if-else 语句)来处理应用程序中的不同状态。然而,这种方式往往会让代码变得冗长、难以维护,并可能引入潜在的 bug。而状态模式则提供了一种更加结构化和可扩展的方法来处理状态…...

C语言系列4——指针与数组(1)

我们开始C语言的指针与数组 这部分开始进阶了,得反复学习 在开始正题之前,写说一下我们都知道当写一个函数的时候需要进行传参,当实参传递给形参的时候,形参是有独立空间的,那么数组传参又是怎么样的呢,我…...

JS网页设计案例

下面是一个简单的 JavaScript 网页设计案例&#xff0c;展示了如何使用 HTML、CSS 和 JavaScript 创建一个动态的网页。 案例&#xff1a;简单的待办事项列表 1. HTML 部分 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8…...

4.2.1 通过DTS传递物理中断号给Linux

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 4.2.1 通过DTS传递物理中断号给Linux 参考《GICv3_Software_Overview_Official_Release_B》&#xff0c;下表描述了GIC V3支持的INTID(硬件中断号)的范围。 SGI (Software Generated Interrupt)&#xff1a;软…...

常用性能优化方法

在一个Java项目中进行性能优化是至关重要的。性能优化能够提高项目的效率和响应速度&#xff0c;提升用户体验&#xff0c;并且可以节省服务器资源和成本。 首先&#xff0c;性能优化可以确保项目的高效运行。当项目在运行时&#xff0c;性能问题可能会导致应用程序变慢、响应时…...

上海我店:创新模式引领本地生活新风尚

近年来&#xff0c;一个名为“上海我店”的新兴平台在网络空间中迅速崛起&#xff0c;其公布的业绩令人瞩目——在短短三年内&#xff0c;交易流水已跨越百亿大关&#xff0c;并在最近一个月内迎来了近百万的新增注册用户。这一强劲的增长势头&#xff0c;无疑吸引了众多商家和…...

【微服务】前端微服务qiankun 2.x主子应用通信代码片段

主应用代码 主应用工程里面源代码新建qiankun/index.js&#xff0c;通信代码如下&#xff1a; import { initGlobalState } from "qiankun"; import store from /store// 主应用与微应用数据通信 const state {subappClassName: // 设置子应用打包根的class类名 …...

高级java每日一道面试题-2024年9月30日-算法篇-LRU是什么?如何实现?

如果有遗漏,评论区告诉我进行补充 面试官: LRU是什么?如何实现? 我回答: LRU&#xff08;Least Recently Used&#xff09;是一种常用的缓存淘汰策略&#xff0c;用于在缓存满时决定哪些数据应该被移除。LRU算法的基本思想是&#xff1a;当缓存达到其容量上限时&#xff0…...

CSS选择器的全面解析与实战应用

CSS选择器的全面解析与实战应用 一、基本选择器1.1 通配符选择器&#xff08;*&#xff09;2.标签选择器&#xff08;div&#xff09;1.3 类名选择器&#xff08;.class&#xff09;4. id选择器&#xff08;#id&#xff09; 二、 属性选择器&#xff08;attr&#xff09;三、伪…...

vue3自动暴露element-plus组件的ref

自动暴露子组件的方法&#xff0c;注意在TS下&#xff0c;需要自己声明类型&#xff0c;我这里全用any代替了 <template><el-button click"getFocus">获得焦点</el-button><com ref"comRef" /> </template><script setup…...

龙芯+FreeRTOS+LVGL实战笔记(新)——10蜂鸣器嘀嘀嘀

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了完善与优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰写36篇,图1所示),再决定是否订阅。此外,也可以…...

微信小程序-数据模型与动态赋值

首先新建一个小程序项目. 这边有创建基础项目的流程:从0新建一个微信小程序实现一个简单跳转_小白开发小程序源代码-CSDN博客 一共两步: 1.建立页面的 数据模型 和 默认赋值: 默认赋值: 2.接收输入框的新文案,动态替换上面的文案展示 //文件 testUI.js增加方法:onInputChan…...

【Redis】Linux下安装配置及通过C++访问Redis

文章目录 一、Linux Centos 7.0版本下的安装及配置二、通过C访问Redis 一、Linux Centos 7.0版本下的安装及配置 通过源来安装&#xff0c;此次安装的版本为 redis 5.0 的&#xff0c;要通过其他源进行安装&#xff0c;首先安装 scl 源 yum install centos-release-scl-rh再安…...

Python 入门教程(4)数据类型 | 4.7、元组

文章目录 一、元组1、定义2、创建3、访问元组元素4、遍历元组5、 前言&#xff1a; 在Python编程中&#xff0c;元组&#xff08;tuple&#xff09;是一种内置的数据结构&#xff0c;它提供了一种存储多个项目&#xff08;元素&#xff09;的方式&#xff0c;这些项目可以是不同…...

Temu正在吸引越来越多的亚马逊卖家,这个市场Temu蝉联下载榜首

近年来&#xff0c;全球电商市场竞争愈发激烈&#xff0c;各大平台纷纷使出浑身解数&#xff0c;以期在激烈的市场竞争中脱颖而出。 一个来自中国的新兴电商平台——Temu&#xff0c;凭借其独特的市场策略和迅猛的发展势头&#xff0c;正在吸引越来越多的亚马逊卖家。Temu为美国…...

设计原则模式概览

前言 架构设计是软件系统稳定的核心因素&#xff0c;也是程序员晋级架构师的核心因素&#xff0c;建议日常开发过程中针对设计进行深挖与思考 核心 分清楚哪些是稳定的&#xff0c;哪些是变化的&#xff08;一定有稳定跟变化的成分&#xff09;&#xff1b; 捋清楚哪些是类设计…...

高级主题:接口性能测试与压力测试

在现代软件开发中&#xff0c;确保接口的性能和稳定性是非常重要的。随着用户数量的增加&#xff0c;接口需要能够承受高并发请求&#xff0c;从而保证良好的用户体验。本篇文章将介绍如何使用 Python 工具 Locust 进行接口性能测试和压力测试&#xff0c;分析测试结果&#xf…...

ctf show web入门54

这道题目是 ctf.show 中典型的 命令执行&#xff08;RCE&#xff09;绕过 题。虽然看起来过滤非常严密&#xff0c;但只要理清了它的过滤规则&#xff0c;就能找到生存空间。过滤规则拆解 代码通过 preg_match 过滤了以下内容&#xff08;/i 表示不区分大小写&#xff09;&…...

ctf show web 入门46

这道题目是上一题的升级版&#xff0c;过滤条件变得更加苛刻了。我们来分析一下新增的限制以及应对方案。 代码审计与变化 相比之前&#xff0c;正则过滤 preg_match 新增了以下内容&#xff1a; [0-9]&#xff1a;禁止使用任何数字。这意味着 $IFS$9 这种绕过方式失效了。 \$&…...

弯曲波触觉反馈技术:为触摸屏注入真实按键手感的工程实践

1. 项目概述&#xff1a;当触摸屏需要“手感”在2012年&#xff0c;如果你告诉一个家电设计师&#xff0c;未来的微波炉、冰箱或烤箱面板将是一块完全平整、没有任何物理凸起的玻璃或塑料板&#xff0c;他可能会皱起眉头。因为这意味着用户将失去最直接的交互反馈——那个“咔哒…...

计算机视觉十年演进:从手工特征到工业落地实战

1. 计算机视觉的十年跃迁&#xff1a;从手工特征到端到端理解2012年&#xff0c;AlexNet在ImageNet大赛上以15.3%的错误率碾压第二名10.8个百分点&#xff0c;整个计算机视觉领域像被按下了快进键。那会儿我在实验室调试SIFT特征匹配&#xff0c;光是调一个尺度参数就要跑三小时…...

告别PLC!用Python+ModbusTCP玩转FactoryIO仿真(附完整代码与可视化界面)

PythonModbusTCP工业仿真实战&#xff1a;从零构建FactoryIO智能分拣系统 工业自动化领域正在经历一场静默革命——传统PLC的垄断地位首次被通用编程语言打破。去年某国际自动化展会上&#xff0c;一位工程师仅用200行Python代码就复现了某品牌PLC的复杂流水线控制逻辑&#xf…...

从零到一:基于C#与ArcGIS二次开发构建迎风面指数计算插件实战

1. 环境准备与工具搭建 第一次接触ArcGIS二次开发时&#xff0c;我被官方文档里密密麻麻的API吓得不轻。后来发现只要配好环境&#xff0c;开发插件比想象中简单得多。你需要准备三样东西&#xff1a;Visual Studio&#xff08;建议2019或2022社区版&#xff09;、ArcGIS Desk…...

告别混乱XML:Notepad++插件一键美化与智能纠错实战

1. 为什么我们需要XML格式化工具&#xff1f; 作为一个常年和XML打交道的开发者&#xff0c;我太清楚那种打开一个几千行XML文件时的绝望了——所有标签挤在一起&#xff0c;缩进混乱得像被猫抓过的毛线球&#xff0c;想找个节点得用CtrlF来回搜三遍。更可怕的是&#xff0c;有…...

从数据模型到领域驱动设计:数据库抽象与微服务实践的演进

在软件开发的漫长历史中,如何有效地对现实世界进行建模,始终是核心挑战之一。从早期的层次数据库到当今的微服务架构,数据模型作为连接业务需求与技术实现的桥梁,经历了深刻的演变。本文基于对概念数据模型、基本数据模型和面向对象模型的系统探讨,进一步延伸到领域驱动设…...

Muse:现代化多仓库管理工具,提升开发效率与协作体验

1. 项目概述&#xff1a;一个面向开发者的现代化代码库管理工具最近在和一些团队交流时&#xff0c;发现一个挺普遍的现象&#xff1a;大家手头的项目代码库越来越多&#xff0c;有的是自己维护的开源项目&#xff0c;有的是公司内部的核心业务模块&#xff0c;还有一堆实验性的…...

ComfyUI ControlNet Aux预处理器深度解析:从模型下载到性能优化全攻略

ComfyUI ControlNet Aux预处理器深度解析&#xff1a;从模型下载到性能优化全攻略 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux ComfyUI ControlNet Aux…...