什么是Universal Links?
在iOS9之前,對於從各種從瀏覽器、Safari中喚醒APP的需求,我們通常只能使用scheme。但是這種方式需要提前判斷系統中是否安裝了能夠響應此scheme的app,並且這種方式在微信中是被禁用了的。
Universal Links是iOS9推出的一項功能,使你的應用可以通過傳統的HTTP鏈接來啟動APP(如果iOS設備上已經安裝了你的app,不管在微信里還是在哪里), 或者打開網頁(iOS設備上沒有安裝你的app)。
下面簡單說下怎么使用Universal Links,具體的可以看官方的說明文檔
怎么使用Universal Links
1.先決條件:你必須有一個域名,且這個域名需要支持https。
2.需要在開發者中心做配置:找到對應的App ID,在Application Services列表里有Associated Domains一條,把它變為Enabled就可以了。
配置App ID支持Associated Domains:

3.打開工程配置中的Associated Domains,在其中的Domains中填入你想支持的域名,必須以applinks:為前綴。

{ "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文件。
驗證
在iOS設備中的備忘錄中輸入App能識別的鏈接,然后直接點擊此鏈接,就會直接跳轉到你的app了。或是長按,在出現的彈出菜單中第二項是在’XXX’中打開
,這也代表着成功:

在”XX”應用中打開
:

在微信的網頁瀏覽器中也是可以的,雖然微信屏蔽了所有的scheme方式跳轉到其它app,但是Universal Links是由系統直接處理的,微信屏蔽不了,這也就實現了從微信跳轉到我們的app。
蘋果為了方便開發者,提供了一個網頁來驗證我們編寫的這個apple-app-site-association是否合法有效,進入驗證網址進行驗證:

進入app后的處理
現在用戶點擊某個鏈接,直接可以進我們的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; }
注意
前端開發經常面臨跨域問題,必須要求跨域,如果不跨域,就不行。
只有當前webview的url域名,與跳轉目標url域名不一致時,Universal Link 才生效。
好了先說到這里,如果遇到什么問題可以詳細看官方的說明文檔。
問題匯總
-
按照上面寫的配好了,怎么死活打不開呀???
1.支持https呀,一定要是符合蘋果認證的https證書呀。
2.系統問題,確保iOS9以上
3.配置文件問題,apple-app-site-association
文件中配置的path和測試用的通用鏈接不一致,注意是區分大小寫的。
4.域名問題,xcode中配置的域名一不小心寫錯了。
-
為毛有的手機成功了,有的手機就不行呢???
1.上面也提到過,因為網絡波動有可能會導致部分用戶第一次安裝時,無法下載apple-app-site-association
文件,這個只能引導用戶刪除重裝或者在迭代時修改Associated Domains配置告訴系統重新下載apple-app-site-association
文件。
2.另外一種可能是蘋果抽風導致,筆者今年年初一碰到過一個蛋疼的問題,從中午一直到下午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判斷當前所處的平台以及其系統。
如果是安卓用戶,則顯示安卓相關提示頁面。
如果是蘋果用戶,那么分兩種:
1、如果是9以上的系統,相關的“在app內打開”按鈕的鏈接配置的就是我們的通用鏈接Universal Links了,且該通用鏈接地址指向的是一個 app下載引導頁面,那么當用戶安裝了app,即可通過通用鏈接喚醒app;如果用戶沒有安裝app,那么就會跳轉到通用鏈接指向的app下載引導頁面,達到最大化的客戶導流。
2、如果是9以下的系統,則由web童鞋在當前頁面添加一個 “右上角在safari打開”,相應的 “在app內打開”的按鈕就會發一個 跳轉到我們app schema的重定向,以實現在safari中喚醒我們的app。
-
當使用通用鏈接喚醒app之后,手機右上角有一個小按鈕?
那個小按鈕是可以引導用戶跳轉到safari中,名字叫bread crumbs button(面包屑),當然也去不掉。
-
備忘錄和safari中都可以打開app,怎么分享到其他app里面就不行了?
未跨域導致的,如:分享到微信的鏈接是 https://www.mydomain.com/share.html,然后該網頁中的“在app內打開”按鈕配置的通用鏈接為 https://www.mydomain.com/index.html。
跨域的意思是說,通用鏈接 和 調用通用鏈接的網頁不要使用同一域名。
即如果通用鏈接域名為“www.mydomain.com”,則通用鏈接所處的網頁域名就不能是“www.mydomain.com”。