產(chǎn)品開發(fā)過程中難免會(huì)遇到這樣的需求:
產(chǎn)品說從app內(nèi)部分享出去的網(wǎng)頁(yè)上要加一個(gè)打開按鈕
用戶點(diǎn)擊打開,能直接喚醒a(bǔ)pp跳轉(zhuǎn)到這一頁(yè)去瀏覽。
明確的需求就是:
微信中打開我們的分享頁(yè)面,點(diǎn)擊商品購(gòu)買按鈕,
用戶如果已經(jīng)安裝app,跳轉(zhuǎn)到app做相應(yīng)的操作。
如果沒有安裝app,則跳轉(zhuǎn)到應(yīng)用商店提示用戶下載安裝。
方法一:URL Scheme
將參數(shù)配置在url scheme后面,喚醒a(bǔ)pp再進(jìn)行頁(yè)面跳轉(zhuǎn)邏輯。
但殘酷的現(xiàn)實(shí)是QQ和微信都把url scheme 喚醒a(bǔ)pp這種方式給禁了。
方法二:meta標(biāo)簽
meta標(biāo)簽的格式如下:
<meta charset="UTF-8" name="apple-itunes-app" content="app-id=1234567890, affiliate-data=myAffiliateData, app-argument=yourScheme://">
這樣添加meta標(biāo)簽后的網(wǎng)頁(yè),使用safari打開的時(shí)候,就會(huì)在頂部顯示自己app的導(dǎo)航條。如果沒有安裝app點(diǎn)擊能夠跳轉(zhuǎn)到appstore去下載,如果安裝了app就能直接通過頂部的meta標(biāo)簽喚醒a(bǔ)pp了。
上面兩種方式都能實(shí)現(xiàn)某一方面的需求,但無法完美解決。于是就想到了iOS9之后的Universal Links。
以下內(nèi)容主要包括:
介紹Universal Links
配置Universal Links
app IDs配置
項(xiàng)目配置
https證書申請(qǐng)
什么是Universal Links呢?
Universal Links就是一個(gè)通用鏈接,iOS9以上的用戶,可以通過點(diǎn)擊這個(gè)鏈接無縫的重定向到一個(gè)app應(yīng)用,而不需要通過safari打開跳轉(zhuǎn)。 如果用戶沒有安裝這個(gè)app,則會(huì)在safari中打開這個(gè)鏈接指向的網(wǎng)頁(yè)。
配置Universal Links
1.創(chuàng)建一個(gè)名字叫做apple-app-site-association,包含固定格式的json文件
2.將這個(gè)文件上傳到你的服務(wù)器,可以將這個(gè)文件放到服務(wù)器的根目錄下,也可以放到.well-known這個(gè)子目錄下。
3.配置app,然后在app里面添加代理方法
配置流程
1.apple-app-site-association文件
{
"applinks": {
"apps": [],
"details": [
{
"appID": "teamID.bundleId”,
"paths": ["*"]
}
]
}
}
創(chuàng)建一個(gè)包含上述格式的json文件,文件名字必須為apple-app-site-association,不能帶后綴名。
appID
appID 的 格式為teamID.bundleId形式。
如何獲取teamID呢?
登錄開發(fā)者網(wǎng)站 ,找到Membership選項(xiàng)卡。
appID具體顯示就是:xxxxxxxxxxx.com.shangxinpifa.app 這種
paths
paths配置,實(shí)際上就是限制哪些路徑可以喚醒a(bǔ)pp,哪些路徑不能喚醒a(bǔ)pp。格式如下:
"paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/*", "/videos/wwdc/201?/*"]
1.使用配置,則整個(gè)網(wǎng)站都可以使用
2.使用特定的URL,例如/wwdc/news/來指定某一個(gè)特殊的鏈接
3.在特定URL后面添加,例如 /videos/wwdc/2015/, 來指定網(wǎng)站的某一部分
4.除了使用來匹配任意字符,你也可以使用 ?來匹配單個(gè)字符,你可以在路徑當(dāng)中結(jié)合這兩個(gè)字符使用,例如 /foo/*/bar/201?/mypage
驗(yàn)證apple-app-site-association文件
文件配置完成之后,將其上傳到你的服務(wù)器根目錄或者.well-known這個(gè)子目錄下。
1.確保使用https://域名.com/apple-app-site-association這個(gè)鏈接可以訪問到。 2.也可以使用蘋果的驗(yàn)證網(wǎng)站,驗(yàn)證文件是否能被蘋果請(qǐng)求到。如果是未上線的應(yīng)用,使用驗(yàn)證網(wǎng)站時(shí)可能出現(xiàn)如下提示:
出現(xiàn)該提示為apple-app-site-association文件配置正確。 出現(xiàn)404錯(cuò)誤碼提示,則為apple-app-site-association文件未上傳成功,或者使用 https://域名.com/apple-app-site-association路徑無法訪問。
app IDs 配置
進(jìn)入開發(fā)者網(wǎng)站,找到你自己的bundleId,可以點(diǎn)擊edit按鈕,開啟associate domains,并創(chuàng)建相應(yīng)的provisioning Profiles,如下圖:
項(xiàng)目配置
在項(xiàng)目的Capablities中開啟Associated domains,如下圖:
注意domains可以添加多個(gè),前綴必須為applinks:,applinks:后為你的服務(wù)器的域名。
代碼接收Universal Links喚醒
在appdelegate中實(shí)現(xiàn)上面這個(gè)方法,當(dāng)使用Universal Links喚醒a(bǔ)pp時(shí)就執(zhí)行這個(gè)方法。
驗(yàn)證配置
快捷驗(yàn)證,在備忘錄中輸入https://yourdomain.com/goods/129893,長(zhǎng)按這個(gè)鏈接,出現(xiàn)下圖提示則配置成功。
證書申請(qǐng)
阿里云提供了免費(fèi)的ssl證書申請(qǐng)
購(gòu)買之后到控制臺(tái)補(bǔ)全信息:
補(bǔ)全信息后點(diǎn)擊進(jìn)度查看下一步的配置工作
按照步驟完成配置后,10分鐘左右就會(huì)通過審核,服務(wù)器配置按照阿里云提供的文檔繼續(xù)操作即可
問題補(bǔ)充:
1.在沒有安裝app的情況下,如何跳轉(zhuǎn)下載頁(yè)面?
對(duì)于apple手機(jī),在nginx上,將你的universal link指向一個(gè)文件,例如download.html
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<title>上新-跳轉(zhuǎn)中...</title>
</head>
<body>
<script type="text/javascript">
setTimeout(function(){
window.location = "http://a.app.qq.com/o/simple.jsp?pkgname=com.shangxin"
},3000)
</script>
</body>
</html>
這樣做的目的可以理解為,給手機(jī)3秒的時(shí)間去喚醒a(bǔ)pp,如果3秒內(nèi)沒有喚醒,則跳轉(zhuǎn)到下載頁(yè)面
2.安卓上有沒有這種功能?
我目前沒找到很好的deep link方案,安卓上還是采用傳統(tǒng)的提示打開瀏覽器,使用scheme跳轉(zhuǎn)。
3.安卓上怎么處理用戶沒有下載app的情況?
同樣的思路,如果瀏覽器在一定時(shí)間段內(nèi)沒有喚起app,則直接跳轉(zhuǎn)下載頁(yè)面,可參考以下代碼
if(!isWeixin){
if(browser.versions.android == true){
var ifr = document.createElement('iframe');
ifr.src = 'your android awake up scheme'
ifr.style.display = 'none';
document.body.appendChild(ifr);
var aa = Date.now();
setTimeout(function(){
var cc = Date.now();
if(cc - aa <(1500 + 200)){
window.location = "http://a.app.qq.com/o/simple.jsp?pkgname=com.shangxin"
}else{
document.body.removeChild(ifr);
}
},1500)
}
}