在应用页面里嵌套了h5页面,前端页面调用应用侧函数根据日志打印调用不到

场景:

在加载的h5页面里,通过前端页面调用应用侧函数实现在h5页控制退出当前页面或跳转另一个页面等功能。在前端提供的本地环境调试是顺利的,前端页面可以成功调用应用侧函数。但改为正式环境地址后就失效了,根据日志打印是没有走到应用侧函数内的。


准备工作:

开发这个需求的时候参照了下方官方API和Demo,写法逻辑上基本一致了,就差方法名写一模一样了:

​​​​https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/web-in-page-app-function-invoking​

​https://developer.huawei.com/consumer/cn/forum/topic/0207150474615269010?fid=0101610563345550409​


问题:

有没有大佬知道这是什么原因导致的,前端本地环境是生效的,正式环境就行不通了。现在我和前端同事都不知道这种情况如何调试去解决


关键代码:

// 声明需要注册的对象
@State jsMethod: JsCallH5Class = new JsCallH5Class(getContext(this));
private registerJavaScriptProxySucceed: boolean = false;

build() {
    Web({
          src: this.url,
          controller: this.controller,
          renderMode: RenderMode.ASYNC_RENDER // 设置渲染模式:异步渲染(RenderMode.ASYNC_RENDER),仅由Web组件构成,低功耗; 同步渲染模式(RenderMode.SYNC_RENDER)
        })
          .domStorageAccess(true) // 设置是否开启文档对象模型存储接口(DOM Storage API)权限,默认未开启
          .javaScriptAccess(true) //设置是否允许执行JavaScript脚本,默认允许执行。
          .databaseAccess(true) //设置是否开启数据库存储API权限,默认不开启。
          .mixedMode(MixedMode.All) // 允许HTTP和HTTPS混合内容
          .onPageEnd((event) => {
            // 重新注册 JavaScript 接口
            try {
              this.controller.registerJavaScriptProxy(this.jsMethod, "doScanPop", ["backToFinish", "openWeb"], // doScanPop唯一不变
                [] // 可选参数, asyncMethodList
              );
              this.registerJavaScriptProxySucceed = true;
              LogUtil.d(TAG, "registerJavaScriptProxy");
            } catch (error) {
              LogUtil.d(TAG, `ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
            }
          })
          .javaScriptProxy({  // 注册 JavaScript 接口
            object: this.jsMethod, // 包含原生方法的类实例
            name: "doScanPop", // H5中调用的对象名 唯一不变
            methodList: ["backToFinish", "openWeb"], // 暴露的方法列表
            controller: this.controller,
          })
    }
    
 class JsCallH5Class {
  context: Context

  constructor(context: Context) {
    this.context = context;
  }

  backToFinish(): void {
    LogUtil.d(TAG, 'H5触发原生返回')
    router.back(); // 退出当前页面
  }

  openWeb(value: string): void {
    LogUtil.d(TAG, 'JsCallJavaNewH5: ' + value);
    router.pushUrl({ url: Constants.NewWebPageToJump });
  }
}
HarmonyOS Next
2025-07-25 16:06:56
浏览
收藏 0
回答 1
已解决
回答 1
按赞同
/
按时间
全栈若城

双重注册机制冲突! 代码中同时使用了onPageEnd和.javaScriptProxy()事件内的registerJavaScriptProxy(),两种注册方式存在覆盖风险:javaScriptProxy()属于初始化阶段注册,这也是推荐使用的方法;registerJavaScriptProxy()需在Web组件初始化后调用(两种方式都需配合deleteJavaScriptRegister()清理)。

建议保留其中一种注册方式,避免重复注册导致前端页面调用应用侧函数根据日志打印调用不到。

分享
微博
QQ
微信
回复
2025-07-29 16:23:08
相关问题
HarmonyOS h5前端调用应用侧方法
877浏览 • 1回复 待解决
HarmonyOS h5页面缩放问题
2496浏览 • 2回复 待解决
HarmonyOS H5页面使用alert函数不生效
1025浏览 • 1回复 待解决
HarmonyOS webview H5页面事件监听
1899浏览 • 1回复 待解决
HarmonyOS H5页面localstorage为null
1271浏览 • 1回复 待解决
HarmonyOS h5页面怎样判断当前环境?
1186浏览 • 1回复 待解决