quickapp_快应用_快应用与h5交互

快应用与h5交互

      • h5跳转到快应用
        • [1] 判断当前环境是否支持组件跳转快应用
        • [2] h5跳转到快应用
          • (1)deeplink方式进行跳转(推荐)
          • (2)h5点击组件(接收参数存在问题)
          • (3)url配置跳转(官方不推荐)
        • 问题-浏览器问题
      • web组件
        • h5页面嵌入快应用
        • 快应用发送消息到h5页面
        • h5页面接收快应用发送的消息
        • h5页面发送消息到快应用
        • 快应用页面接收h5页面传递的消息
        • 通信前提- trustedurl

h5跳转到快应用

[1] 判断当前环境是否支持组件跳转快应用

首先并不是所有机型都支持在h5页面跳转到快应用页面的,因此在进行跳转之前需要先判断当前机型是否支持跳转做好兜底。

  • 首先在网页嵌入如下 js
    <script type="text/javascript" src="//statres.quickapp.cn/quickapp/js/qa_router.min.js"></script>
    
    在网页嵌入如上js后,会给window对象添加一个方法channelReady,可以通过这个方法检验当前机型是否支持跳转;
    if (window.channelReady) {window.channelReady(function (bAvailable) {// bAvailable为true表示允许跳转-跳转// bAvailable为false表示不允许跳转-兜底})
    }else{// 不允许跳转-兜底
    }
    
  • 注意:并不是所有机型都支持如上判断
    在这里插入图片描述
[2] h5跳转到快应用

h5跳转到快应用有以下几种方式

(1)deeplink方式进行跳转(推荐)

可以通过deeplink的形式进行跳转

deeplink支持格式如下:

  • http://hapjs.org/app/<package>/[path][?key=value]
  • https://hapjs.org/app//[path][?key=value]
  • hap://app//[path][?key=value]

参数说明如下:

  • package: 应用包名(与manifest.json中package属性相同),必选

  • path: 应用内页面的 path,可选,默认为首页

  • key-value: 希望传给页面的参数,可选,可以有多个

    快应用内获取参数: 快应用内会自动获取key-value并赋值给public内的同名参数

    若是public内没有同名参数,则不会新增这个属性(相当于🈚️成功获取)

说明:不同的厂商对该能力可能有不同限制,使用前请和相应厂商确认(本人试了华为、荣耀、小米、OPPO的几部测试机,目前并没有发现问题)

流程

 clickmethod(){if (window.channelReady) {window.channelReady(function (bAvailable) {if (bAvailable) {location.href = `https://hapjs.org/app/com.klang.benz/pages/Front?phone=${_this.phone}&channel=${_this.channel}`}else{// 不允许跳转- 兜底(下载对应app)}}}else{// 不允许跳转- 兜底(下载对应app)}}
(2)h5点击组件(接收参数存在问题)

h5点击组件是指:网页开发者可以在其H5 页面中使用快应用官方推荐的点击组件,用于跳转指定快应用。使用点击组件时,必须由用户主动点击方可发起跳转快应用请求。

  • 在网页嵌入如下 js:
    <script type="text/javascript" src="//statres.quickapp.cn/quickapp/js/qa_router.min.js"></script>
    
    在网页嵌入如上js后,会给window对象添加一个方法channelReady,可以通过这个方法检验当前机型是否支持跳转;
    在网页嵌入如上js后,会有一个全局组件 ,可以在页面合适位置插入(样式可自行调整),组件属性如下
    在这里插入图片描述

    tips: 虽然官方文档上说会将参数赋值给public同名属性,但是在真机上很多型号接收不到参数!!!

(3)url配置跳转(官方不推荐)

官方文档不推荐使用url配置跳转方式进行跳转
在这里插入图片描述

  • 在网页嵌入如下js文件
    <script type="text/javascript" src="//statres.quickapp.cn/quickapp/js/routerinline.min.js"></script>
    
    嵌入之后会在window上添加appRouterchannelReady方法,其中channelReady用来检验是否可以跳转,appRouter方法用来进行跳转,具体语法请看文档。
问题-浏览器问题

在进行快应用开发时我最先使用的是“h5点击组件跳转”,发现很多测试机型参数都接收不到,因此我就尝试了“deeplink”方式进行跳转,万幸~这次可以成功拿到参数。

但是此时出现了一个新的问题:有的手机点击跳转中间页的“手动打开”不起作用,如下
在这里插入图片描述
流程相当于被卡在这里了…
但是同样的跳转地址我在快应用预览版->启动应用测试->Deeplink启动测试里面进行跳转就可以成功打开,如下:
在这里插入图片描述
让我不禁怀疑是不是h5里面的跳转写的有问题,经过一番测试发现是浏览器的问题,只有手机自带的浏览器才有下面这个请求提示!!!

总结: 有的机型在点击手动打开时就可跳转到快应用,而有的手机型号点击时无反应,若是在手机自带浏览器会弹出下面打开快应用中心提示,若是其他浏览器则会中断流程…

web组件

作用:用于显示在线的 html 页面(可以嵌入三方页面或者某些不太重要的页面)

h5页面嵌入快应用

可以使用web组件将h5页面嵌入快应用页面中

缺点:打开会比原生慢一点,可能存在白屏现象。

示例:

<web src='https://doc.quickapp.cn/tutorial/framework/lifecycle.html'></web>

渲染结果如下:
在这里插入图片描述

在当前h5页面嵌入快应用之后,快应用就可以和当前h5页面进行消息互通了。

快应用发送消息到h5页面
  • 语法

    this.$element('web').postMessage({message: messageString,success: function(){},fail: function(){}
    })
    
  • 注意点1:message必须为String类型,若是传递其他数据类型如对象,在真机环境会报错

    this.$element('web').postMessage({message: {str: '11111'} // 发送消息为一个对象
    })
    

    上述代码报如下错误

    java.lang.ClassCastException: org.json.JSONObject cannot be cast   to java.lang.String
    at org.hapjs.widgets.Web.f(SourceFile:535)
    at org.hapjs.widgets.Web.invokeMethod(SourceFile:681)
    at org.hapjs.render.b.a.a(SourceFile:30)
    at org.hapjs.render.RootView.applyAction(SourceFile:1134)
    at org.hapjs.render.RootView.applyActions(SourceFile:1120)
    at org.hapjs.render.RootView.a(SourceFile:1105)
    at org.hapjs.render.RootView.e(SourceFile:1088)
    at org.hapjs.render.RootView$a.handleMessage(SourceFile:365)
    at android.os.Handler.dispatchMessage(Handler.java:117)
    at android.os.Looper.loopOnce(Looper.java:205)
    at android.os.Looper.loop(Looper.java:293)
    at android.app.ActivityThread.main(ActivityThread.java:9596)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1204)
    
    this.$element('web').postMessage({message: '111111' //发送的消息为111111
    })
    

    上述代码成功发送

    若是想发送对象类型可以使用 JSON.stringify进行转换但是在接收时要注意使用try catch包裹,因为快应用默认发送的数据是对象类型且并没有stringify

    mounted () {const _this = thisif (window.system && window.system.onmessage) {window.system.onmessage = function (data) {let dtry {d = JSON.parse(data)} catch (err) {}if (d && d.page === 'quick_app') {_this.getInfo(d)}}
    }
    
  • 注意点2:注意发送数据的时机,发送数据一定要等待网页渲染完毕之后,否则在网页端将接收不到数据

    示例:

    我想在页面渲染完成之后发送信息给web页面,因此我选择在快应用的onReady生命周期发送数据

    onReady(){this.$element('web').postMessage({message: '111111'})
    }
    

    但是我发现在网页在拿不到指定的信息

    原因是因为在发送数据的时候web网页还没有渲染完成

    我们可以在web组件的pagefinish事件时传送数据,此事件在web页面渲染完成时触发

     @pagefinish="pagefinish"
    
    pagefinish(){this.$element('web').postMessage({message: '111111'})
    }
    
h5页面接收快应用发送的消息

当网页被嵌入快应用时,默认会向该页面的windows中添加system对象,该对象上存在onmessage方法用于接收快应用中发送过来的消息。
在这里插入图片描述

注意: 该方法只有在快应用嵌套的web页面中可以使用,否则这个方法将不存在(在web页面做好兼容)!

mounted () {if (window.system && window.system.onmessage) {window.system.onmessage = function (data) {console.log('message received: ' + data) // data为快应用发送的消息}}
}
h5页面发送消息到快应用

当网页被嵌入快应用时,默认会向该页面的windows中添加system对象,该对象上存在postMessage方法用于向快应用中发送消息。
在这里插入图片描述

注意: 该方法只有在快应用嵌套的web页面中可以使用,否则这个方法将不存在(在web页面做好兼容)!

// 通过条件判断当前页面是否嵌入在快应用中(做好兼容)
if (xxx) { window.system.postMessage(string)window.system.postMessage(JSON.stringify(obj))
}

tips: postMessage方法的参数为string,若是想传输对象需要使用stringify进行转换

快应用页面接收h5页面传递的消息

在这里插入图片描述

  @message="message"
message(data){// data:{message: messageString, url: urlString}
}
通信前提- trustedurl

web页面可以与快应用通信的前提是:只有在互相信任的页面路径才会允许通信。

web组件的trustedurl属性就是表示可信任的网址的集合。只有 trustedurl 中链接或者 src 链接的网页可以和框架进行双向通信(支持正则表达式)。

有人可能会疑惑:我没有添加trustedurl属性,但是现在通信没有问题? 原因是因为在默认情况下会添加web组件的src属性到trustedurl中。

因此若是URL永远不变,则可以省略,若是路径携带参数或url不是固定值,则必须添加trustedurl!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全(三)-- 网络嗅探及协议分析技术

目标 了解网络嗅探的基本含义了解tcpdump工具的基本用法掌握tcpdump工具抓包保存到文件的方法熟悉wireshark工具的基本用法掌握借助wireshark抓包工具分析简单网络协议的方法 6.1. 概述 网络嗅探是一种常用的数据收集、分析的方法: 黑客常通过网络嗅探获取主机或网络的控制权…

Python智能语音识别语翻译平台|项目后端搭建

Python程序设计基础&#xff0c;第三方库Django、requests、hashlib、pyttsx3等的使用&#xff0c;百度API语音识别业务接口、文本朗读业务接口、翻译业务接口的传入。 01、任务实现步骤 任务描述&#xff1a;本任务利用Django框架搭建智能语音识别与翻译平台的后端&#xff0…

ULAM公链第九十六期工作总结

迈入12月&#xff0c;接下来就是雪花&#xff0c;圣诞&#xff0c;新年和更好的我们&#xff01;愿生活不拥挤&#xff0c;笑容不必刻意&#xff0c;愿一切美好如期而至&#xff01; 2023年11月01日—2023年12月01日关于ULAM这期工作汇报&#xff0c;我们通过技术板块&#xff…

CentOS中安装数据库

1.下载 网址&#xff1a;https://dev.mysql.com/downloads/mysql/ 按如图选择&#xff0c;然后点击Download 这里它让我们登录&#xff0c;我们直接选择不登录&#xff0c;直接下载 2.关闭防火墙 systemctl disable firewalld3.正式安装 切换到/usr/local下 cd /usr/l…

Java数据结构之《哈希查找》(难度系数75)

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题只要我写完…

luceda ipkiss教程 39:修改版图text字体的粗细

通过修改font的line_width就可以修改版图中text字体的粗细&#xff1a; 代码如下&#xff1a; from si_fab import all as pdk import ipkiss3.all as i3class demo(i3.PCell):class Layout(i3.LayoutView):def _generate_elements(self, elems):elems i3.PolygonText(layer…

上海亚商投顾:沪指再度失守3000点 两市超4600只个股下跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日全线调整&#xff0c;沪指再度失守3000点关口&#xff0c;创业板指尾盘跌近2%&#xff0c;北证50…

轨道交通故障预测与健康管理PHM系统的应用

轨道交通是现代城市中不可或缺的交通方式&#xff0c;它为人们提供了快速、高效和可靠的出行方式。然而&#xff0c;由于轨道交通系统的复杂性和高负荷运行&#xff0c;设备故障和运营中断问题时有发生。为了提高轨道交通系统的可靠性和安全性&#xff0c;故障预测与健康管理&a…

nacos启动报错 java.lang.RuntimeException: [db-load-error]load jdbc.properties error

以standalone mode sh startup.sh -m standalone 为例子 启动nacos 报错&#xff1a; Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcatat org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(To…

Siemens-NXUG二次开发-打开与关闭prt文件[Python UF][20231206]

Siemens-NXUG二次开发-打开与关闭prt文件[Python UF][20231206] 1.python uf函数1.1 NXOpen.UF.Part.Open1.2 NXOpen.UF.Part.LoadStatus1.3 NXOpen.UF.Part.Close1.4 NXOpen.UF.Part.AskUnits 2.示例代码3.运行结果3.1 内部模式3.2 外部模式 1.python uf函数 1.1 NXOpen.UF.P…

财报解读:立足海外音视频直播战场,欢聚的BIGO盾牌还需加强?

如今&#xff0c;音视频社交平台出海早已不是新鲜事&#xff0c;随着时间推移&#xff0c;一批“坚定全球化不动摇”的企业也实现突围&#xff0c;站在出海舞台中心。 若提到中国企业出海范本&#xff0c;欢聚集团定是绕不开的存在。作为最早一批出海的中国互联网企业&#xf…

Socket和Http通信原理

Socket是对TCP/IP协议的封装&#xff0c;Socket本身并不是协议&#xff0c;而是一个调用接口&#xff08;API&#xff09;&#xff0c;通过Socket&#xff0c;我们才能使用TCP/IP协议,主要利用三元组【ip地址&#xff0c;协议&#xff0c;端口】。 Http协议即超文本传输协议&a…

ATECLOUD电源自动测试系统打破传统 助力新能源汽车电源测试

随着新能源汽车市场的逐步扩大&#xff0c;技术不断完善提升&#xff0c;新能源汽车测试变得越来越复杂&#xff0c;测试要求也越来越严格。作为新能源汽车的关键部件之一&#xff0c;电源为各个器件和整个电路提供稳定的电源&#xff0c;满足需求&#xff0c;确保新能源汽车的…

[CAD]接下来导出一张高清大图

选择输出-范围&#xff0c;点击右侧绿色画框&#xff0c;划区一个范围 点击输出区域并设置右侧选项。 下图&#xff0c;大大大 页面设置替代-大大大 输出即可&#xff0c;可以说是非常的清晰了

学习springcloud时遇到java: 找不到符号 符号: 方法 getPname()

学习springcloud时异常-java: 找不到符号 符号: 方法 getPname() 学习springcloud时&#xff0c;遇到获取实体类属性值时出现异常。 项目目前分为两个子模块&#xff0c;一个是实体类模块&#xff0c;另一个是应用层。 在查询数据后&#xff0c;打印pname属性时报错&#xff…

LeetCode 每日一题 Day 4

2477. 到达首都的最少油耗 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一个城市&#xff0c;编号从 0 到 n - 1 &#xff0c;且恰好有 n - 1 条路。0 是首都。给你一个二维整数数组 roads &#xff0c;其中 roads[i] [ai,…

【matlab程序】matlab画太极图|阴阳

【matlab程序】matlab画太极图|阴阳 %% 海洋与大气科学; % 时间:20231205; % clear;clc;close all; t=0:1/100000:2pi+0.00001; t1=-pi/2:1/100000:pi/2+0.00001; t2=pi/2:1/100000:3pi/2+0.00001; R=10; r=1; figure plot(Rcos(t),Rsin(t),‘color’,‘k’,‘lin…

Python爬虫技术:如何利用ip地址爬取动态网页

目录 一、引言 二、Python爬虫基础 三、动态网页结构分析 四、利用ip地址爬取动态网页 1、找到需要爬取的动态网页的URL结构 2、构造请求参数 3、发送请求并获取响应 4、解析响应内容 五、实例代码 六、注意事项 七、总结 一、引言 随着互联网的快速发展&#xff0…

并发集合框架

目录 前言 正文 1.集合框架结构 2. ConcurrentHashMap &#xff08;1&#xff09;验证 HashMap 不是线程安全的 &#xff08;2&#xff09;验证 Hashtable 是线程安全的 &#xff08;3&#xff09;验证 Hashtable 不支持并发 remove 操作 &#xff08;4&#xff09…

Windows XP安装SVN软件

SVN全称为SubVersion&#xff0c;是Apache开源软件协议下&#xff0c;一个用于代码分布式管理的工具&#xff0c;其孵化的软件产品是TortoiseSVN&#xff0c;该软件是带图形界面的代码管理工具&#xff0c;类似于Git&#xff0c;多了一个图形界面&#xff0c;方便鼠标操作。  …