一、前言
項目中時常有這種需求, 是通過鏈接跳轉到應用內部,現在iOS主流的方案有兩個
- Schema: 常用在於一個應用跳轉到另一個應用內部,屬於應用間的跳轉。當然ios9以下,網頁可以通過schema://跳轉到App內部。但是這種方式跳轉比較生硬,在每次跳轉的時候都會彈框詢問。如果iPhone中如果沒有安裝則會直接彈出錯誤提示。
- Universal Links(通用鏈接): 常用於https鏈接來打開APP(手機中已經安裝此APP),或者跳轉到https鏈接(手機中沒有安裝此APP)。Universal Links就是一個通用鏈接,iOS9以上的用戶,可以通過點擊這個鏈接無縫的重定向到一個app應用,而不需要通過safari打開跳轉。如果用戶沒有安裝這個app,則會在safari中打開這個鏈接指向的網頁。
備注:
* 關於URL Schemes更多了解,可參考傳送門
* 關於Universal Links更多了解,可參考傳送門
二,需求場景
(1)第三方應用集成了友盟分享到QQ和微信的功能
(2)第三方應用分享了一個web頁面到微信或QQ
(3)打開分享的web頁面,點擊上面的某一個按鈕
(4)如果用戶安裝了該應用,直接打開應用根據web地址中的參數跳轉到對應的頁面
(5)如果用戶沒有安裝應用,直接跳轉到appStore
三,需求實現方案
iOS9 之后提供的 Universal Links 功能
四,需求實現步驟
(1)創建一個json文件,名稱必須為 apple-app-site-association,⚠️該文件不可帶 .json 的后綴名
apple-app-site-association 文件必須放在https服務器的根目錄下,例:https://kahui.huankaun.com 這個路徑下 ⚠️一定是根目錄,也就是說該文件必須是一級目錄,供下載使用
* apple-app-site-association 文件格式:
{ "applinks": { "apps": [], "details": [ { "appID": "teamID.bundleId", "paths": ["/deaplink","/wwdc/news/","*"] }, { "appID": "ABCD1234.com.apple.wwdc", "paths": [ "*" ] } ] } }
1)appID :
appID 格式為 teamID.bundleId形式,譬如說我的teamID
是xxxxxxxxxxx
,bundleId
是com.mytest.app
那么我的appID
就是:xxxxxxxxxxx.com.mytest.app。
teamID:打開蘋果官網,點擊Account,點擊左邊欄的 Membership,查找teamID
2) paths:
設定一個App的路徑支持列表,只有這些指定的路徑鏈接才會被App所處理。格式如下:
"paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/*", "/videos/wwdc/201?/*"]
-
使用
*
配置,則整個網站都可以使用 -
使用特定的URL,例如
/wwdc/news/
來指定某一個特殊的鏈接。 -
在特定URL后面添加
*
,例如/videos/wwdc/2015/*
, 來指定網站的某一部分。如果你的網站是www.yohunl.com,你的path寫的是”/support/*”,那么當用戶點擊www.yohunl.com/support/myDoucument,就可以進入你的app了,相反www.yohunl.com/other 就不會. -
除了使用
*
來匹配任意字符,你也可以使用?
來匹配單個字符,你可以在路徑當中結合這兩個字符使用,例如/foo/*/bar/201?/mypage
需要注意的是:
配置的paths路徑,是區分大小寫的
* 驗證apple-app-site-association
文件
文件配置完成之后,將其上傳到你的服務器根目錄或者.well-known
這個子目錄下。
- 確保使用
https://yourdomain.com/apple-app-site-association
這個鏈接可以訪問到,yourdomain.com
為你的服務器域名。 - 也可以使用蘋果的驗證網站,驗證文件是否能被蘋果請求到。如果是未上線的應用,使用驗證網站時可能出現如下提示:
- 出現該提示為
apple-app-site-association
文件配置正確。 - 出現
404
錯誤碼提示,則為apple-app-site-association
文件未上傳成功,或者使用https://yourdomain.com/apple-app-site-association
路徑無法訪問。
(2) 建立web網頁和app應用之間的關聯 -> app IDs
配置 和 項目配置
app IDs 配置
進入開發者網站,找到你自己的bundleId
,可以點擊edit
按鈕,開啟associate domains
,如下圖:


項目配置
在項目的Capablities
中開啟Associated domains
,如下圖:


domains
可以添加多個,前綴必須為
applinks:
,
applinks:
后為你的服務器的域名。
代碼接收Universal Links喚醒
-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{ NSLog(@"userActivity : %@",userActivity.webpageURL.description); return YES; }
在appdelegate中實現上面這個方法,當使用Universal Links喚醒app時就執行這個方法。
(3)驗證以上配置
快捷驗證,在備忘錄中輸入https://yourdomain.com/apple-app-site-association
,長按這個鏈接,出現下圖提示則配置成功。

當沒有安裝該應用時的處理方式是:上傳該html文件到 kahui.huankaun.com 路徑下,如下圖:
<!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>神機算萬年歷-跳轉中...</title> </head> <body> <script type="text/javascript"> setTimeout(function(){ window.location = "第三方在應用寶的下載鏈接" },3000)//延遲3s,給手機調起已安裝應用,如果不能調起就調用下載鏈接。 </script> </body> </html>
備注:如果我們在手機上沒有安裝相應的應用,就可以通過Universal Links重定向進行跳轉到下載也進行下載操作。因為我們在paths設置了路徑限制,只要我們重定向的路徑符合限制,就能先走本地是否安裝程序,如果沒有再跳轉到相應下載頁。