HarmonyOS鸿蒙Next中webView打开沙箱中的Html文件显示空白页面

HarmonyOS鸿蒙Next中webView打开沙箱中的Html文件显示空白页面 下载解压后打开 index.html 显示空白页面 各种路径都试了
cke_21082.png

cke_228.pngcke_754.pngcke_1223.png


更多关于HarmonyOS鸿蒙Next中webView打开沙箱中的Html文件显示空白页面的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

开发者你好,Web加载沙箱页面出现白屏还请参考下解决Web组件本地资源跨域问题文档排查下,本地html页面中有引入本地js文件时需本地资源跨域才能正常使用。另外也请排查下H5页面使用到哪些功能,确认这些功能涉及的权限是否成功配置。

  • 使用DevTools工具调试前端页面:Web组件支持使用DevTools工具调试前端页面。DevTools是Web前端开发调试工具,支持在电脑上调试移动设备前端页面。
  • 解决Web组件本地资源跨域问题:为了提高安全性,ArkWeb内核禁止file协议和resource协议访问跨域请求。因此,在使用Web组件加载本地离线资源的时候,Web组件会拦截file协议和resource协议的跨域访问。

如上述步骤仍未排查到问题,还请使用DevTools工具调试前端页面,提供下控制台信息以及应用的运行日志信息以便进一步分析。

应用运行日志获取:

  1. 执行:hdc hilog > xxxx.log
  2. 触发定位
  3. 停止脚本执行。
  4. 在目录下获取日志信息。

本地使用6.0.1 Beta1版本DevEco Studio和API 21版本设备未复现您的问题,可以正常加载沙箱路径下的html页面,本地demo如下:

import { webview } from '@kit.ArkWeb';
import { fileIo, fileUri } from '@kit.CoreFileKit';

@Entry
@Component
struct Index {
  @State url: string = '';
  private webviewController: webview.WebviewController = new webview.WebviewController();

  async aboutToAppear(): Promise<void> {
    webview.WebviewController.setWebDebuggingAccess(true);
    // 判断沙箱资源
    let urlPath = 'file://' + this.getUIContext().getHostContext()?.filesDir + '/Index.html';
    let exist = this.exists("/data/storage/el2/base/haps/entry/files/Index.html");
    if (exist) {
      // 沙箱文件存在,把链接缓存沙箱文件
      this.url = urlPath;
    }
  }

  // 判断沙箱文件是否存在
  exists(path?: string): boolean {
    if (path === undefined) {
      return false
    }
    let exists = fileIo.accessSync(path, fileIo.AccessModeType.EXIST)
    return exists
  }

  build() {
    Column() {
      Web({
        src: this.url,
        controller: this.webviewController
      })
        .fileAccess(true)
        .mixedMode(MixedMode.All)
        .javaScriptAccess(true)
        .domStorageAccess(true)
    }
  }
}

更多关于HarmonyOS鸿蒙Next中webView打开沙箱中的Html文件显示空白页面的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


加载本地Web资源方案

方案说明:将Web应用打包到应用的 rawfile 目录中,通过加载本地资源实现离线访问,提升加载速度和用户体验。适合对网络依赖较小的应用场景。

实现步骤

1. 将Web资源放入rawfile目录

将打包后的Web资源(HTML、CSS、JS、图片等)放入 src/main/resources/rawfile/ 目录:

src/main/resources/rawfile/
├── index.html
├── css/
│   └── style.css
├── js/
│   └── app.js
└── images/
    └── logo.png

2. 加载本地Web资源

// Index.ets
import { webview } from '@kit.ArkWeb';

@Entry
@Component
struct LocalWebPage {
  controller: webview.WebviewController = new webview.WebviewController();

  build() {
    Column() {
      // 加载本地HTML文件
      Web({ src: $rawfile('index.html'), controller: this.controller })
        .width('100%')
        .height('100%')
        .domStorageAccess(true)  // 启用DOM存储
        .fileAccess(true)        // 启用文件访问
    }
  }
}
Web({ src: '/text.html', controller: this.controller })
  .fileAccess(true)
  .mixedMode(MixedMode.All)
  .domStorageAccess(true)
  .javaScriptAccess(true)
  .backgroundColor(Color.Pink)

在HarmonyOS Next中,WebView加载沙箱内的HTML文件显示空白,通常是因为文件路径访问权限或资源加载问题。沙箱环境限制了直接文件系统访问,需使用特定API如WebView.loadUrl()配合rawfile路径或ResourceManager获取资源。确保HTML文件置于resources/rawfile目录,并使用正确资源路径格式。检查HTML文件内部资源引用路径是否适配沙箱环境。

在HarmonyOS Next中,WebView加载沙箱内的本地HTML文件显示空白,通常是由于文件访问权限路径引用问题导致的。从你提供的代码片段来看,你尝试了多种路径,但核心问题可能在于沙箱环境下的文件访问机制。

关键问题分析:

  1. 沙箱文件访问权限:HarmonyOS Next的应用沙箱机制严格,WebView默认可能无法直接访问应用私有目录下的文件。你需要显式地将文件授权给WebView
  2. 正确的URI构造:不能直接使用file://路径。必须使用HarmonyOS提供的rawfiledatashare方案来访问资源。

解决方案:

1. 将HTML文件放入rawfile目录

将你的index.html及其相关资源(CSS、JS、图片)放入项目的resources/rawfile目录下。这是访问本地静态资源的推荐方式。

2. 使用正确的URI加载

在代码中,使用rawfile方案来构造URI:

import webview from '@ohos.web.webview';

// 在WebView组件中加载
webview.loadUrl('rawfile:///index.html');

或者,如果你需要更完整的路径:

webview.loadUrl('rawfile:///resources/rawfile/index.html');

3. 检查资源引用路径

确保你的index.html内部引用的CSS、JavaScript或图片等资源也使用了相对路径,并且这些资源文件同样位于rawfile目录下。例如:

<!-- 在index.html中 -->
<script src="./js/main.js"></script>
<link rel="stylesheet" href="./css/style.css">
<img src="./images/logo.png">

4. 启用WebView调试(可选)

在开发阶段,可以启用WebView的调试功能来检查具体的加载错误:

webviewController.setWebDebuggingAccess(true);

然后在Chrome浏览器中打开chrome://inspect来远程调试WebView内容,查看控制台是否有404或权限错误。

总结:

核心步骤是将HTML资源放入rawfile目录,并使用rawfile:///协议进行加载。这确保了WebView在沙箱环境中具有明确的资源访问权限。请检查你的文件是否已正确放置,并修正加载URI。

回到顶部