【H5-移动端开发】外部唤起本机APP的解决方法

时间:2022-02-12 15:55:08

太长时间没来博客园,原因很简单啊——太懒了!罪过罪过~


最近公司的APP项目开始运行,采用的是原生框架+内嵌H5页面。作为一个菜鸡前端,开始入手学习移动端的界面制作加载性能优化。由于公司开始推广软件,加大引流量,运营部开发了软件短信提醒功能,其中需要在短信内放置软件的短链接,简单常见的一个小功能,而我要做的是提供一个短连接就可以了。

分析了一下功能需求:.当用户通过短信内部点击短链接时,会自动唤起我们的APP。

需要考虑:1.判断用户的设备类型。2.判断用户是否已经安装了此软件,安装了直接唤起,未安装安卓跳转到应用宝对应的下载页面,苹果跳转到APPStroe的下载页面。


参考网上文档,首先写了一个demo来实现判断设备类型,并跳转到相关下载页。

具体如下:

<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>APP下载页面</title>
</head>
<body>
<script type="text/javascript">
// 获取终端的相关信息
var Terminal = {
// 辨别移动终端类型
platform : function(){
var u = navigator.userAgent, app = navigator.appVersion;
return {
// android终端或者uc浏览器
android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1,
// 是否为iPhone或者QQHD浏览器
iPhone: u.indexOf('iPhone') > -1 ,
// 是否iPad
iPad: u.indexOf('iPad') > -1
};
}(),
// 辨别移动终端的语言:zh-cn、en-us、ko-kr、ja-jp...
language : (navigator.browserLanguage || navigator.language).toLowerCase()
} // 根据不同的终端,跳转到不同的地址
var theUrl;
if(Terminal.platform.android){
theUrl = '应用宝对应的下载地址';
}else if(Terminal.platform.iPhone){
theUrl = 'APPStroe对应的软件下载页面';
}else if(Terminal.platform.iPad){
theUrl = 'APPStroe对应的软件下载页面';
};
location.href = theUrl;
</script
</body>
</html>

之把该页面放到服务器上,生成链接地址即可。此时的效果已经实现了一半,即点击链接会根据设备类型自动跳转下载页面。


接下来我们将功能进一步的完善一下:点击短链接会先判断是否已经安装,未安装在执行以上步骤。

我们采用的唤起方式是url scheme(iOS,Android平台都支持),Android和iOS 开发人员开发时可以实现在安装这款app到手机时,同时在手机上注册一个这个URL。只需原生APP开发时注册scheme, 那么用户点击到此类链接时,会自动跳到APP。

iframe方案的唤起原理是: 程序切换到后台时,计时器会被推迟。如果app被唤醒那么网页必然就进入了后台,如果用户从app切回来,那么时间一般会超过2s;若app没有被唤起,那么网页不会进入后台,setTimeout基本准时触发,那么时间不会超过2s。

具体实现代码如下:

<!DOCTYPE html>
<html> <head>
<meta charset="UTF-8">
<title></title>
</head> <body> <div id="btn">
<a onclick="submitFn"><button>打开app</button></a>
</div> <script type=" text/javascript ">
function submitFn() {
//判断浏览器
var u = navigator.userAgent;
if(/MicroMessenger/gi.test(u)) {
// 引导用户在浏览器中打开
alert('请在浏览器中打开');
return;
}
var d = new Date();
var t0 = d.getTime();
if(u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {
//Android 向安卓同事索要链接
if(openApp('en://startapp')) {
openApp('en://startapp');
} else {
//由于打开需要1~2秒,利用这个时间差来处理--打开app后,返回h5页面会出现页面变成app下载页面,影响用户体验
var delay = setInterval(function() {
var d = new Date();
var t1 = d.getTime();
if(t1 - t0 < 3000 && t1 - t0 > 2000) {
alert('检测到未安装,请下载APP');
window.location.href = "app下载地址 ";
}
if(t1 - t0 >= 3000) {
clearInterval(delay);
}
}, 1000);
}
} else if(u.indexOf('iPhone') > -1) {
//IOS 向IOS同事索要
if(openApp('ios--scheme')) {
openApp('ios--scheme');
} else {
var delay = setInterval(function() {
var d = new Date();
var t1 = d.getTime();
if(t1 - t0 < 3000 && t1 - t0 > 2000) {
alert('检测到未安装,请下载APP');
window.location.href = "app下载地址 ";
}
if(t1 - t0 >= 3000) {
clearInterval(delay);
}
}, 1000);
}
}
}; function openApp(src) {
// 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP,并自动阻止a标签的默认行为
// 否则打开a标签的href链接
var ifr = document.createElement('iframe');
ifr.src = src;
ifr.style.display = 'none';
document.body.appendChild(ifr);
window.setTimeout(function() {
document.body.removeChild(ifr);
}, 2000);
}
</script> </body> </html>

然后再将页面放到服务器上面生成地址,之后百度一下,生成短链接就可以丢给运营部了~不过别忘了多机型多浏览器测试一下效果哦!