需要在从APP分享出去的H5页面中,带有一个立即打开的按钮,如果本地安装了app,那么就直接唤起本地的app,如果没有安装,则跳转到下载。这是一个很正常的推广和导流量的策略。
h5唤醒APP功能
URL Scheme —— 唤端媒介
来源
URL Schemes是什么
[scheme]://[host]/[path]?[query]
-
所有网页都一定有网址,不管是首页还是子页。但未必所有的应用都有自己的 URL Schemes,更不是每个应用的每个功能都有相应的 URL Schemes。几乎没有所有功能都有对应 URL 的应用。一个 App 是否支持 URL Schemes 要看那个 App 的作者是否在自己的作品里添加了 URL Schemes 相关的代码。
-
一个网址只对应一个网页,但并非每个 URL Schemes 都只对应一款应用。这点是因为苹果没有对 URL Schemes 有不允许重复的硬性要求,所以曾经出现过有 App 使用支付宝的 URL Schemes 拦截支付帐号和密码的事件。
-
一般网页的 URL 比较好预测,而URL Scheme 因为没有统一标准,所以非常难猜,通过猜来获取 应用的 URL Schemes 是不现实的。
用浏览器去打开scheme
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>打开App</title>
</head>
<body>
<a href="luwei://" id="open">打开应用</a>
</body>
</html>
-
新建一个隐藏的 iframe ,地址指向需要打开的url
-
使用 window.location 或者 window.location.href 刷新当前页面
-
新建一个隐藏的 a 标签,地址指向打开的url,并触发打开链接事件
-
动态创建一个script脚本,在这个脚本中新建一个a标签并打开
// 打开url的方式
var urlOpen = {
// 在ios支持不好
'iframe' : function(url) {
var iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.src = url;
document.body.appendChild(iframe);
},
'location' : function(url) {
window.location.href = url;
},
'href' : function(url) {
var a = document.createElement('a');
a.style.display = 'none';
a.href = url;
document.body.appendChild(a);
a.click();
},
'script' : function(url) {
var script = document.createElement('script');
script.setAttribute('type', 'test/javascript');
script.innerHTML = '(function(){' +
'var a = document.createElement("a");' +
'a.style.display = "none";' +
'a.href = "' + url.replace(/"/g, '\\"') + '";' +
'document.body.appendChild(a);' +
'a.click();' +
'})()';
document.body.appendChild(script);
},
'open' : function(url) {
window.open(url);
}
};
浏览器判断是否安装应用
-
pagehide : 页面隐藏时触发
-
visibilitychange : 页面隐藏没有在当前显示时触发(切换tab也会触发该事件)
-
document.hidden : 当页面隐藏时,该值为true,显示时为false
var downloader,
scheme = 'luwei://', // 需要打开的app scheme 地址
iosDownload='http://xxx.com'; // 如果打开scheme失效的app下载地址
andDownload = 'http://xxx.com';
var u = navigator.userAgent;
var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //g
var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
// 给 id 为 openBtn 的按钮添加点击事件处理函数
document.getElementById('openBtn').onclick = function () {
window.location.href = scheme; // 尝试打开 scheme
// 设置3秒的定时下载任务,3秒之后下载app
downloader = setTimeout(function(){
if(isAndroid) {
window.location.href = andDownload;
}
if(isIOS) {
window.location.href = iosDownload;
}
}, 3000);
};
document.addEventListener('visibilitychange webkitvisibilitychange', function () {
// 如果页面隐藏,推测打开scheme成功,清除下载任务
if (document.hidden || document.webkitHidden) {
clearTimeout(downloader);
}
});
window.addEventListener('pagehide', function() {
clearTimeout(downloader);
});
没有完美的方案