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();
}
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>

原文地址:https://www.cnblogs.com/liuxu-xrl/p/8990520.html

时间: 2024-11-10 14:11:30

Hybrid混合开发中schema协议的使用与封装的相关文章

AppCan赵庆华: Hybrid 混合开发正当时

巨大的市场对于App开发服务提供商来说是绝佳的机遇.AppCan作为国内混合开发的领导品牌,同时服务开发者B2D和企业级B2B市场,提供移动应用开发平台和企业移动整体解决方案.多年来,AppCan一直把降低APP开发的技术门槛.降低企业的移动化成本作为研发目标,致力打造一体化.一站式移动平台,让移动化进程不再受限于技术. 近日,51CTO记者采访了AppCan CTO赵庆华,他为我们介绍了AppCan如何利用Hybrid混合开发帮助企业移动化. 移动开发两大趋势:原生VS混合 移动化浪潮来临,传

聊聊 iOS 开发中的协议

前言 何为协议,简单来说在OC中我们使用关键字@protocol可以声明一个协议,并在协议中添加多个属性.方法供于遵循者实现,从某个角度上来说,这是一种不同于category机制的category.在日常开发中,协议可谓无处不在,最为核心的UITableView通过协议来获取数据.完成事件处理等.下面就是一个最粗浅的协议 @protocol CustomProtocol - (void)doSomething; @end 对于协议的理解,很多的开发者依旧保留在委托-代理等于协议等认知上.然而前者

Android app开发中用户协议(使用条款)文字自动换行

用户协议(使用条款)文字自动换行处理 转载请注明出处:http://blog.csdn.net/u012301841/article/details/46648821 我们在开发app的时候,经常在关于这一模块,会涉及到用户协议或者使用条款这一类的,纯文本界面,但是需要自动换行和拖动.通常,PM会给你一大段文本,让你自己去处理.IOS可以直接复制文本进去,就会自动换行,不用处理,完全ok.为什么Android不行?我们只能一行行的去复制,去加换行符\r\n之类去处理.下面给大家介绍一种好用的方法

在混合开发中软键盘引起的布局问题、input与可编辑DIV兼容性问题汇总

此文复现的所有兼容性问题均为以下情况: 1. 腾讯X5内核 2. 全屏webview 问题如下: 1. IOS12 中软键盘弹出导致页面顶部截断,并且无法恢复. 解决方法:添加交互事件,调用本地方法,在键盘收起后执行页面回滚操作. bridgeClass.jsEventHook.keyboardWillShow = function () { // 添加flag 是因为 有多个空时,切换输入框也会调用WillHide switchFlag = true; }; bridgeClass.jsEve

混合开发中那些坑(一)

1.沉浸式标题 对于安卓和ios来说,解决沉浸式标题的方法不一样,通过打包设定,ios可以完美解决沉浸式问题,而安卓就会在head部分多出来一个标题栏的高度,非常恶心. 解决办法:通过js判断设备类型 // 动态加载css文件 function loadUfsStyles(url) { var link = document.createElement("link"); link.type = "text/css"; link.rel = "stylesh

Hybrid APP混合开发的一些经验和总结

Hybrid APP混合开发的一些经验和总结 写在前面: 由于业务需要,接触到一个Hybrid APP混合开发的项目.当时是第一次接触混合开发,有一些经验和总结,欢迎各位一起交流学习~ 1.混合开发概述 Hybrid App主要以JS+Native两者相互调用为主,从开发层面实现“一次开发,多处运行”的机制,成为真正适合跨平台的开发.Hybrid App兼具了Native App良好用户体验的优势,也兼具了Web App使用HTML5跨平台开发低成本的优势. 目前已经有众多Hybrid App开

混合开发

1.混合开发概述 Hybrid App主要以JS+Native两者相互调用为主,从开发层面实现"一次开发,多处运行"的机制,成为真正适合跨平台的开发.Hybrid App兼具了Native App良好用户体验的优势,也兼具了Web App使用HTML5跨平台开发低成本的优势. 目前已经有众多Hybrid App开发成功应用,比如美团.爱奇艺.微信等知名移动应用,都是采用Hybrid App开发模式. 2.移动应用开发的三种方式比较 移动应用开发的方式,目前主要有三种: Native A

Flutter基础系列之混合开发(二)

1.混合开发的场景 1.1作为独立页面加入 这是以页面级作为独立的模块加入,而不是页面的某个元素. 原生页面可以打开Flutter页面 Flutter页面可以打开原生页面 1.2作为页面的一部分嵌入 比如说原生页面中只有某一个item是Flutter: Flutter页面中只有某一部分是原生视图 2.Flutter混合开发的集成步骤 2.1创建Flutter Module 在做混合开发之前,我们首先需要创建一个Flutter Module. 这里建议Flutter Module的创建目录和原生工

入门移动端混合开发 实战京东 APP

第1章 课程介绍本章主要是向你介绍什么是混合开发,以及目前混合开发中的几种方案. 第2章 Hybrid 技术原理本章主要讲解 hybrid 技术原理与核心本质,让你对混合开发有更清楚的认识. 第3章 开发前的准备本章主要讲解核心代码开发前的准备知识,比如 Flex 布局.webpack 和 @vue/cli 的基础知识.scss 的基本应用和项目的初始化内容. 第4章 京东商城首页(上)本章主要使用 vue 开发商城首页,包括组件化思想.动态组件和异步组件的应用.axios的使用.swiper