前言:
Universal Links是蘋果在iOS9上開始支持的外部跳轉(zhuǎn)App的功能,正如它的名字Universal Links通過它特有的機(jī)制保證了跳轉(zhuǎn)鏈接的唯一性,不會和其它App沖突,而這正是之前我們一直使用的schema所無法保證的。下面會一步一步的介紹如何使自己的App支持Universal Links功能。
使用Universal Links的優(yōu)點
唯一性:因為跳轉(zhuǎn)是直接使用的Http 或 Https和官網(wǎng)域名進(jìn)行跳轉(zhuǎn)的,不會和其它App沖突。
安全性:apple-app-site-assocation文件是以Https的形式重SSL服務(wù)器請求的。
靈活性:實現(xiàn)了App和網(wǎng)站的配合,不會出現(xiàn)用戶無法跳轉(zhuǎn)的情況。
簡單性:統(tǒng)一的跳轉(zhuǎn)鏈接。
隱私性:而且其它用戶無法判斷你的App是否安裝。
注:將
Universal Links結(jié)合 Shared Web Credentials 和App Handoff一起使用可以實現(xiàn)一套完美的業(yè)務(wù)跳轉(zhuǎn)方案。
獨(dú)自進(jìn)行Universal Links的測試主要分為下面3個步驟:
- SSL服務(wù)器搭建和配置。
-
apple-app-site-association文件定義。 - xcode工程配置。
SSL服務(wù)器配置
蘋果官方要求Universal Links功能依賴的apple-app-site-association必須以HTTPS的協(xié)議從配置了SSL的服務(wù)器上請求獲取的。下面簡單介紹一下SSL服務(wù)器配置:
1. 簽名證書生成
由于是自己測試,這里使用的是自簽名證書,使用如下命令可以生成自簽名證書,注意過程中需要填寫自己的域名:
1. 進(jìn)入'/etc/apache2'目錄,新建'ssl'文件夾
2. 生成私鑰 :sudo openssl genrsa -des3 -out app.key 1024
3. 生成簽名申請 :sudo openssl req -new -key app.key -out app.csr
4. 生成服務(wù)器的私鑰 : sudo openssl rsa -in app.key -out server.key
5. 生成給網(wǎng)站服務(wù)器簽名的證書:sudo openssl req -new -x509 -days 3650 -key server.key -out server.crt

2. 配置Apache服務(wù)器,開啟SSL
2.1. 打開/etc/apache2/httpd.conf配置文件,打開下面幾行:
LoadModule ssl_module libexec/apache2/mod_ssl.so /*(加載ssl模塊)*/
Include /etc/apache2/extra/httpd-ssl.conf /*加載ssl配置文件*/
Include /etc/apache2/extra/httpd-vhosts.conf /*加載定向文件*/
2.2. 打開/etc/apache2/extra/httpd-ssl.conf配置文件,修改證書路徑:
SSLCertificateFile "/etc/apache2/ssl/server.crt" /*加載證書*/
SSLCertificateKeyFile "/etc/apache2/ssl/server.key" /*加載密鑰*/
2.3. 打開/etc/apache2/extra/httpd-vhosts.conf配置文件,增加“443”端口配置(填寫自己的域名),document部署的路徑是apache默認(rèn)路徑(如果自己沒有修改過):
<VirtualHost *:443>
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /etc/apache2/server.crt
SSLCertificateKeyFile /etc/apache2/server.key
ServerName mathew.lu.com
DocumentRoot "/Library/WebServer/Documents"
</VirtualHost>
2.4. 檢查配置文件是否正確 sudo apachectl configtest
2.5. 重啟Apache服務(wù)器 sudo apachectl restart
2.6. 瀏覽器輸入 https://mathew.lu.com 正常打開并且能看到證書。

定義apple-app-site-association文件
App啟動時系統(tǒng)會自動請求配置的Domain根目錄或者.well-known目錄下面的apple-app-site-association文件,下面是文件范例:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
注意事項:
-
apple-app-site-association文件沒有任何擴(kuò)展名。 -
apple-app-site-association文件解壓后的大小不能超過128k。 -
paths的配置支持 "*" 和 "?"的通配符,支持 "NOT" 關(guān)鍵字排除一些鏈接。 - 不支持重定向的方式獲取
apple-app-site-association文件。 -
apps必須要出現(xiàn)并且是空數(shù)組。
配置xcode工程
如下圖,配置Associated Domains

在AppDelegate中增加delegate回調(diào)方法application:continueUserActivity:restorationHandler:。上面都配置好之后,第一次安裝打開App的時候,可以用
Charles攔截請求,可以看到兩個請求https://mathew.lu.com/.well-known/apple-app-site-association和https://mathew.lu.com/apple-app-site-association。此時可以打開短息,編輯一個短息包含https://mathew.lu.com,系統(tǒng)會自動請求https://mathew.lu.com/apple-touch-icon.png獲取App的iCON,點擊鏈接時系統(tǒng)會再次請求https://mathew.lu.com/.well-known/apple-app-site-association和https://mathew.lu.com/apple-app-site-association然后跳到App。
注意事項:
- App在一次安裝(新安裝或更新安裝),只會請求一次
apple-app-site-association,這里個人猜想應(yīng)該是向系統(tǒng)注冊App支持Universal Links(望指正)。因此感覺不靠譜,無法知道系統(tǒng)是如何保證這個請求的成功,因為測試后發(fā)現(xiàn)即使失敗了,下次啟動的時候也不會再請求了。 - 系統(tǒng)會探測用戶的潛在行為,如果用戶是在Safari內(nèi)的M站上進(jìn)行操作,那么是同樣的跳轉(zhuǎn)鏈接是不會跳到App。
- 系統(tǒng)會探測用戶對于某個鏈接最近是使用 Safari打開還是App打開,如果是選擇了Safari,那么后面就會一直使用Safari打開不再跳轉(zhuǎn)到App,直到用戶在M站上點擊了Smart App Banner跳到App。
- 當(dāng)用戶點擊的鏈接是在App內(nèi)嵌的webView內(nèi)的,會有App處理,不會跳到Safari。
- App內(nèi)部使用
openURL:打開鏈接時,會跳到Safari,所以在AppDelegate的回調(diào)處理中會用這個方法做最后的兜底處理。