【H5-移动端开发】外部唤起本机APP的解决方法
太长时间没来博客园,原因很简单啊——太懒了!罪过罪过~
最近公司的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>
然后再将页面放到服务器上面生成地址,之后百度一下,生成短链接就可以丢给运营部了~不过别忘了多机型多浏览器测试一下效果哦!