iOS DeepLink 調研與實踐

什麼是DeepLink

使用統一資源標識符(URI)連接到一個App中特定的位置,而不是簡單地打開App。 用戶未安裝App的狀況下,同樣能夠在用戶安裝App後從新還原用戶以前預覽的頁面。常見的有如下2種實現方式。html

URL Scheme (iOS8以上可用)

咱們一般只能使用scheme。這種方式須要經過safari中喚醒APP,可是這種方式須要提早判斷系統中是否安裝了可以響應此scheme的app,而且這種方式在微信等中是被禁用了的。若是沒有安裝app則該連接變成了無效連接。前端

1. 如何支持 URL Scheme

設置info.plistgit

假如我 URL Schemes填寫的是 rrddlIdentifier填寫的是 renrendai.com。那麼我就能夠在safari地址欄中輸入 rrddl://renrendai.com來打開咱們的app。

2. 原理

iPhone在安裝應用時能夠檢測到info.plist文件中是否有CFBundleURLTypes,若是存在則將相應的schemes註冊到系統中,若有其它app經過github

UIApplication.shared.openURL(URL(string: "rrddl://renrendai.com")!)
複製代碼

或者safari打開時,系統會查找已註冊的Schemes來啓動對應的app。web

3. 如何限制url打開app

若是不想被其它應用無故調起能夠在AppDelegateopen url方法中經過host和path等條件加以限制。json

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    let components = URLComponents(string: url.absoluteString)
    let pathPool = ["dl", "h5", "tab"]
    if pathPool.contains(components?.path ?? "") {
        JumpManager.handel(url) //處理url跳轉
        return true
    }
    return false
}
複製代碼

缺點

1.不能檢測用戶是否安裝了app,對沒有安裝app的用戶沒有引導做用。api

2.沒有惟一的應用標識,沒法保證用戶不會安裝註冊相同URL方案的第三方app。跨域

Universal Links

Universal Links就是一個通用連接,iOS9以上的用戶,能夠經過點擊這個連接無縫的重定向到一個app應用,而不須要經過safari打開跳轉。若是用戶沒有安裝這個app,則會在safari中打開這個連接指向的網頁。(現已被微信封禁)bash

1、Universal Link的基本運做流程

1 app第一次安裝或者版本更新後第一次啓動,app向工程裏配置的域名發起Get請求拉取apple-app-association這個Json文件。服務器

2 app將apple-app-association註冊給系統。

3 由iPhone上的任意webView發起跳轉的url(在webKit作了處理),若是是apple-app-association註冊的通用連接則打開App,觸發Universal Link delegate;沒命中,webView繼續跳轉url。

2、如何讓app支持Universal Links

1.建立一個名字叫作apple-app-site-association,包含固定格式的json文件

{
"applinks": {
        "apps": [],
        "details": [
            {
                "appID": "teamID.bundleId",
                "paths": ["/deaplink","/wwdc/news/","*"]
            }
        ]
    }
}
複製代碼

注意:

appID 的格式爲teamID.bundleId形式。

apple-app-site-association不能帶後綴名

2. apple-app-site-association放置位置

1.文件配置完成以後,將其上傳到你的服務器根目錄或者.well-known這個子目錄下(iOS 9.3才能夠)

2.確保使用https://yourdomain.com/apple-app-site-association 這個連接能夠訪問到,yourdomain.com爲你的服務器域名。

3. 在哪裏獲取TeamID?

4. paths規則

1.使用*配置,則整個網站均可以使用。

2.使用特定的URL,例如/user/home來指定某一個特殊的連接。

3.在特定URL後面添加*,例如/user/*, 來指定網站的某一部分。

4.除了使用*來匹配任意字符,你也可使用 ?來匹配單個字符,你能夠在路徑當中結合這兩個字符使用,例如 /user/*/201?

5. app IDs 配置

進去登陸蘋果開發者中心,在identifiersApp IDs 打開Associated Domains開關。

6. 項目配置

domains能夠添加多個,前綴必須爲 applinks:applinks:後爲你的服務器的域名。值得注意的是要想觸發Universal Link攔截必須跨域,假如Universal Link配置的是 wx.renrendai.com 這個域名,而且對這個域名下好比 /point /home /userurlPath進行了識別,也就是說只有當你訪問 https://wx.renrendai.com/point/xxx 纔會觸發Universal Link攔截,而正經的Url https//www.renrendai.com/point/xxx 是不會觸發Universal Link的攔截。

7. 項目中須要作的處理

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == "NSUserActivityTypeBrowsingWeb" {
        let url = userActivity.webpageURL
        JumpManager.handel(url) //處理url跳轉
        return true
    }
    return false
}
複製代碼

3、驗證Universal Links配置是否成功

  1. 快捷驗證,在備忘錄中輸入https://yourdomain.com/apple-app-site-association 長按這個連接,出如今XXXapp打開即爲成功。(在信息裏同理)
  2. 使用 蘋果官方驗證驗證文件是否能被蘋果請求到。

短鏈服務器端的相關實現

參考資料

蘋果官方文檔

好的文章

遇到問題:

  1. 官網說apple-app-site-association放置在服務器根目錄或者.well-known這個子目錄下便可,在真機模擬是發如今iOS9.3-iOS12 請求的地址是在.well-known下而非根目錄下

廣告時間

最後慣例,歡迎你們star咱們的人人貸大前端團隊博客,全部的文章還會同步更新到知乎專欄掘金帳號,咱們每週都會分享幾篇高質量的大前端技術文章。若是你喜歡這篇文章,但願能動動小手給個贊。

相關文章
相關標籤/搜索