Hybrid混合开发中schema协议的使用与封装
混合开发中JS与APP通信的实现原理:
JS通过schema协议,传递参数和全局回调函数给APP端
APP执行完(如微信扫一扫)后,调用协议中传入的回调函数,在前端执行回调处理。
默认写法:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hybrid中schema协议的使用</title>
</head>
<body>
<button id="btn1">扫一扫</button>
<script>
function invokeScan(){
//APP执行的回调函数
window['_invoke_scan_callback'] = function(result){
alert(result);
}
var iframe = document.createElement("iframe");
iframe.style.display="none";
//iframe.src = 'weixin://dl/scan'; //重要
iframe.src = 'weixin://dl/scan?k1=v1&k2=v2&k3=v3callback=_invoke_scan_callback';
var body = document.body;
body.appendChild(iframe);
setTimeout(function(){
body.removeChild(iframe);
iframe = null;
});
}
document.getElementById("btn1").addEventListener("click",function(){
invokeScan();
});
</script>
</body>
</html>
封装后如下:
APP中的schema.js
//封装schema
//如果data和callback非必填参数,可在函数内做些兼容性处理
function invokeScan(type,data,callback){
var iframe = document.createElement("iframe");
iframe.style.display="none";
//iframe.src = 'weixin://dl/scan'; //重要
//
//拼接schema协议:
var schema = 'myapp://dl';
schema += "/"+type; //传入类型
schema += "?a=a"; //避免判断是否加?
if(typeof data != "undefined"){
for(var key in data){
if(data.hasOwnProperty(key)){
_src+="&"+key+"="+data[key];
}
}
}
//协议中增加callback回调函数
var callBackName = '';
//APP执行的回调函数
if(typeof callback != "undefine"){
if(typeof callback ==="string"){ //传入的是回调名称
callBackName = callback;
}
else{ //传入的是回调函数
callBackName = type + Date.now(); // Date.now() == new Date().getTIme()
}
window[callBackName] = callback;
_src+='&callback='callBackName;
}
iframe.src = _src;
var body = document.body;
body.appendChild(iframe);
setTimeout(function(){
body.removeChild(iframe);
iframe = null;
});
}
//将schena协议暴露给全局
/*
写法一:
window.invokes = {
scan:function(data,callback){ //扫一扫
invokeScan("scan");
},
share:function(data,callback){ //拍照
invokeScan("share",data,callback)
}
}
*/
//写法二:功能进一步才分
window.invoke = {
scan:_scan,
share:_share
}
function _scan(data,callback){ //扫一扫
invokeScan("scan");
}
function _share(data,callback){ //拍照
invokeScan("share",data,callback)
}
window.init = function(id){
return document.getElementById(id);
}
APP中的html调用:
<body>
<button id="btn1">扫一扫</button>
<button id="btn2">拍照</button>
<script type="text/javascript" src="./schema.js"></script>
<script>
//封装完成后,页面调用方法如下
//
//扫一扫
init("btn1").addEventListener("click",function(){
window.invoke.scan();
});
//照相
init("btn2").addEventListener("click",function(){
window.invoke.share({"name":"zs","age":11},function(result){
if(result.code===0){
alert(result);
}
else{
alert(result.message);
}
});
});
</script>
</body>
Hybrid混合开发中schema协议的使用与封装的更多相关文章
- 聊聊 iOS 开发中的协议
前言 何为协议,简单来说在OC中我们使用关键字@protocol可以声明一个协议,并在协议中添加多个属性.方法供于遵循者实现,从某个角度上来说,这是一种不同于category机制的category.在 ...
- hybrid app开发中:苹果移动设备实用Meta标签
hybrid app开发中:苹果移动设备实用Meta标签 “apple-mobile-web-app-status-bar-style”作用是控制状态栏显示样式 具体效果如下: status-bar- ...
- angular开发中对请求数据层的封装
代码地址如下:http://www.demodashi.com/demo/11481.html 一.本章节仅仅是对angular4项目开发中数据请求封装到model中 仅仅是在项目angular4项目 ...
- React Native混合开发中必须要学会点FlexBox布局
在前面的案例中,界面的搭建都是采用CSS的布局,基于盒子模型,依赖 display属性 , position属性, float属性.但对于那些特殊布局非常不方便,比如,垂直居中. 一种全新的针对web ...
- Android app开发中用户协议(使用条款)文字自己主动换行
用户协议(使用条款)文字自己主动换行处理 转载请注明出处:http://blog.csdn.net/u012301841/article/details/46648821 我们在开发app的时候.常常 ...
- H5混合开发中android终端和ios终端常见的兼容问题1
转自 https://blog.csdn.net/xuehu837769474/article/details/80603898 1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上 ...
- 记录Vue和Jquery混合开发中关于点击事件的一个bug
最近比较急的接手了公司的微信服务号项目,采用的技术栈主要是jq和vue.在项目中之前碰见过jq写的$().on('click',function(){})点击事件不起作用,只能写在vue实例中的met ...
- 混合开发中ios兼容问题
1. z-index无效,设置层级,发现再ios中无效,后来发现是设置了 -webkit-overflow-scrolling:touch 设置这个属性之后.层级设置失效 2.@keyup事件的问题, ...
- H5混合开发中android终端和ios终端常见的兼容问题2
转自 https://www.cnblogs.com/stoneniqiu/p/6077112.html 1.ios键盘挡住输入框. setInterval(function () { if (doc ...
随机推荐
- sql server restore DB issue
error occurs when restoring the backup file of sql server(DB.bak) to run the above t-sql will shoot ...
- R 连接DB2数据库,并制作词图
#写在前面的话:此教程主要是用R连接了DB2数据库,并进行文本分析,制作了词图 #教程为markdown编写 ---title: "网站留言分析"output: html_docu ...
- PostgreSQL的HA解决方案-项目概述
公司使用的数据库时postgresql,一直运行都很流畅,但是最近java新做的管理平台,由于登录用户较多,并发性比较大.另外新系统可能优化也存在问题,所以pg经常崩溃,所以我就开始研究如何事项pg的 ...
- Verilog之openMSP430(1)
openMSP430_IO interrupt Verilog file: omsp_gpio.v //================================================ ...
- 了解权限控制框架shiro 之实际应用.
Apache Shiro 1.权限控制分为 a.粗粒度 URL 级别权限控制 b.细粒度方法级别权限控制 2.使用shiro进行权限控制主要有四种主要方式 : a. 在程序中 通过 Subje ...
- 编写jQuery 插件
编写jQuery Plugin,要设置默认值,并允许用户修改默认值,或者运行是传入其他值. 最终,我们得出编写一个jQuery插件的原则: 给$.fn绑定函数,实现插件的代码逻辑: 插件函数最后要 r ...
- jquery里面控制显示和隐藏 ___土狗toggle
$("#hide").click(function(){ $("p").hide(); }); $("#show").click(funct ...
- MongoDB_基础知识
mongoDB术语:database-数据库,collection-数据库表/集合,document-数据记录行/文档,field-数据字段/域,index-索引,primary key-主键(Mon ...
- windows 端口号占用和解决方法
https://blog.csdn.net/qq_39657909/article/details/80378983
- maven项目发布后访问jsp页面报错
type Exception report message java.lang.NullPointerException description The server encountered an i ...