HarmonyOS App 中嵌入的 H5 页面安全区无法正确获取,导致界面展示不正常

HarmonyOS
5天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Excelsior_abit

可以在外部获取后,通过桥接传给H5,可以参考如下代码

import web_webview from '@ohos.web.webview';
import business_error from '@ohos.base';

@Entry
@Component
struct Index {
  controller: web_webview.WebviewController = new web_webview.WebviewController();
  ports: web_webview.WebMessagePort[] = [];
  @State receivedFromHtml: string = '';
  @State acceptType: string = ''
  aboutToAppear() {
    // 配置Web开启调试模式
    web_webview.WebviewController.setWebDebuggingAccess(true);
  }
  onPageShow() {
    setTimeout(() => {
      this.getDataFromH5();
    }, 500)
  }
  getDataFromH5() {
    try {
      // 1、创建两个消息端口
      this.ports = this.controller.createWebMessagePorts();
      // 2、在应用侧的消息端口(端口1)上注册回调事件。
      this.ports[1].onMessageEvent((result: web_webview.WebMessage) => {
        if (typeof (result) === 'string') {
          // H5侧传过来的是字符串数据
          this.receivedFromHtml = result;
          this.acceptType = result
          console.log('receivedAccept' + result)
          return this.receivedFromHtml;
        }
        // 必须return数据,否则报错
        return this.receivedFromHtml;
      })
      // 3、将另一个消息端口(端口0)发送到HTML侧,由HTML侧保存并使用
      this.controller.postMessage('init_port', [this.ports[0]], '*');
    } catch (error) {
      let e: business_error.BusinessError = error as business_error.BusinessError;
      console.error(ErrorCode: ${e.code},  Message: ${e.message});
    }
  }
  build() {
    Column() {
      Text(this.acceptType)
        .fontSize(20)
        .margin(20)
      Web({ src: $rawfile('index.html'), controller: this.controller })
        .height('50%')
        .onlineImageAccess(true)
        .imageAccess(true)
    }
    .height('100%')
    .width('100%')
  }
}




<!DOCTYPE html>
  <html>
  <head>
  </head>
  <body>
  <div> 获取input 类型</div>
  <input id="file" onclick="getAcceptType('file')" type="file" accept="image/*">
  <input id="file2" onclick="getAcceptType('file2')" type="file" accept="image/png">
  <input id="file3" onclick="getAcceptType('file3')" type="file" accept="video/mp4">
  </body>
  </html>
  <script>
  var h5Port;
window.addEventListener('message', function (event) {
  if (event.data === '__init_port__') {
    if (event.ports[0] !== null) {
      h5Port = event.ports[0]; // 1. 保存从应用侧发送过来的端口。
    }
  }
})

function getAcceptType(id){
  let acceptType= document.getElementById(id).getAttribute('accept')
  if (h5Port) {
    h5Port.postMessage(acceptType);
  } else {
    console.log('h5Port is null, Please initialize first');
  }
}

</script>
  </html>
分享
微博
QQ
微信
回复
5天前
相关问题
app嵌入H5网页登录储存
455浏览 • 1回复 待解决
HarmonyOS 安全区域问题
36浏览 • 1回复 待解决
HarmonyOS scroll安全区域问题
34浏览 • 1回复 待解决
关于屏幕安全区问题咨询
335浏览 • 1回复 待解决
如何在HarmonyOS调试h5页面
938浏览 • 1回复 待解决