一、Deep Link 、 URL Schemes
1. 什么是 Deep Link?
Deep Link就是一個鏈接的概念,事實上我們每天都會使用到它去打開一個網(wǎng)站頁面,只不過它是比普通的鏈接更加復(fù)雜一些。在web開發(fā)領(lǐng)域,深度鏈接就是說這個鏈接不是僅僅打開一個網(wǎng)站http://example.com/, 而是直接地打開這個網(wǎng)站中的某個具體內(nèi)容頁面http://example.com/my-awesome-content-page 。 通常來講,有很多鏈接就是深度鏈接,只不過大家都習(xí)慣于稱之為鏈接。
在移動開發(fā)領(lǐng)域,深度鏈接的概念就是指app在處理特定的url時能夠直接跳轉(zhuǎn)到對應(yīng)的內(nèi)容頁面或者觸發(fā)特定的邏輯。這樣的好處有:
- 在 Web 頁面和 App 的切換過程中保留了上下文
- 在 App之間的切換保留了上下文,實現(xiàn) App 之間參數(shù)的傳遞
- Web 頁可以被搜索引擎索引,可以增加 SEO 的訪問量從而提高 App 下載量和開啟率
Android、iOS 都推出了相應(yīng)的概念去實現(xiàn)深鏈接。于是就有 Universal Link、App Link、URL Schemes。
2. 什么是 URL Schemes?
- 網(wǎng)址相信大家都很了解了,其實
URL Scheme跟網(wǎng)址差不多。 - Scheme 一般完整格式是
scheme://host:port/path,而 scheme 表示 URL 的第一個位置。 - 比如微信的 URL Scheme
weixin://dl/business/?t=123放在瀏覽器,就能打開微信,跳轉(zhuǎn)相應(yīng)頁面
3. 如何讓一個 App 支持 Custom URL Scheme?
- 注冊一個
URL Type,注冊方法就是在 app 的 info.plist 文件里面添加CFBundleURLTypes鍵,它包含了一個由多個字典組成的數(shù)組,每一個字典定義了這個 app 支持的 URL Scheme。
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>com.szy.seebaby</string>
<key>CFBundleURLSchemes</key>
<array>
<string>ztjy.parent.applink</string>
</array>
</dict>
4. 那如果你的 APP 收到一個來自 URL Scheme 的跳轉(zhuǎn),在哪里處理 URL Scheme 呢?
- 在 app delegate 的
application:openURL:options:方法回調(diào)中處理
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
BOOL handled = NO;
// code to handle the URL
return handled;
}
二、 Universal Link
1. 什么是 Universal Link?
-
Universal Link是蘋果在 iOS9 之后推出的用于代替Custom URL Scheme的新概念 - 通俗講,就是用了這個 Universal Link,就可以讓網(wǎng)站或者 Web View中的內(nèi)容在用戶點擊跳轉(zhuǎn)或安裝了 app 之后仍然能直接在這個 app 中被找到。
- 比如,用戶在官網(wǎng)上點擊了 “在app中瀏覽該商品” 的鏈接,這個時候就可以通過 Universal Link 去喚起這個 app,同時直接定位到該商品頁面。
2. Universal Link 的好處(至少說兩個吧)?
- ① 之前的 Custom URL scheme 是自定義的協(xié)議,因此在沒有安裝該 app 的情況下是無法直接打開的。而 Universal Link 本身就是一個能夠指向一個 web 頁面或者 app 中的內(nèi)容頁的標(biāo)準(zhǔn)web link(形如 https://example.com )因此能夠很好的兼容其他情況。
- 也就是說,當(dāng)已經(jīng)安裝了這個 app 的時候,不需要加載任何 web 頁面,app 就會立即啟動;當(dāng)這個 app 沒有安裝的時候,就會默認(rèn)地從當(dāng)前瀏覽器中重定向到 App Store 中引導(dǎo)用戶去下載安裝這個 app。
- ② Universal Links 是從開發(fā)者的服務(wù)器上查詢是哪個 app 需要被打開,因此不存在 Custom URL Scheme 那樣名字被占用、沖突的情況。
- ③ Universal Link 支持從其他 app 中的 UIWebView 中跳轉(zhuǎn)到目標(biāo) app
- ④ 安全性,用 Universal Link 去打開的時候,只有你(開發(fā)這個 APP 的人)可以通過創(chuàng)建和上傳允許這個網(wǎng)頁去通過這個 URL 打開你的 app 的文件。
- ⑤ 隱私性,提供 Universal Link 給別人的 app 進(jìn)行 app 之間的交流,然而對方并不能夠用這個方法取檢測你的 app 是否被安裝。(之前的 Custom URL Scheme 的 canOpenURL 方法可以)
3. 如何讓 app 支持 Universal Link?
Universal links 的具體實現(xiàn)可以參考官方文檔:Support Universal Links。簡單來說你需要:
- 添加一個
apple-app-site-association文件到你的網(wǎng)站來描述 URL 和 app 的關(guān)聯(lián)。 - 添加
com.apple.developer.associated-domainsentitlement 來指定要從哪些域名查詢 universal links support。 - 在
app delegate的application:continueUserActivity:restorationHandler:方法中 handleuserActivity.webpageURL。
4. 用 UIApplication 的 openURL: 和 canOpenURL: 有什么使用注意事項嗎?
-
canOpenURL 操作 Universal Link:永遠(yuǎn)返回YES。 -
canOpenURL 操作 Custom URL Scheme:方法的結(jié)果受info.plist中聲明的Scheme的配置限制;如果info.plist有配置返回YES;如果info.plist沒配置返回NO。 -
openURL 操作 Universal Link:可以直接打開對應(yīng) app(不受info.plist文件影響);如果沒有安裝對應(yīng)app,則打開safari瀏覽器展示網(wǎng)頁。 -
openURL 操作 Custom URL Scheme:如果有安裝對應(yīng) app 可以直接打開對應(yīng) app(不受info.plist文件影響);如果沒有安裝對應(yīng)app,則沒有任何反應(yīng),openURL函數(shù)返回NO。
三、Deferred Deep Link
然而,無論是URI Scheme還是Universal Link都沒有解決一個問題,就是如果設(shè)備上沒有安裝這個app的時候,保留住此時用戶停留的上下文。例如,利用Universal Link,在沒有安裝app的情況下,iOS能夠重定位到app store去引導(dǎo)用戶去下載安裝這個app,但是在安裝之后,app只能打開首頁,也就是說丟失了用戶在點擊跳轉(zhuǎn)進(jìn)入app之前的那個頁面。
因此,有了一個非常重要的另一個概念:Deferred Deep Link。顧名思義,這里的deferred是延遲的意思,可以理解為延遲一下,在安裝過程中keep住跳轉(zhuǎn)前的特定頁面內(nèi)容,在app安裝之后,再利用這個link在app里進(jìn)行跳轉(zhuǎn)。舉個例子,用戶在某個電商網(wǎng)站上看到一個商品,于是他點擊了一個按鈕“在app中查看該商品”,但他并沒有下載這個app,于是iOS就引導(dǎo)他到了App Store安裝這個app,當(dāng)他安裝完成之后,打開這個app,就會自動地在app中跳到他剛才想看的那個商品的頁面。這對于商家來說,也就大大提高了用戶的轉(zhuǎn)化率。