关于H5唤醒APP的功能实现(千辛万苦啊!)
首先,我是个后端,写java的,甚至不是搞移动端的,所以js这方面有点底子但不专业,对于出现的错误也请见谅,原来项目要求有个H5页面打开APP的功能就强行要做,没办法就想办法搞一下,网上的教程基本都是差不多套路,APP厂商也没有提供启动的接口之类的,只能从系统注册表考虑启动应用,所以这下面的代码都是基于你知道这个app的scheme_url和scheme_hosts是啥的基础上进行的。对于不知道这两个地址的只能说:度娘找你。
并不一定保证百分百打开,只能设置定时器去等应用启动,如果终端反应慢一拍,6秒过了还没启动,代码就认为没应用,会跳转到下载页面去下载。当然安卓稍微容易一些,IOS就比较封闭了。啥话不说,先上js代码
//启动app方法
function startApp(url, url2) {
//url是跳转的scheme地址,这个建议下个反编译的软件,去第三方apk查他们设置的scheme_url和scheme_host是什么,我就是这样干的
//url2是应用下载地址,要分清ios和android的不一样
//将下载地址保存到全局变量
downloadUrl = url2;
if (ua.match(/ipad|iphone|ipod|ios/i)) {
//外部一个定时器,专门盯着启动app的定时器loop;就叫它killer吧
//计时6秒,之后干掉loop.
window.setTimeout(function() {
$('#message').html('');
$('.result-message').eq(0).css("display", "none");
clearTimeout(loop);
time = parseInt('6000') / 1000;
},
6000);
//尝试启动应用
location.href = url;
//同时开始应用启动倒计时
countDown();
} else {
//安卓的就是用iframe来测试是否安装和启动应用了
window.setTimeout(function() {
$('#message').html('');
$('.result-message').eq(0).css("display", "none");
clearTimeout(loop);
time = parseInt('6000') / 1000;
},
6000);
//创建iframe并启动应用入口
openApp(url);
}
}
function openApp(src) {
// 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP
var ifr = document.createElement('iframe');
ifr.src = src;
ifr.style.display = 'none';
document.body.appendChild(ifr);
//切换到iframe时
//此时,会有个问题,如后切换到应用时间小于killer所需要杀死loop的时间,loop就会跳到下载提示,killer`就失去作用了
countDown();
window.setTimeout(function() {
document.body.removeChild(ifr);
},
5000);
//倒计时
}
function countDown() {
//每秒调用一次
loop = window.setTimeout('countDown()', 1000);
if (time > 0) {
$('.result-message').eq(0).css("display", "block");
$('#message').html('正在尝试打开客户端 ' + time + 's');
time--;
if (time == 0) {
/*if(ua.match(/ipad|iphone|ipod|ios/i)){
console.log(downloadUrl);
location.href = downloadUrl;
}*/
//如果计时到0,loop任然没被干掉,就说明应用没有启动,此时,跳到下载提示界面
//定时器的局限性还是很大,不能响应式反应,所以只能做到这一步了
$('#message').html('');
$('.result-message').eq(0).css("display", "none");
clearTimeout(loop);
time = parseInt('6000') / 1000;
var btnArray = ['否', '是'];
mui.confirm('您没有安装该应用,是否下载安装包?', '应用下载', btnArray,
function(e) {
if (e.index == 1) {
location.replace(downloadUrl);
} else {
return;
}
});
}
}
}
//url2是应用下载地址,要分清ios和android的不一样
//将下载地址保存到全局变量
downloadUrl = url2;
if (ua.match(/ipad|iphone|ipod|ios/i)) {
//外部一个定时器,专门盯着启动app的定时器loop;就叫它killer吧
//计时6秒,之后干掉loop.
window.setTimeout(function() {
$('#message').html('');
$('.result-message').eq(0).css("display", "none");
clearTimeout(loop);
time = parseInt('6000') / 1000;
},
6000);
//尝试启动应用
location.href = url;
//同时开始应用启动倒计时
countDown();
} else {
//安卓的就是用iframe来测试是否安装和启动应用了
window.setTimeout(function() {
$('#message').html('');
$('.result-message').eq(0).css("display", "none");
clearTimeout(loop);
time = parseInt('6000') / 1000;
},
6000);
//创建iframe并启动应用入口
openApp(url);
}
}
function openApp(src) {
// 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP
var ifr = document.createElement('iframe');
ifr.src = src;
ifr.style.display = 'none';
document.body.appendChild(ifr);
//切换到iframe时
//此时,会有个问题,如后切换到应用时间小于killer所需要杀死loop的时间,loop就会跳到下载提示,killer`就失去作用了
countDown();
window.setTimeout(function() {
document.body.removeChild(ifr);
},
5000);
//倒计时
}
function countDown() {
//每秒调用一次
loop = window.setTimeout('countDown()', 1000);
if (time > 0) {
$('.result-message').eq(0).css("display", "block");
$('#message').html('正在尝试打开客户端 ' + time + 's');
time--;
if (time == 0) {
/*if(ua.match(/ipad|iphone|ipod|ios/i)){
console.log(downloadUrl);
location.href = downloadUrl;
}*/
//如果计时到0,loop任然没被干掉,就说明应用没有启动,此时,跳到下载提示界面
//定时器的局限性还是很大,不能响应式反应,所以只能做到这一步了
$('#message').html('');
$('.result-message').eq(0).css("display", "none");
clearTimeout(loop);
time = parseInt('6000') / 1000;
var btnArray = ['否', '是'];
mui.confirm('您没有安装该应用,是否下载安装包?', '应用下载', btnArray,
function(e) {
if (e.index == 1) {
location.replace(downloadUrl);
} else {
return;
}
});
}
}
}
整理了一下,定时器还是不好用,这也是没办法的办法了,网上大多的教程都是定时器,不是定时器的我又不明白人家啥意思,而且大部分都是安卓的,ios就是个坑,safari不支持iframe的跳转,就搞的我人都凌乱了,只能自己想办法,这个之前那个两个定时器控制的调转差不多,将就着看吧
---------------------
作者:话说起个名字好难
来源:CSDN
原文:https://blog.csdn.net/sinat_29194935/article/details/70820398
版权声明:本文为博主原创文章,转载请附上博文链接!
关于H5唤醒APP的功能实现(千辛万苦啊!)的更多相关文章
- H5唤醒app,不完全兼容
---ps---最近新发现一个开源的H5唤醒app的库:建议使用第三方开源库https://github.com/suanmei/callapp-lib实现:或者极光魔链(后期可能会收费)https: ...
- H5唤醒app,第三方开源库
在微信浏览器内,安卓打开应用宝,ios跳进appstore,基本都可以成功在外部浏览器内,已安装可进入应用内,未安装进入应用宝提示下载,需客户端支持.<!DOCTYPE html> < ...
- h5唤醒App
一.应用场景 用户在访问我们的网页时,判断出这个用户手机上是否安装了我们的App,如果安装了则直接从网页上打开APP,否则就引导用户前往下载,从而形成一个推广上的闭环.这里只针对从网页端打开本地APP ...
- H5网页唤醒app,判断app安装
在阅读本文之前你首先应该对js有基本对掌握,并且对Scheme,intent有一定的理解.更多的是代码 上午给朋友做了一个产品引导页,但是需要判断ios系统的TestFlight是否安装,进行了goo ...
- 微信浏览器内 h5 直接唤醒 app 之 微信开放标签 wx-open-launch-app
以前微信浏览器内想要直接唤醒 app 要么接微信的应用宝要么你是腾讯的干儿子. 而在微信在2020年5月分推出了“微信开放标签”功能 wx-open-launch-app 用于微信浏览器内直接唤醒 a ...
- iOS universallinks唤醒app
从iOS9之后,苹果就推出了这个功能,用来唤醒外部app.这个功能在那些电商app上使用尤其广泛,当你打开对应的h5网页后,上面跳出一个是否跳转app的按钮. 现在iOS11已经基本覆盖,iOS12也 ...
- 通过页面调用APP【H5与APP互通】
现在H5和App原生的内容原来越互通,所涉及的业务也越来越复杂和融合,所以如何互相之间方便的调用才是王道. 场景1 比如用hybrid获取地理位置和短信信息,这当然需要框架封装好,比如利用框架的bri ...
- 微信公众号、H5、APP三者各有什么优势?
昨天给大家分享了一个现在很热的H5,众所周知,当下H5手机网站.微信公众号.APP这三种载体都越来越火了,而且三者都有各自的一些优势和劣势. HTML5(H5) H5之所以能引发如此广泛的效应,根本在 ...
- H5开发APP考题和答案
{ "last_updated": { "$date": 1544276670569 }, "page_count": 1, "a ...
随机推荐
- 了解Python内存管理机制,让你的程序飞起来
引用: 语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面 ...
- python类脚本
一在windows主机上探测主机是否存活 下面以多线程的方式: import osimport timeimport subprocessfrom concurrent.futures import ...
- concurrent.futures模块 -----进程池 ---线程池 ---回调
concurrent.futures模块提供了高度封装的异步调用接口,它内部有关的两个池 ThreadPoolExecutor:线程池,提供异步调用,其基础就是老版的Pool ProcessPoolE ...
- 制作本地yum源
镜像源是centos当中下载相关软件的地址,我们可以通过制作我们自己的镜像源指定我们去哪里下载impala的rpm包,这里我们使用httpd这个软件来作为服务端,启动httpd的服务来作为我们镜像源的 ...
- SAP生产机该不该开放Debuger权限(转)
前段时间公司定制系统在调用SAP RFC接口的时候报错了,看错误消息一时半会儿也不知道是哪里参数数据错误,就想着进到SAP系统里面对这个接口做远程Debuger,跟踪一下参数变量的变化,结果发现根本就 ...
- 《算法》BEYOND 部分程序 part 2
▶ 书中第六章部分程序,加上自己补充的代码,包括快速傅里叶变换,多项式表示 ● 快速傅里叶变换,需要递归 package package01; import edu.princeton.cs.algs ...
- 《算法》第六章部分程序 part 6
▶ 书中第六章部分程序,包括在加上自己补充的代码,包括二分图最大匹配(最小顶点覆盖)的交替路径算法和 HopcroftKarp 算法 ● 二分图最大匹配(最小顶点覆盖)的交替路径算法 package ...
- php用户名密码
http://112.124.47.59:8090/activity/index/free?mobile=15652701923&tcode=f9380859085200714&s=7 ...
- Http协议基础知识
r equest POST https://re.csdn.net/csdnbi HTTP/1.1方法 url/uri 协议的版本号 1.1Host: re.csdn.netConnection: k ...
- Shell 编程(实例二)
创建一个脚本,为指定硬盘创建分区 1.列出当前系统所有磁盘,让用户选择,如果选择quit则退出脚本:如果选择错误,则重新选择 2.当用户选择完成后,询问是否继续 3.抹除选择磁盘上的分区,为其创建三个 ...