首先,我是个后端,写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的功能实现(千辛万苦啊!)的更多相关文章

  1. H5唤醒app,不完全兼容

    ---ps---最近新发现一个开源的H5唤醒app的库:建议使用第三方开源库https://github.com/suanmei/callapp-lib实现:或者极光魔链(后期可能会收费)https: ...

  2. H5唤醒app,第三方开源库

    在微信浏览器内,安卓打开应用宝,ios跳进appstore,基本都可以成功在外部浏览器内,已安装可进入应用内,未安装进入应用宝提示下载,需客户端支持.<!DOCTYPE html> < ...

  3. h5唤醒App

    一.应用场景 用户在访问我们的网页时,判断出这个用户手机上是否安装了我们的App,如果安装了则直接从网页上打开APP,否则就引导用户前往下载,从而形成一个推广上的闭环.这里只针对从网页端打开本地APP ...

  4. H5网页唤醒app,判断app安装

    在阅读本文之前你首先应该对js有基本对掌握,并且对Scheme,intent有一定的理解.更多的是代码 上午给朋友做了一个产品引导页,但是需要判断ios系统的TestFlight是否安装,进行了goo ...

  5. 微信浏览器内 h5 直接唤醒 app 之 微信开放标签 wx-open-launch-app

    以前微信浏览器内想要直接唤醒 app 要么接微信的应用宝要么你是腾讯的干儿子. 而在微信在2020年5月分推出了“微信开放标签”功能 wx-open-launch-app 用于微信浏览器内直接唤醒 a ...

  6. iOS universallinks唤醒app

    从iOS9之后,苹果就推出了这个功能,用来唤醒外部app.这个功能在那些电商app上使用尤其广泛,当你打开对应的h5网页后,上面跳出一个是否跳转app的按钮. 现在iOS11已经基本覆盖,iOS12也 ...

  7. 通过页面调用APP【H5与APP互通】

    现在H5和App原生的内容原来越互通,所涉及的业务也越来越复杂和融合,所以如何互相之间方便的调用才是王道. 场景1 比如用hybrid获取地理位置和短信信息,这当然需要框架封装好,比如利用框架的bri ...

  8. 微信公众号、H5、APP三者各有什么优势?

    昨天给大家分享了一个现在很热的H5,众所周知,当下H5手机网站.微信公众号.APP这三种载体都越来越火了,而且三者都有各自的一些优势和劣势. HTML5(H5) H5之所以能引发如此广泛的效应,根本在 ...

  9. H5开发APP考题和答案

    { "last_updated": { "$date": 1544276670569 }, "page_count": 1, "a ...

随机推荐

  1. couchdb安装

    fabric涉及到了couchdb做为数据库,所以单独安装一个进行测试,当然也可以使用docker来安装. 项目地址:http://couchdb.apache.org/ 这里采用windows来安装 ...

  2. FreeMarker的空值运算符和逻辑运算符

    1.空值处理运算符 如果你在模板中使用了变量但是在代码中没有对变量赋值,那么运行生成时会抛出异常.但是有些时候,有的变量确实是null,怎么解决这个问题呢? 判断某变量是否存在:“??” 用法为:va ...

  3. HTTP协议之认证

    认证方式有: basic ntlm digest

  4. <面试> PHP 常见算法

    排序算法 1. 冒泡排序(数组排序) 基本思想:对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样每遍历一次,最小的数值就 ...

  5. Centos代理上网设置

    原文链接:http://m.blog.csdn.net/article/details?id=51851677 一.centos自带界面设置代理 1. 界面设置  squid默认代理端口3128. 2 ...

  6. 详述 IntelliJ IDEA 插件的安装及使用方法

    首先,进入插件安装界面: Mac:IntelliJ IDEA -> Preferences -> Plugins; Windows:File -> Settings -> Pl ...

  7. PHP中Notice: unserialize(): Error at offset of bytes in on line 的解决方法

    使用unserialize函数将数据储存到数据库的时候遇到了这个报错,后来发现是将gb2312转换成utf-8格式之后,每个中文的字节数从2个增加到3个之后导致了反序列化的时候判断字符长度出现了问题, ...

  8. MySQL 创建自定义函数

    语法:Create function function_name(参数列表)returns返回值类型 函数体 函数名,应合法的标识符,不应与系统关键字冲突. 一个函数应该属于某个数据库,可以使用db_ ...

  9. Crash 文件调试

    Xcode目录下执行 find . -name symbolicatecrash 找到symbolicatecrash位置,将其拷贝到debug用的文件夹下 执行命令 export DEVELOPER ...

  10. 剑指offer例题——跳台阶、变态跳台阶

    题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 思路: n<=0时,有0种跳法 n=1时,只有一种跳法 n=2时,有 ...