HarmonyOS JsBridge分层设计思想

在ArkWeb渲染框架适配方案中(https://developer.huawei.com/consumer/cn/doc/best-practices-V5/bpta-arkweb_rendering_framework-V5#section1672011288193),双端通讯的JSBridge,能否给完整的demo代码参考下。

HarmonyOS
2024-09-05 12:30:37
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
superinsect

推荐的是JavaScriptProxy 样例请参考。

1.ArkTS调用前端函数

this.webviewController.runJavaScript('arkTsCallJs("arkTs调用前端函数")');

2.前端调用ArkTS函数,Web组件初始化调用,使用javaScriptProxy()接口

import web_webview from '@ohos.web.webview'; 
import business_error from '@ohos.base'; 
@Entry 
@Component 
struct WebJsPages { 
  webviewController: web_webview.WebviewController = new web_webview.WebviewController(); 
  //创建传入对象 
  @State arkObj: arkTSClass = new arkTSClass(); 
  @State regProObj: registerProxyClass = new registerProxyClass(); 
 
  aboutToAppear() { 
    // 配置Web开启调试模式 
    web_webview.WebviewController.setWebDebuggingAccess(true); 
  } 
 
  build() { 
    Column() { 
      Button('runJavaScript') 
        .onClick(() => { 
          this.webviewController.runJavaScript('arkTsCallJs("arkTs调用前端函数")'); 
        }) 
      Button('registerJavaScriptProxy') 
        .onClick(() => { 
          try { 
            this.webviewController.registerJavaScriptProxy(this.regProObj, "regObj", ["regTest", "toString"]); 
          } catch (error) { 
            let e: business_error.BusinessError = error as business_error.BusinessError; 
            console.log(`ErrorCode: ${e.code},  Message: ${e.message}`); 
          } 
        }) 
      //看业务需要,Web组件初始化调用,使用javaScriptProxy()接口 
      Web({ src: $rawfile('jsBridge.html'), controller: this.webviewController }) 
        .javaScriptProxy({ 
          object: this.arkObj, 
          name: "arkObj", 
          methodList: ["test"], 
          controller: this.webviewController 
        }) 
    } 
  } 
} 
 
class arkTSClass { 
  constructor() { 
 
  } 
  test(): string { 
    return 'js call ArkTS success!'; 
  } 
} 
 
class registerProxyClass { 
  constructor() { 
 
  } 
  regTest(): string{ 
    console.log("regTest==================") 
    return 'ArkTS  Use registerJavaScriptProxy Success!'; 
  } 
 
  toString(param:String): string { 
    console.log('reg proxy toString' + param); 
    return 'reg proxy toString' + param 
  } 
}

3.registerJavaScriptProxy方式 前端调用ArkTS函数,注意注入之后调用web刷新。

import web_webview from '@ohos.web.webview'; 
import business_error from '@ohos.base'; 
@Entry 
@Component 
struct RegProxyPage { 
  webviewController: web_webview.WebviewController = new web_webview.WebviewController(); 
  //创建传入对象 
  @State regProObj: registerProxyClass = new registerProxyClass(); 
 
  aboutToAppear() { 
    // 配置Web开启调试模式 
    // web_webview.WebviewController.setWebDebuggingAccess(true); 
  } 
 
  build() { 
    Column() { 
      //刷新web 这样web那边才能获得注入对象 
      Button('refresh') 
        .onClick(()=>{ 
          try{ 
            this.webviewController.refresh(); 
          }catch(error){ 
            let e:business_error.BusinessError = error as business_error.BusinessError; 
            console.error(`ErrorCode: ${e.code},  Message: ${e.message}`) 
          } 
        }) 
      //1.注入对象 
      Button('registerJavaScriptProxy') 
        .onClick(() => { 
          try { 
            this.webviewController.registerJavaScriptProxy(this.regProObj, "regObj", ["regTest", "toString"]); 
          } catch (error) { 
            let e: business_error.BusinessError = error as business_error.BusinessError; 
            console.log(`ErrorCode: ${e.code},  Message: ${e.message}`); 
          } 
        }) 
      Web({ src: $rawfile('jsBridge.html'), controller: this.webviewController }) 
    } 
  } 
} 
 
class registerProxyClass { 
  constructor() { 
 
  } 
  regTest(): string{ 
    console.log("regTest==================") 
    return 'ArkTS  Use registerJavaScriptProxy Success!'; 
  } 
 
  toString(param:String): string { 
    console.log('regTest proxy toString' + param); 
    return 'regTest proxy toString' + param 
  } 
}
分享
微博
QQ
微信
回复
2024-09-05 15:36:23
相关问题
jsBridge中如何正确使用this
489浏览 • 1回复 待解决
分层图标处理开发步骤
111浏览 • 1回复 待解决
使用jsBridge拉起弹窗
645浏览 • 1回复 待解决
jsBridge相关问题咨询
108浏览 • 1回复 待解决
HarmonyOS webview有非c-api的jsBridge吗?
149浏览 • 1回复 待解决
关于处理数据库时分层有知道的吗?
2832浏览 • 1回复 待解决
HarmonyOS 主页面设计选型问题
154浏览 • 1回复 待解决
ets与ts需要如何做好分层
428浏览 • 0回复 待解决
组合索引应该如何设计
2278浏览 • 1回复 待解决
列表滑动鸿蒙推荐ux设计
1481浏览 • 1回复 待解决
设计稿单位转换的问题
593浏览 • 1回复 待解决
用户查询消息数据库设计
2568浏览 • 1回复 待解决
tbox车载信息终端设计与组成
3101浏览 • 0回复 待解决
应该如何设计大量线程并发方案
1769浏览 • 1回复 待解决
开发鸿蒙怎么使用less来设计样式
6779浏览 • 1回复 待解决
关于无限步骤的数据库表设计
1726浏览 • 1回复 待解决
有鸿蒙系统界面设计的规范吗?
11841浏览 • 1回复 待解决
设计缓存时是否必加过期时间?
3369浏览 • 1回复 待解决