首页 > 其他分享 >鸿蒙开发黑科技:前端页面轻松调用 ArkTS 函数

鸿蒙开发黑科技:前端页面轻松调用 ArkTS 函数

时间:2024-10-17 14:35:34浏览次数:9  
标签:ArkTS 匹配 鸿蒙 前端 param 为空 页面

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。
主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。
本文为原创内容,任何形式的转载必须注明出处及原作者。

在鸿蒙开发中,前端页面(HTML)有时候需要调用应用侧(ArkTS)的函数,例如获取设备信息、调用本地服务、进行复杂的业务逻辑处理等。那么,如何实现前端页面轻松调用 ArkTS 函数呢?

JavaScriptProxy:前端页面的“万能遥控器”

为了实现前端页面调用 ArkTS 函数,我们可以使用 JavaScriptProxy。JavaScriptProxy 是 ArkWeb 提供的一种机制,它允许我们将 ArkTS 对象注册到前端页面,并在前端页面中调用这些对象的函数。
我们可以使用 javaScriptProxy()registerJavaScriptProxy() 接口将 ArkTS 对象注册到前端页面。

  • javaScriptProxy() 接口: 在 Web 组件初始化时调用,将对象注入到前端页面。
  • registerJavaScriptProxy() 接口: 在 Web 组件初始化完成后调用,将对象注册到前端页面。

示例代码:前端页面调用 ArkTS 函数

下面,我们通过一个示例代码来演示如何将 ArkTS 函数注册到前端页面,并在前端页面中调用这些函数。
应用侧代码(ArkTS)

import { webview } from '@kit.ArkWeb';
import { BusinessError } from '@kit.BasicServicesKit';
class testClass {
  constructor() {
  }
  test(): string {
    return 'ArkTS Hello World!';
  }
  toString(param: string): void {
    console.log('Web Component toString' + param);
  }
}
@Entry
@Component
struct WebComponent {
  webviewController: webview.WebviewController = new webview.WebviewController();
  // 声明需要注册的对象
  @State testObj: testClass = new testClass();
  build() {
    Column() {
      // Web组件加载本地index.html页面
      Web({ src: $rawfile('index.html'), controller: this.webviewController})
        // 将对象注入到web端
        .javaScriptProxy({
          object: this.testObj,
          name: "testObjName",
          methodList: ["test", "toString"],
          controller: this.webviewController,
          // 可选参数
          asyncMethodList: [],
          permission: '{"javascriptProxyPermission":{"urlPermissionList":[{"scheme":"resource","host":"rawfile","port":"","path":""},' +
                      '{"scheme":"e","host":"f","port":"g","path":"h"}],"methodList":[{"methodName":"test","urlPermissionList":' +
                      '[{"scheme":"https","host":"xxx.com","port":"","path":""},{"scheme":"resource","host":"rawfile","port":"","path":""}]},' +
                      '{"methodName":"test11","urlPermissionList":[{"scheme":"q","host":"r","port":"","path":"t"},' +
                      '{"scheme":"u","host":"v","port":"","path":""}]}]}}'
        })
    }
  }
}

前端页面代码(HTML)

<!-- index.html -->
<!DOCTYPE html>
<html>
<body>
<button type="button" onclick="callArkTS()">Click Me!</button>
<p id="demo"></p>
<script>
    function callArkTS() {
        let str = testObjName.test();
        document.getElementById("demo").innerHTML = str;
        console.info('ArkTS Hello World! :' + str);
        testObjName.toString(str);
    }
</script>
</body>
</html>

权限配置:确保应用安全

为了确保应用安全,我们可以配置 JavaScriptProxy 的权限。权限配置是一个 JSON 字符串,包含对象级权限和方法级权限。

  • 对象级权限: 指定哪些 URL 可以访问该对象的所有方法。
  • 方法级权限: 指定哪些 URL 可以访问该对象的特定方法。
    通过配置权限,我们可以控制前端页面调用 ArkTS 函数的范围,防止恶意攻击。
    权限配置示例
{
  "javascriptProxyPermission": {
    "urlPermissionList": [
      {
        "scheme": "resource",    // 精确匹配,不能为空
        "host": "rawfile",       // 精确匹配,不能为空
        "port": "",              // 精确匹配,为空不检查
        "path": ""               // 前缀匹配,为空不检查
      },
      {
        "scheme": "https",       // 精确匹配,不能为空
        "host": "xxx.com",       // 精确匹配,不能为空
        "port": "8080",          // 精确匹配,为空不检查
        "path": "a/b/c"          // 前缀匹配,为空不检查
      }
    ],
    "methodList": [
      {
        "methodName": "test",
        "urlPermissionList": [   // Method级权限
          {
            "scheme": "https",   // 精确匹配,不能为空
            "host": "xxx.com",   // 精确匹配,不能为空
            "port": "",          // 精确匹配,为空不检查
            "path": ""           // 前缀匹配,为空不检查
          },
          {
            "scheme": "resource",// 精确匹配,不能为空
            "host": "rawfile",   // 精确匹配,不能为空
            "port": "",          // 精确匹配,为空不检查
            "path": ""           // 前缀匹配,为空不检查
          }
        ]
      },
      {
        "methodName": "test11",
        "urlPermissionList": [   // Method级权限
          {
            "scheme": "q",       // 精确匹配,不能为空
            "host": "r",         // 精确匹配,不能为空
            "port": "",          // 精确匹配,为空不检查
            "path": "t"          // 前缀匹配,为空不检查
          },
          {
            "scheme": "u",       // 精确匹配,不能为空
            "host": "v",         // 精确匹配,不能为空
            "port": "",          // 精确匹配,为空不检查
            "path": ""           // 前缀匹配,为空不检查
          }
        ]
      }
    ]
  }
}

复杂类型传递:不只是基础数据

JavaScriptProxy 不仅支持传递基础数据类型,例如字符串、数字等,还支持传递复杂类型,例如数组、对象等。
示例

  • 传递数组
class testClass {
  constructor() {
  }
  test(): Array<number> {
    return [1, 2, 3, 4]
  }
  toString(param: string): void {
    console.log('Web Component toString' + param);
  }
}
  • 传递对象
class student {
  name: string = '';
  age: string = '';
}
class testClass {
  constructor() {
  }
  test(): student {
    let st: student = { name: "jeck", age: "12" };
    return st;
  }
  toString(param: string): void {
    console.log('Web Component toString' + param);
  }
}

Promise 场景:异步调用

JavaScriptProxy 也支持异步调用,可以使用 Promise 来处理异步结果。
示例

  • 应用侧返回 Promise
class testClass {
  constructor() {
  }
  test(): Promise<string> {
    let p: Promise<string> = new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('执行完成');
        resolve('suc');
      }, 10000);
    });
    return p;
  }
  toString(param: string): void {
    console.log(" " + param);
  }
}
  • 前端页面处理 Promise
function callArkTS() {
  testObjName.test().then((param)=>{testObjName.toString(param)}).catch((param)=>{testObjName.toString(param)})
}

通过使用 JavaScriptProxy,我们可以轻松实现前端页面调用 ArkTS 函数,让开发变得更加灵活和高效。它支持传递各种类型的数据,并支持异步调用,满足了各种复杂的开发需求。

标签:ArkTS,匹配,鸿蒙,前端,param,为空,页面
From: https://www.cnblogs.com/samex/p/18472246

相关文章

  • 全方位探索华为鸿蒙ArkWeb:构建高性能跨平台新闻阅读应用
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、引言:ArkWeb的优势与跨平台应用的......
  • 鸿蒙3D开发
    需求:创建一个按钮。按下按钮后,按钮需缩小并向手指方向倾斜。分析:可以使用 button 组件来实现该功能,其他组件也同样适用。按下按钮时需利用 .ontouch 事件。缩小效果通过 scale 属性的变化实现。为了确定手指的方向,我们可以在 .ontouch 事件中获取相关信息,具体包......
  • ArkTS语言介绍
    ArkTS是一种为构建高性能应用而设计的编程语言。ArkTS在继承TypeScript语法的基础上进行了优化,以提供更高的性能和开发效率。随着移动设备在人们的日常生活中变得越来越普遍,许多编程语言在设计之初没有考虑到移动设备,导致应用的运行缓慢、低效、功耗大,针对移动环境的编程语言优化......
  • 鸿蒙 NEXT 如何使用 @Styles 装饰器来优化我的组件代码?
    大家好,我是V哥。在鸿蒙NEXT开发中,@Styles装饰器是一种非常有用的方法,用于定义可重用的样式。这使得开发者可以将多条样式设置提炼成一个方法,以便在多个组件中复用,从而提高代码的可维护性和可读性。以下是@Styles装饰器的详细用法和应用场景案例。@Styles装饰器的使用说明......
  • 解决WPF WebBrowser当前页面的脚本错误问题
    因为会有用户要求,需要将客户端体积最小化,不能使用新的浏览器控件,只能使用WebBrowser。而WebBrowser是IE内核的,现在很多js的API已经不能识别了。所以会报脚本错误,类似下面这样 解决方法的原理:WebBrowser内部是一个InternetExplorer实例,对应的是IWebBrowser2实例。IWebBrowse......
  • 鸿蒙开发教程主页tab带未读数
    鸿蒙开发教程主页tab带未读数鸿蒙的主页tab比Android的还要简单些,系统有直接提供一、思路:用Tabs和TabContent组件二、效果图:三、关键代码:@Entry@ComponentstructIndex{@StateselectedIndex:number=0//首页未读数@StateunreadNumHome:string='1'......
  • QT实现滑动页面切换
    1.界面实现效果以下是具体的项目需要用到的效果展示。2.简介原理:使用Qt的QPropertyAnimation动画类,这里简单来说就是切换两个界面。这个widget里面可以放很多个待切换的界面,每次切换的时候将当前界面和切换后的界面显示,其他界面都隐藏,然后当前界面移动到主界面之外,下一......
  • ArkTS基础语法:
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......
  • 如何修改网站后台的图片?php网站显示页面修改密码?
    针对你的问题,我将其分为两部分来解答:一是如何修改网站后台的图片;二是如何在PHP网站上实现密码修改功能。1.如何修改网站后台的图片步骤一:访问网站后台登录到你网站的管理员界面或控制面板。步骤二:查找媒体管理区域在大多数内容管理系统(如WordPress)中,会有一个“媒体”、“文件......
  • qt页面设计
    1.Designer设计师(掌握)Designer是Qt内置的一款界面设计程序,设计的界面文件为.ui格式。C++程序员通常不会单独启动Designer,如果要在项目中使用Designer程序,只需要在新建项目时,勾选“创建界面文件”选项。这样的项目自带dialog.ui,双击dialog.ui可以直接使用Designer程序......