- 包含Xcode11.0的配置方式和iOS13出現的問題。
什么是Universal Link
(通用鏈接)
Universal Link
(通用鏈接)是Apple在iOS9推出的一種能夠方便的通過傳統HTTPS
鏈接來啟動APP的功能,可以使用相同的網址打開網址和APP。當你的應用支持Universal Link
(通用鏈接),當用戶點擊一個鏈接是可以跳轉到你的網站并獲得無縫重定向到對應的APP,且不需要通過Safari
瀏覽器。如果你的應用不支持的話,則會在Safari
中打開該鏈接。在蘋果開發者中可以看到對它的介紹是:
Seamlessly link to content inside your app, or on your website in iOS 9 or later. With universal links, you can always give users the most integrated mobile experience, even when your app isn’t installed on their device.
如何理解Universal Link
(通用鏈接)
Universal Link
(通用鏈接):看起來就是一條普通的https
鏈接,當然是我們在該鏈接域名根目錄配置過的一個鏈接,也可以在該鏈接中放置對應的H5頁面。當用戶的點擊該鏈接,只要手機中安裝了支持該鏈接的APP就會直接進入到APP中。如果沒有安裝APP則會跳轉到Safari
瀏覽器中,展示H5頁面。對用戶來說則是一個無縫跳轉的過程。
Universal Link
(通用鏈接)的應用場景
使用Universal Link
(通用鏈接)可以讓用戶在Safari
瀏覽器或者其他APP的webview
中拉起相應的APP,也可以在APP中使用相應的功能,從而來把用戶引流到APP中。比如淘寶當在Safari
瀏覽器中進入淘寶網頁點擊打開APP則會使用Universal Link
(通用鏈接)來拉起淘寶APP。
使用Universal Link
(通用鏈接)跳轉的好處
-
唯一性: 不像自定義的
URL Scheme
,因為它使用標準的HTTPS
協議鏈接到你的web站點,所以一般不會被其它的APP所聲明。另外,URL scheme
因為是自定義的協議,所以在沒有安裝 app 的情況下是無法直接打開的(在Safari
中還會出現一個不可打開的彈窗),而Universal Link
(通用鏈接)本身是一個HTTPS
鏈接,所以有更好的兼容性; -
安全:當用戶的手機上安裝了你的APP,那么系統會去你配置的網站上去下載你上傳上去的說明文件(這個說明文件聲明了當前該
HTTPS
鏈接可以打開那些APP)。因為只有你自己才能上傳文件到你網站的根目錄,所以你的網站和你的APP之間的關聯是安全的; -
可變:當用戶手機上沒有安裝你的APP的時候,
Universal Link
(通用鏈接)也能夠工作。如果你愿意,在沒有安裝你的app的時候,用戶點擊鏈接,會在safari中展示你網站的內容; -
簡單:一個
HTTPS
的鏈接,可以同時作用于網站和APP; - 私有: 其它APP可以在不需要知道你的APP是否安裝了的情況下和你的APP相互通信。
支持Universal Link
(通用鏈接)
先決條件:必須有一個支持
HTTPS
的域名,并且擁有該域名下的上傳到根目錄的權限(為了上傳Apple指定文件)。-
開發者中心配置:找到對應的App ID,在Application Services列表里有Associated Domains一條,把它變為Enabled就可以了。
配置App ID支持Associated Domains:
工程配置:
-
Xcode 11.0版本
工程配置中相應功能:targets->Signing&Capabilites->Capability->Associated Domains,在其中的Domains中填入你想支持的域名,也必須必須以applinks:為前綴。
具體步驟如下圖: -
Xcode 11.0以下版本
工程配置中相應功能:targets->Capabilites->Associated Domains,在其中的Domains中填入你想支持的域名,必須以applinks:為前綴。
配置項目中的Associated Domains:
-
配置指定文件:創建一個內容為json格式的文件,蘋果將會在合適的時候,從我們在項目中填入的域名請求這個文件。這個文件名必須為apple-app-site-association,切記沒有后綴名,文件內容大概是這樣子:
{ "applinks": { "apps": [], "details": [ { "appID": "9JA89QQLNQ.com.apple.wwdc", "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"] }, { "appID": "ABCD1234.com.apple.wwdc", "paths": [ "*" ] } ] } }
說明:
appID:組成方式是
teamId.yourapp’s bundle identifier
。如上面的 9JA89QQLNQ就是teamId。登陸開發者中心,在Account -> Membership里面可以找到Team ID。paths:設定你的app支持的路徑列表,只有這些指定的路徑的鏈接,才能被app所處理。星號的寫法代表了可識 別域名下所有鏈接。
上傳指定文件:上傳該文件到你的域名所對應的根目錄或者.well-known目錄下,這是為了蘋果能獲取到你上傳的文件。上傳完后,自己先訪問一下,看看是否能夠獲取到,當你在瀏覽器中輸入這個文件鏈接后,應該是直接下載apple-app-site-association文件。
Universal Link
(通用鏈接)相關驗證
在iOS設備中的備忘錄中輸入APP能識別的鏈接,然后直接點擊此鏈接,就會直接跳轉到你的app了。或是長按,在出現的彈出菜單中第二項是在’XXX’中打開,這也代表著成功:
或是你將要測試的網址在Safari
中打開,在出現的網頁上方下滑,可以看到有在”XX”應用中打開:
出現菜單:
當點擊某個鏈接,直接可以進我們的app了,但是我們的目的是要能夠獲取到用戶進來的鏈接,根據鏈接來展示給用戶相應的內容。
我們需要在工程里的實現AppDelegate
里對應的方法:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb])
{
NSURL *url = userActivity.webpageURL;
if (url是我們希望處理的)
{
//進行我們的處理
}
else
{
[[UIApplication sharedApplication] openURL:url];
}
}
return YES;
}
蘋果為了方便開發者,提供了一個網頁來驗證我們編寫的這個apple-app-site-association是否合法有效,進入驗證網址進行驗證:
注意
前端開發經常面臨跨域問題,必須要求跨域,如果不跨域,就不行。
只有當前webview
的URL
域名,與跳轉目標URL
域名不一致時,Universal Link
(通用鏈接)才生效。
問題匯總
-
按照上面寫的配好了,怎么死活打不開呀???
- 支持HTTPS呀,一定要是符合蘋果認證的HTTPS證書呀。
- 系統問題,確保iOS9.0以上
- 配置文件問題,apple-app-site-association文件中配置的path和測試用的通用鏈接不一致,注意是區分大小寫的。
- 域名問題,Xcode中配置的域名一不小心寫錯了。
-
為毛有的手機成功了,有的手機就不行呢???
- 上面也提到過,因為網絡波動有可能會導致部分用戶第一次安裝時,無法下載apple-app-site-association文件,這個只能引導用戶刪除重裝或者在迭代時修改Associated Domains配置告訴系統重新下載apple-app-site-association文件。
- 另外一種可能是蘋果抽風導致,筆者今年年初一碰到過一個蛋疼的問題,從中午一直到下午4點發現重復的刪除重裝,app也不會請求服務器的apple-app-site-association文件,過了4點之后就好了。當時因為時間特殊并沒有深究到底是什么原因導致。
-
服務器換域名了腫么辦???
當Associated Domains添加新的 Domains的之后,在app再次啟動的時候抓包發現(不需要刪除重裝),蘋果會給新添加的這個Domains發送一個請求,請求新Domain下的apple-app-site-association文件。也就是說Associated Domains發生改變的話,系統是會知道的,這樣就可以在迭代的時候刪除舊的域名,添加新的域名了。
另外Domains的配置也可以使用通配符,例如:applinks:*.mywebsite.com
-
全都配置好了,項目也能喚起來了,web頁面到底該怎么弄呀???通用鏈接指向的服務器的頁面到底應該是哪個?
之前iOS和安卓用的是同一個網頁,也就是說從APP內分享出去的網頁,可以被蘋果用戶和安卓用戶同時查看,在這里需要由web童鞋使用js判斷當前所處的平臺以及其系統。
如果是安卓用戶,則顯示安卓相關提示頁面。
如果是蘋果用戶,那么分兩種:
- 如果是9.0以上的系統,相關的“在APP內打開”按鈕的鏈接配置的就是我們的
Universal Link
(通用鏈接)了,且該通用鏈接地址指向的是一個APP下載引導頁面,那么當用戶安裝了APP,即可通過通用鏈接喚醒APP;如果用戶沒有安裝app,那么就會跳轉到通用鏈接指向的APP下載引導頁面,達到最大化的客戶導流。 - 如果是9.0以下的系統,則相應的 “在APP內打開”的按鈕就會發一個跳轉到我們APP
URL Scheme
的重定向,以實現在Safari
中喚醒我們的APP。
- 如果是9.0以上的系統,相關的“在APP內打開”按鈕的鏈接配置的就是我們的
當使用通用鏈接喚醒APP之后,手機右上角有一個小按鈕?
那個小按鈕只有(在iOS10.0以下才有)是可以引導用戶跳轉到Safari
中,名字叫bread crumbs button
(面包屑),當然也去不掉;并且當用戶點過這個按鈕后,再點擊Universal Link
(通用鏈接)不會直接打開對應的APP。-
備忘錄和safari中都可以打開app,怎么分享到其他app里面就不行了?
未跨域導致的,如:分享到微信的鏈接是
https://www.mydomain.com/share.html
,然后該網頁中的“在app內打開”按鈕配置的通用鏈接為https://www.mydomain.com/index.html
。
跨域的意思是說,通用鏈接 和 調用通用鏈接的網頁不要使用同一域名。
即如果通用鏈接域名為www.mydomain.com
,則通用鏈接所處的網頁域名就不能是www.mydomain.com
。 微信已經禁用了
Universal Link
(通用鏈接)iOS13中在safari中可以打開相應APP,但是從微信或其他APP中點擊去safari怎么就打開了別的APP?
在iOS13之前在其他APP去safari中打開Universal Link
(通用鏈接)系統匹配域名是全匹配,而在iOS13之后規則發生了變化,猜測是包含關系。比如在iOS13之前,如果Universal Link
(通用鏈接)為w.mydomain.com
那么在微信或者其他APP訪問www.mydomain.com
然后點擊去safari打開則不會拉起相應APP,而在iOS13則會拉起相應APP。
而在safari中輸入的鏈接則依然和iOS之前一樣,只有www.mydomain.com
才會提示打開相應APP。
參考鏈接:
- 官方文檔
- 蘋果驗證通用鏈接是否可用的網站
- 通用鏈接文件存放的server需要支持HTTPS蘋果支持的HTTPS證書列表
文章若有不對地方,歡迎批評指正
作者:CodeRookie
鏈接:http://www.lxweimin.com/p/ab50bdaec65d