关于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 ...
随机推荐
- Jscraft 使用 Shell 与预先加载别名混合使用
Session session = a.getSessionShell("user", "pwd", "host"); Channel ch ...
- [Unity插件]Lua行为树(二):树结构
参考链接:https://blog.csdn.net/u012740992/article/details/79366251 在行为树中,有四种最基本的节点,其继承结构如下: Action->T ...
- UITableView取消cell选中状态关于deselectRowAtIndexPath
有没有遇到过,导航+UITableView,在push,back回来之后,当前cell仍然是选中的状态. 当然,解决办法简单,添加一句[tableView deselectRowAtIndexPath ...
- 使用git时报错出现vim.exe.stackdump
使用git时报错出现vim.exe.stackdump 关闭命令行重新打开试试 一般由于异常报错引起的
- 好久没玩docker了,温下手
好久没玩docker了,温下手 安装 Docker Docker 软件包已经包括在默认的 CentOS-Extras 软件源里.因此想要安装 docker,只需要运行下面的 yum 命令: yum i ...
- Flex自定义组件、皮肤,并调用
标签:Flex 自定义组件 自定义皮肤 主应用调用模块 本程序样例学习自flex 实战教程.但因原教程代码不全,且根据个人需求有更改. 1文件列表 自定义as类Reveal.as,该类实现组件的 ...
- SVM标记学习
# -*- coding: utf-8 -*- """ Created on Mon Oct 1 09:32:37 2018 @author: ""& ...
- Android虚拟机与Java虚拟机 两种虚拟机的比较
在Android的体系框架中有一部分叫做Android Runtime,即Android运行时环境,这个环境包括了两个部分,一个是Android的核心类库,还有一个就是Dalvik虚拟机了. Andr ...
- 08_组件三大属性(2)_props
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 创建pod步骤
创建pod步骤 Steps: pod lib create YBUtils //创建基本目录结构及工程 pod lib lint YBUtils.podspec //验证podspec文件是否合法 ...