iOSDeepLink調研與實踐

NO IMAGE

什麼是DeepLink

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

URL Scheme (iOS8以上可用)

我們通常只能使用scheme。這種方式需要通過safari中喚醒APP,但是這種方式需要提前判斷系統中是否安裝了能夠響應此scheme的app,並且這種方式在微信等中是被禁用了的。如果沒有安裝app則該鏈接變成了無效鏈接。

1. 如何支持 URL Scheme

設置info.plist

iOSDeepLink調研與實踐

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

2. 原理

iPhone在安裝應用時可以檢測到info.plist文件中是否有CFBundleURLTypes,如果存在則將相應的schemes註冊到系統中,如有其它app通過

UIApplication.shared.openURL(URL(string: "rrddl://renrendai.com")!)

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

3. 如何限制url打開app

如果不想被其它應用無端調起可以在AppDelegateopen url方法中通過host和path等條件加以限制。

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的用戶沒有引導作用。

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

Universal Links

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

一、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。

二、如何讓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?

iOSDeepLink調研與實踐

4. paths規則

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

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

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

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

5. app IDs 配置

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

iOSDeepLink調研與實踐

6. 項目配置

iOSDeepLink調研與實踐

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
}

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

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

短鏈服務器端的相關實現

參考資料

蘋果官方文檔

好的文章

遇到問題:

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

廣告時間

最後慣例,歡迎大家star我們的人人貸大前端團隊博客,所有的文章還會同步更新到知乎專欄掘金賬號,我們每週都會分享幾篇高質量的大前端技術文章。如果你喜歡這篇文章,希望能動動小手給個贊。

相關文章

一文理解Netty模型架構

當Kotlin愛上React,會發生什麼反應

Gin(九):生成restful接口

JSI小試牛刀——Native同步調用JS代碼