H5嵌入APP后,通过window.WebViewJavascriptBridge原生APP与H5之间交互小白基础_h5小白攻略

原生APP跳转到H5页面时,往往需要携带一些用户信息,之前做法是在跳转的地址中拼接H5页面需要的参数,现在通过window.WebViewJavascriptBridge悄悄的进行数据交互。下面从H5的角度记录交互思路:1:安卓环境和ios环境稍微有点不同,需要根据navigator.userAgent判断一下当前环境2:仍然是APP环境不同,安卓需要进行兼

H5嵌入APP后,通过window.WebViewJavascriptBridge原生APP与H5之间交互小白基础

原生APP跳转到H5页面时,往往需要携带一些用户信息,之前做法是在跳转的地址中拼接H5页面需要的参数,现在通过window.WebViewJavascriptBridge悄悄的进行数据交互。

H5嵌入APP后,通过window.WebViewJavascriptBridge原生APP与H5之间交互小白基础_h5小白攻略

下面从H5的角度记录交互思路:

1:安卓环境和ios环境稍微有点不同,需要根据navigator.userAgent判断一下当前环境

2:仍然是APP环境不同,安卓需要进行兼容性判断,如果不存在window.WebViewJavascriptBridge变量,需要手动添加Dom的WebViewJavascriptBridgeReady事件监听;
ios同样需要判断是否存在window.WebViewJavascriptBridge变量,如果不存在继续判断window.WVJBCallbacks变量,如果仍然不存在,则手动赋值为H5回调,然后document.createElement(‘iframe’)插入document中,随即移除。

3:以上处理完成后,通过WebViewJavascriptBridge变量来注册【事件】以便APP能监听到并执行相应操作

4:3中需要对安卓系统进行init处理,如果是安卓系统,注册事件之前需要先调用WebViewJavascriptBridge.init()

方法(注意: 一个页面整个生命周期过程中,只能进行一次init()否则会报错,我的做法是通过一个全局变量来判断是否初始化过)

//针对安卓和ios系统,对window.WebViewJavascriptBridge进行兼容性处理
function setupWebViewJavascriptBridge(callback) {
	var u = navigator.userAgent;
	var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
	var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
	if (isAndroid) {
		if (window.WebViewJavascriptBridge) {
			callback(WebViewJavascriptBridge)
		} else {
            //添加dom事件
			document.addEventListener(
				'WebViewJavascriptBridgeReady',
				function () {
					callback(WebViewJavascriptBridge)
				},
				false
			);
		}
			
	}
	if (isiOS) {
		console.log('isiOS')
		if (window.WebViewJavascriptBridge) {
			return callback(WebViewJavascriptBridge);
		}
		if (window.WVJBCallbacks) {
			return window.WVJBCallbacks.push(callback);
		}
		window.WVJBCallbacks = [callback];
		var WVJBIframe = document.createElement('iframe');
		WVJBIframe.style.display = 'none';
		WVJBIframe.src = 'https://__bridge_loaded__';
		document.documentElement.appendChild(WVJBIframe);
		setTimeout(function () {
			document.documentElement.removeChild(WVJBIframe)
		}, 0)
	}

}
//封装方法,key:跟原生定义好的要捕获的名称, callback:原生捕获后执行的回调,此处可以写H5的后续执行方法,params:对象,要传给原生的参数
var setupWebViewBridge = function (key, callback, params) {
	setupWebViewJavascriptBridge(function (bridge) {
		var u = navigator.userAgent;
		var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
		var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
        //自己定义的全局变量,用来判断当前页面中安卓系统是否进行过一次初始化,页面卸载时取消赋值
		if (!window.hadCalledWindow_WebViewJavascriptBridge ) {
			if (isAndroid) {
				window.hadCalledWindow_WebViewJavascriptBridge = true 
				bridge.init(function (message, responseCallback) {
					console.log('JS got a message', message);
					var data = {
						'Javascript Responds': '测试中文!'
					};
 
					if (responseCallback) {
						console.log('JS responding with', data);
						responseCallback(data);
					}
				});
			}
		}
		bridge.callHandler(
			key,
            //安卓系统必须传一个参数,否则捕获不到,因此,默认传入一个_x_变量 
			JSON.stringify({
				...params,
				_x_: 1,
			}),
			callback
		);
 
	})
}

 

原生APP里,注册要捕获的方法: 

bridge.registerHandler('jsbridge_showMessage', function (data, responseCallback) {
   showResponse(data);
});
海计划公众号
(0)
上一篇 2020/03/20 06:49
下一篇 2020/03/20 06:49

您可能感兴趣的内容

  • HTML中name、id、class的区别介绍使用教程_区别基础指南

    在一个页面中,有许多的控件(元素或标签)。为了更方便的操作这些标签,就需要给这些标签标识一个身份牌。在HTML中有name、id、class等属性区分一个元素,下面我们就来看一下这几种属性的区别。1. name指定标签的名称。1.1 格式1.2 应用场景①form表单:name可作为转

    2020/03/20
  • HTML5新增和废弃的标签小白基础_标签小白常识

    一、废弃的标签以下的 HTML 4.01 元素在HTML5中已经被删除,虽然浏览器为了兼容性考虑都还支持这些标签,但建议使用新的替代标签,矛盾的是老浏览器对新标签的支持度又不够,视项目的受众对象而定了。1、能用CSS代替的元素这些元素包含basefont、big、center、font、s、strike、tt、u。这些元素纯粹是为页面展示用的,表现的内容应该

    2020/03/30
  • 深入研究Js全局变量基础知识_变量基础入门

    本文的内容比较硬核,我们一起来看下 JavaScript 全局变量的底层机制到底是怎样的。文章会涉及脚本作用域、全局对象等概念。作用域变量的 词法作用域 (简称 作用域 )是程序中可以访问它的区域。JavaScript 的作用域是静态的(在运行时不会改变),并可以嵌套——例如:function func() { // (A)const aVariable =

    2020/03/23
  • flex 增长与收缩入门百科_布局零基础入门

    flex:auto 将增长值与收缩值设置为1,基本大小为 auto 。flex:none. 将增长值与收缩值设置为0,基本大小为 auto 。也就是固定大小。 增长:基本大小 + 额外空间 *(增长系数 / 增长系数总和) 按比例划分额外空间,然后各自分配。 缩小:基本大小 – 溢出大小 *(缩小系数 * 基本大小 / 各各缩小系数 * 自身大小 之和

    2020/03/31
  • Angular有哪些特点?教程视频_特点指南攻略

    Angular是一个开源框架,一个互联网应用程序框架,一个强大的前端框架,用于开发动态Web应用程序。那么Angular有哪些特点?Angular的特点1、数据的双向绑定这可能是其最激动人心的特性吧,view层的数据和model层的数据是双向绑定的,其中之一发生更改,另一方会随之变化,这不用你写任何代码!2、代码模块化,每个模块的代码独立拥有自己的作用域,m

    2020/03/20
  • DDOS攻击常见的类型入门攻略_攻击使用攻略

    “互联网”指的是全球性的信息系统,是能够相互交流,相互沟通,相互参与的互动平台。随着互联网的飞速发展,越来越多的网站应运而生,但各种问题也随之而来。其中最严重的莫过于网络安全问题,应该象每家每户的防火防盗问题一样,做到防范于未然。甚至不会想到你自己也会成为目标的时候,威胁就已经出现了,一旦发生,常常措手不及,造成极大的损失。而导致这个问题的最主要的因素就是以

    2020/03/29
  • Snibox小白入门_一个可自建托管的代码片段管理器

    Snibox小白入门 官方网址:https://snibox.github.io/ GitHub:https://github.com/snibox/snibox 简介描述:一个可…

    2020/03/07
  • 如何高效的阅读uni-app框架?菜鸟攻略_uni入门教程

    uni-app的框架,配置:page.json,manifest.json,package.json,vue.config.js。脚本,应用程序,main.js。日志打印,定时器,生命周期,页面,页面通讯。pages.json文件时用来对uni-app进行全局配置的,它是用来写页面文件的路径,窗口样式,底部的tabbar等,类似于小程序中的app.json的

    2020/03/23
  • 使用SVG symbols建立图标系统完整指南使用教程_svg菜鸟教程

    从最开始的使用img图片,到后来的使用css sprite来减少服务器请求,再到流行的图形字体化图标Iconfont。现在,一种全新的图标使用方式开始流行了起来——SVG symbols图标。工作原理SVG symbols的工作原理:symbol元素用来定义一个图形模板对象,它可以用一个use元素实例化。symbol元素对图形的作用是在同一文档中多次使用,s

    2020/03/29
  • CSSgram小白入门_类似 Instagram 滤镜效果的 CSS 库

    CSSgram小白入门 官方网址:http://una.im/CSSgram/ GitHub:https://github.com/una/CSSgram 简介描述:类似 Inst…

    2020/03/06
  • 一位高级软件工程师的自述:这个职位到底要做什么工作?使用说明_工程师菜鸟知识

    本文作者 Joy Ebertz 接触过的几乎每一家软件公司都设有技术晋升与管理晋升两条职业道路,这意味着如果只走技术方向,技术人员也完全可以在不出任管理职务的前提下达到相同的高阶职级。但与此同时,Joy Ebertz 所参加的几乎所有职业演讲或讨论小组都充斥着管理人员。现在,Joy Ebertz 终于明白从宏观层面来看,管理者到底需要做什么、管理的晋升通道又

    2020/03/24
  • Jingle UI基础指南_一个基于html5、css3开发轻量级的移动webapp 框架

    Jingle UI基础指南 官方网址:http://vycool.com/Jingle/ GitHub:https://github.com/shixy/Jingle 简介描述:一…

    2020/03/06
  • 元素显示隐藏的9种思路菜鸟知识_元素入门指南

    在网页制作中,元素的显示隐藏是非常常见的需求。本文将介绍元素显示隐藏的9种思路 display对于元素显隐来说,最常见就是display:none | display:block,但是使用这种方法有个问题,元素的display属性在隐藏前并不都是block,还有可能是inline、inline-block等注意:如果要适用于任何元素需要提前储存元素的disp

    2020/03/21
  • CSS3制作文字背景图基础入门_背景教程视频

    文字带上渐变色,或者说让文字透出图片。这些效果 CSS 属性也可以完成。 方法一、利用CSS3属性mix-blend-mode:lighten;实现使用 mix-blend-mode 能够轻易实现,我们只需要构造出黑色文字,白色底色的文字 div ,叠加上图片,再运用 mix-blend-mode 即可,简单原理如下:核心代码如下:<div class="

    2020/03/24
  • realworld小白基础_由React,Angular,Node,Django等提供支持的示例

    realworld小白基础 官方网址:https://realworld.io/ GitHub:https://github.com/gothinkster/realworld 简…

    2020/03/10
  • spa单页面应用基础知识教程浅谈SPA_spa小白教程

    1. 什么是SPA?单页Web应用(single page web application, SPA),就是只有一张Web页面的应用,是加载单个HTML页面并在用户与应用程序交互时动态更新该页面的Web应用程序,是指在浏览器中运行的应用,在使用期间不会重新加载页面。像所有的应用一样,它旨在帮助用户完成任务,比如“编写文档”或者“管理Web服务器”。可以认为单

    2020/04/03