h5页面打开app,安卓端和苹果端

对于App的分享页面,移动端经常会遇到需要唤起App并定位的功能。

跳转到App方法

安卓通常使用 URL Scheme 方法
IOS有两种方法 meta标签和Universal Links, 我们通常使用Universal Links

URL Scheme

URL Scheme就是一个可以让app相互之间可以跳转的对外接口。每个app都不同,如果有重复的会响应先安装的app。URL Scheme的格式为:

1
[scheme]://[host]/[path]?[query]

比如:

  • 淘宝: taobao://
  • QQ: mqq://
  • 微信: weixin://

meta标签

在网页上设置meta标签,使用safari打开的时候,就会在顶部显示自己app的导航条。如果没有安装app点击能够跳转到appstore去下载,如果安装了app就能直接通过顶部的meta标签唤醒app了。(此为IOS特有)

1
<meta charset="UTF-8" name="apple-itunes-app" content="app-id=yourId, affiliate-data=myAffiliateData, app-argument=yourScheme://">

iOS 9之前,一直使用的是URL Schemes技术来从外部对App进行跳转,但是iOS系统中进行URL Schemes跳转的时候如果没有安装App,会提示Cannot open Page的提示,而且当注册有多个scheme相同的时候,目前没有办法区分,但是从iOS 9起可以使用Universal Links技术进行跳转页面,这是一种体验更加完美的解决方案

实现唤醒APP功能

大多数需要唤醒app时都是在微信内,但由于微信内部禁用了唤醒功能,所以做了一个引导页,引导用户通过浏览器打开。(一些知名app可以唤起)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<div class="main">
<div class="tips" id="ios"></div>
<div class="tips" id="android"></div>
<div class="logo"></div>
<div class="info"></div>
<div id="a-btn" class="downloadBtna"><a href="https://wwww.******.com.cn/api/app/download"></a></div>
<div id="i-btn" class="downloadBtni"><a href="https://itunes.apple.com/cn/app/yourId"></a></div>
</div>

// 获取浏览器用于 HTTP 请求的用户代理头的值
var u = navigator.userAgent, ua = u.toLowerCase()
var isWeiXin = ua.indexOf('micromessenger') != -1;
var {isAndroid, isIOS} = detectVersion()
// 获取参数id值、来源值,以便用于scheme跳转
var id = getQueryString('id')
var source = getQueryString('source')
// 判断当前浏览器
function detectVersion() {
var isAndroid, isIOS;
if(u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) { // android or uc browser
// android
isAndroid = true
}
if(ua.indexOf("like mac os x") > 0) {
isIOS = true
}
return {isAndroid, isIOS}
}
// 唤起app方法
function openApp(callback) {
var url = ""
if (isAndroid ) {
url = '[scheme]://'+ source +'?id=' + id
var timeout, t = 3000, hasApp = true
var openScript = setTimeout( function () {
if (!hasApp) {
callback && callback()
}
document.body.removeChild(ifr)
},5000)

var t1 = Date.now()
var ifr = document.createElement("iframe")
ifr.setAttribute("src", url)
ifr.setAttribute("style", "display:none")
document.body.appendChild(ifr)
timeout = setTimeout( function () {
var t2 = Date.now()
if (t2 - t1 < t + 100) {
hasApp = false
// 此处创建一个定时器,以便用于判断页面是否跳转,如果未成功跳转,那么判断未安装app,此时跳转到app下载
window.location.href="https://www.******.com.cn/api/app/download"
}
},t)
}
if (isIOS) {
// Universal Links 需要IOS工程师进行配置
window.location.href= "https://www.******.com.cn/" + source + "?id=" + id
}
}
$(function () {
if(isWeiXin) {
if(isAndroid) {
$("#a-btn").show()
$("#android").show()
} else {
$("#i-btn").show()
$("#ios").show()
}
} else {
if(isAndroid) {
$("#android").show()
$("#a-btn").show()
openApp()
} else {
$("#ios").show()
$("#i-btn").show()
openApp()
}
}
})

以上并为考虑ios9以下版本