当前位置:   article > 正文

鸿蒙开发之Web与原生通信_鸿蒙应用中 webview 与原生的交互

鸿蒙应用中 webview 与原生的交互

提示:目前API9、鸿蒙4.0的本地模拟器不支持交互,巨坑。参考踩坑链接

一、原生调用H5方法

在H5中定义一个方法,例如test方法,返回一个字符串"This value is from index.html",如下

  1. <!-- index.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <meta charset="utf-8">
  5. <body>
  6. </body>
  7. <script type="text/javascript">
  8. function test() {
  9. console.log('run javascript test')
  10. return "This value is from index.html"
  11. }
  12. </script>
  13. </html>

原生开发中,使用runJavaScript方法执行H5的方法

  1. //执行js方法
  2. runJavaScriptFunc() {
  3. //注意执行H5方法前需要H5加载完成,在H5加载的onPageEnd方法中设置
  4. if (!this.loadFinish) {
  5. return
  6. }
  7. this.controller.runJavaScript('test()',(err,val) => {
  8. if (err) {
  9. console.log('run javascript err '+ JSON.stringify(err))
  10. return
  11. }
  12. if (val) {
  13. this.message = val
  14. }
  15. console.log('run javascript success '+ val)
  16. })
  17. }

这样,我们在原生开发中就执行了H5的test方法,并且拿到了test方法返回的字符串"This value is from index.html"

二、H5调用原生的方法

首先原生开发需要定义方法和调用对象,如下

  1. testObj = {
  2. test:(data) => {
  3. this.message = '调用了当前方法'
  4. console.log('javascript run test 调用了当前方法')
  5. return 'ArkUI Web Component'
  6. },
  7. toString:() => {
  8. console.log('Web Component toString')
  9. }
  10. }

定义好方法后,需要将方法注册到H5的控制器中

  1. try {
  2. //注册方法到H5的控制器
  3. //参数1:传入调用方法的对象
  4. //参数2:H5在使用该对象的名字
  5. //参数3:方法列表(数组)
  6. this.controller.registerJavaScriptProxy(this.testObj,'objName',['add','test','toString'])
  7. //注册完需要刷新才能生效
  8. this.controller.refresh()
  9. } catch (err) {
  10. console.log('run javascript register err '+ err)
  11. }

H5开发就可以在需要的地方调用这些方法了,如下调用test方法

  1. <!-- index.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <meta charset="utf-8">
  5. <body>
  6. <button style="width:200px;height:200px" type="button" onclick="htmlTest()">Click Me!</button>
  7. <p id="demo"></p>
  8. </body>
  9. <script type="text/javascript">
  10. function htmlTest() {
  11. let str=objName.test();
  12. document.getElementById("demo").innerHTML=str;
  13. console.log('testObj.test result:'+ str)
  14. }
  15. </script>
  16. </html>

三、ets文件的全部代码

  1. import webview from '@ohos.web.webview'
  2. @Entry
  3. @Component
  4. struct OfficialWebPage {
  5. @State message: string = '执行H5的方法'
  6. controller: WebviewController = new webview.WebviewController()
  7. //web加载状态
  8. loadFinish: boolean = false
  9. @State buttonTitle: string = 'register javascript to Window'
  10. //定义对象和方法供H5回调
  11. testObj = {
  12. test:(data) => {
  13. this.message = '调用了当前方法'
  14. console.log('run javascript 调用了当前方法')
  15. return 'ArkUI Web Component'
  16. },
  17. toString:() => {
  18. console.log('Web Component toString')
  19. }
  20. }
  21. build() {
  22. Column() {
  23. Text(this.message)
  24. .maxFontSize(50)
  25. .minFontSize(20)
  26. .fontWeight(FontWeight.Bold)
  27. .onClick(() => {
  28. //执行H5方法
  29. this.runJavaScriptFunc()
  30. // this.message = this.getWebUrl()
  31. })
  32. Button(this.buttonTitle)
  33. .onClick(() => {
  34. try {
  35. //将原生方法注册到H5
  36. this.controller.registerJavaScriptProxy(this.testObj,'objName',['add','test','toString'])
  37. this.controller.refresh()
  38. this.buttonTitle = 'had registered javascript'
  39. } catch (err) {
  40. console.log('run javascript register err '+ err)
  41. }
  42. })
  43. //加载对应的H5
  44. Web({src:$rawfile('index.html'),controller:this.controller})
  45. .javaScriptAccess(true)
  46. .backgroundColor(Color.Yellow)
  47. .onPageEnd(val => { //加载完成
  48. console.log('run javascript page end ')
  49. this.loadFinish = true
  50. })
  51. }
  52. .width('100%')
  53. .height('100%')
  54. }
  55. //获取当前网页加载地址
  56. getWebUrl(): string {
  57. return this.controller.getUrl()
  58. }
  59. //执行js方法
  60. runJavaScriptFunc() {
  61. if (!this.loadFinish) {
  62. return
  63. }
  64. this.controller.runJavaScript('test()',(err,val) => {
  65. if (err) {
  66. console.log('run javascript err '+ JSON.stringify(err))
  67. return
  68. }
  69. if (val) {
  70. this.message = val
  71. }
  72. console.log('run javascript success '+ val)
  73. })
  74. }
  75. }

四、注意点

1、官方API的类名称有误,文档中用的web_webview,其实是webview。已经反馈给官方

2、开头提到的,API9、鸿蒙4.0本地模拟器不支持加载的webview用户交互

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/307000
推荐阅读
相关标签
  

闽ICP备14008679号