微信小程序的postMessage不实时?
最近在开发小程序的时候用到了wx.postMessage()这个API,在使用前我一直认为wx.postMessage()可以在小程序和H5中实时的传递信息,可以依靠这个API开发一个小程序的bridge。但是在实际的开发过程中,我发现wx.postMessage()的表现形式有些出乎意料。
在最近我需要在h5(webview)中向小程序通知一些信息,我首先想到的是之前看到过这个API: https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html。在webview的文档中有描述在h5中如果引用了JSSDK 1.3.2,就可以在H5中调用wx.miniProgram.postMessage:

在实际的使用中相当于在H5中调用如下代码:
wx.miniProgram.postMessage({
data: {
type: 'typename', // 用于区分消息,业务定义,不是微信的格式要求
key: 'keyname' // 数据,业务定义,不是微信的格式要求
}
});
在小程序中可以直接接收,当然是加载webview的page:
<template>
<web-view src="{{dicSrc}}" style="width:200px;background-color: #A04CF7" bindmessage="viewmessageFn"></web-view>
</template> <script>
methods = {
viewmessageFn (e) {
console.log('viewmessageFn, e: ', e)
// yourFn(e.detail.data)}
} </script>
也就是说h5中所有的postMessage最终都会从同一个回调函数通知到小程序的函数定义处,这个函数的名字可以自定义只要是methods中声明过的就可以。所有post的数据都在e.detail.data中,也就是刚才postMessage的数据。
没有接收到?不是实时触发
按理说我应该是完全按照小程序的文档进行,但是调试了很久,在H5触发后,在小程序中的断点一直没有执行到,正当我要放弃的时候,不小心将加载webview的page退回到首页,很意外的是小程序监听postMessage的回调函数触发了。我重新试了几次发现都是在退出页面的时候触发的,我查看了一下文档发现虽然h5中的postMessage会马上提交信息,但是小程序并不会马上受理,在小程序webview上的监听函数,只会在特定时机触发并收到消息:

也就是说,我原本认为的小程序bridge并不能通过这中方式实现,所有的消息都只能等得分享或webview的生命周期结束。这不是一个实时的接口,所以不能用来处理实时的消息,只能是数据上报同步一类的或者页面关闭,向小程序返回一些返回值等“特殊”场景。
消息队列
既然不是实时的触发,那么如何处理H5(webview)活跃期间发起的多个消息提交呢?原来bindmessage返回的数据是一个数组结构,每次h5 postMessage都是向这个数组中push一个对象,这样返回的数组组成了我们看到的 e.detail.data ,也就是说数据不要直接处理,而是要遍历解析一下:
<template>
<web-view src="{{dicSrc}}" style="width:200px;background-color: #A04CF7" bindmessage="viewmessageFn"></web-view>
</template> <script>
methods = {
viewmessageFn (e) {
console.log('viewmessageFn, e: ', e)
if (e.type === 'message' && e.detail && e.detail.data && e.detail.data.length > 0) {
e.detail.data.forEach(function (dataItem) {
if (dataItem.type === 'qbreport' && dataItem.key) {
// todo: yourFn(dataItem.key)
}
}) }
}
} </script>
这个数组,就是postMessage按顺序组成的消息队列。
总结:
微信小程序的webview中postMessage,会把信息(对象)提交到一个消息队列,而这个消息队列只会在特定的场景(组建销毁,或分享)才会触发。不适合实时的数据传递,比较适合数据上报这种场景。使用时对这个消息队列(数组)遍历,最好对每一次postMessage的对象格式进行约定,以方便遍历时的批量处理。
微信小程序的postMessage不实时?的更多相关文章
- 微信小程序客服消息实时通知之最佳实践
我们做微信小程序开发的都知道,只要在小程序页面中添加如下代码即可进入小程序的客服会话界面: <button open-type="contact" >联系我们</ ...
- 微信小程序学习指南
作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 实时视频直播客户端技术盘点:Native、HTML5、WebRTC、微信小程序
1.前言 2017 年 12 月,微信小程序向开发者开放了实时音视频能力,给业内带来广阔的想象空间.连麦互动视频直播技术在 2016 年直播风口中成为视频直播的标配,然而只有在原生的 APP 上才能保 ...
- 微信小程序客服消息开发实战:实时在手机上接收小程序客服消息通知,以及在手机上回复
在微信小程序开发中,可以非常方便的集成客服功能,只需要一行代码便可以将用户引导至客服会话界面.这行代码就是: <button open-type="contact" bind ...
- 微信小程序的坑之wx.miniProgram.postMessage
工作中有个需求是小程序的网页在关闭的时候,需要回传给小程序一个参数 查阅小程序官方文档,有这样一个接口 wx.miniProgram.postMessage ,可以用来从网页向小程序发送消息,然后通过 ...
- 微信小程序使用GoEasy实现websocket实时通讯
不需要下载安装,便可以在微信好友.微信群之间快速的转发,用户只需要扫码或者在微信里点击,就可以立即运行,有着近似APP的用户体验,使得微信小程序成为全民热爱的好东西~ 同时因为微信小程序使用的是Jav ...
- 微信小程序+腾讯云直播的实时音视频实战笔记
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 微信小程序室内地图导航开发-微信小程序JS加载esmap地图
一.在微信小程序里显示室内三维地图 需要满足的两个条件 调用ESMap室内地图需要用到小程序web-view组件,想要通过 web-view 调用ESMap室内地图需要满足以下 2 个条件: 1. 小 ...
- 快速了解微信小程序的使用,一个根据小程序的框架开发的todos app
微信官方已经开放微信小程序的官方文档和开发者工具.前两天都是在看相关的新闻来了解小程序该如何开发,这两天官方的文档出来之后,赶紧翻看了几眼,重点了解了一下文档中框架与组件这两个部分,然后根据简易教程, ...
随机推荐
- 《深入理解Java内存模型》读书总结(转-总结很好)
概要 文章是<深入理解Java内容模型>读书笔记,该书总共包括了3部分的知识. 第1部分,基本概念 包括“并发.同步.主内存.本地内存.重排序.内存屏障.happens before规则. ...
- websocket 和 dwr 做web端即时通信
一.WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有1.1和1.0之说,也就是所谓的k ...
- WPF中使用定时器 DispatcherTimer 做TCP连接中的心跳 HeartBeat
开发过程中经常遇到定时触发的需求,如:TCP/IP连接中,使用心跳包保持连接或检测连接是否已经中断. WPF中有多种定时器: 1.using System.Windows.Threading; 代码如 ...
- 【统计学】英文概念之Mean和Average的区别
通过专门检索和其他课本的比较,得到了如下结论.统计学在分析数据时,需要对数据进行最基础的描述性分析.在众多描述分析的指标中,平均数指标能够反映分布数列集中趋势.但是平均数指标包括两类:一类是数值平均数 ...
- 【转】Spark on Yarn遇到的几个问题
本文转自 http://www.cnblogs.com/Scott007/p/3889959.html 1 概述 Spark的on Yarn模式,其资源分配是交给Yarn的ResourceManage ...
- Java基础之Map的遍历
遍历Map集合,有四种方法: public static void main(String[] args) { Map<String, String> map = new HashMa ...
- 调用Linux的busybox,通过linux命令来获取AndRoidIP
//根据busybox获取本地Mac public static String getLocalMacAddressFromBusybox(){ String result = "" ...
- css best practice for big team and project
推荐查看以下文章: https://segmentfault.com/a/1190000000704006 关于BEM,SMACSS,OOCSS的通俗易懂的介绍 http://philipwalton ...
- tempdb过大事故记录-sqlserver
今天收到预警消息,提示磁盘空间已经满了,感觉很奇怪.刚装的新机器怎么可能会磁盘空间不足.登陆看了看 可以看的到tempdb已经65G的了,而且显示是百分百可用.这个就很奇怪了,为什么会出现这种情况呢. ...
- [使用教程]cocostudio之UI编辑器动画模式
有坑! 1. 使用 (1)点击动画模式按钮,进入动画模式 (2)[关键1]左下角动作列表,右键添加动画 (3)[关键2]渲染区选择要动画的控件,右键编辑动画 * 可以看到最下面多了关键帧 (4)在右边 ...