【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>
然后再将页面放到服务器上面生成地址,之后百度一下,生成短链接就可以丢给运营部了~不过别忘了多机型多浏览器测试一下效果哦!
【H5-移动端开发】外部唤起本机APP的解决方法的更多相关文章
- Android开发华为手机无法看log日志解决方法
Android开发华为手机无法看log日志解决方法 上班的时候,由于开发工具由Eclipse改成Android Studio后,原本的华为手机突然无法查看崩溃日志了,大家都知道,若是无法查看日志要它毛 ...
- 记一次SpringBoot 开发中所遇到的坑和解决方法
记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Inte ...
- Android开发环境搭建时遇到问题的解决方法
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/linux_loajie/article/details/33823637 Android开发环境搭建 ...
- linux mint 18.3设置分辨率死机问题的解决方法
linux mint 18.3由高分辨率设置为低分辨率的时候,会出现死机现象. 解决方法是:使用命令行: xrandr 查询所有支持的分辨率 然后通过 xrandr -s 1920x1080_59.9 ...
- H5移动端开发入门知识以及CSS的单位汇总与用法
说到css的单位,大家应该首先想到的是px,也就是像素,我们在网页布局中一般都是用px,但是近年来自适应网页布局越来越多,em和百分比也经常用到了.然后随着手机的流行,web app和hybrid a ...
- H5移动端开发
开发前准备 环境: Node.js LTS版本 git 最新版 文档: 本项目技术栈基于 ES2016 VueJS vux 快速开始 1.克隆项目 git clone https://gitee.co ...
- 关于iChartjs在移动端提示框tip显示不正常的解决方法
最近项目需要使用手机图表,但是找了很久都没找到专门为移动端开发的图表,只能找一些能兼容移动端的图表控件,今天就讲讲关于iChartjs这个图形库的一点问题. 问题 iChartjs的提示框tip的显示 ...
- HTML5外包注意事项-开发HTML5游戏的九大坑与解决方法剖析
随着移动社区兴起,势必带动HTML5的革命.未来一两年内,HTML5移动游戏必将呈现大爆发趋势. 以下是整理的HTML5游戏研发.市场趋势以及渠道布局和技术解决方案的内容.希望大家能从本文中找到对HT ...
- 前端webview开发中遇到的一些问题及其解决方法
最近做了一个webview中的兑换页面,本来以为很简单,想不到遇到了远远超出预期数量的BUG,记下来,以备后患. 1 inline-block元素折行 BUG描述:现在我有三个DIV,要在一列等宽排列 ...
随机推荐
- [POJ 2226] Muddy Fields
题目 Description 如何放木板保证只覆盖到 '*' 而没有覆盖到 '.' Solution (我太废了竟然想这题想了一个小时)考虑当前需要被覆盖的点 (x,y),假设有一块横着铺的木板 i ...
- Mycat 安装与启动
环境准备 安装JDK1.8(必须JDK1.7及更高版本) 安装MySQL 服务安装与说明 下载 MyCAT 编译好的安装包,下载地址为 http://dl.mycat.io/1.6-RELEASE/ ...
- 笔记:Spring Cloud Feign Hystrix 配置
在 Spring Cloud Feign 中,除了引入了用户客户端负载均衡的 Spring Cloud Ribbon 之外,还引入了服务保护与容错的工具 Hystrix,默认情况下,Spring Cl ...
- 使用jQuery动态克隆表格,并且添加至div中(使用前需要引入jQuery)
<!DOCTYPE html> <html> <head> <title></title> <meta charset="u ...
- Dependency Walker的替代品Dependencies
在c++时代, Dependency Walker基本上是大部分程序员必备的工具之一,很可惜的是从2006起就不更新了.而且只支持vc的名字undemangle, https://github.com ...
- SQL之Left Join 关联条件的探讨
在测试工作中,有时需要测试数据库数据经过sql计算后的结果是否满足某一功能查询得到的返回值. 针对某些需要功能需要联查多张表,此时 关联 的作用就异常重要了,而针对多表关联,其中 关联条件的重要性不言 ...
- 服务器数据恢复_服务器xfs数据丢失数据恢复
简介:太原一家公司的服务器出现故障,服务器是linux服务器,连接了一台某型号的存储,文件系统为xfs文件系统.管理员使用xfs_repair工具试图对文件系统进行修复但修复失败,linux服务器中所 ...
- javascript 腾讯ABS云平台面试题及面试经历
既然说到面试前端肯定是Javascript各种问,只好各种答. 面试题肯定离不了,最近热门的Vue.js,React.js,Angular.js,Gulp,Webpack还有各种Js问题,还有令人头痛 ...
- 用js 获取url 参数 页面跳转 ? 后的参数
记得之前在原来的公司写过这个东西,但是还是忘记怎么接住参数了,只知道怎么把id传过去! 问了身边的大佬 他首先推荐了我一个链接是别人写好的方法 附上链接地址:http://blog.csdn.net/ ...
- python之路--day6---文件处理
一.文件 1.文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件, 可以将自己的数据永久保存下来. 2.操作流程 #1. 打开文件,得到文件句柄并赋值给一个变量--f = o ...