iOS 中的 Deep Link 、 URL Schemes、Universal Link

一、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-domains entitlement 來指定要從哪些域名查詢 universal links support。
  • app delegateapplication:continueUserActivity:restorationHandler: 方法中 handle userActivity.webpageURL

4. 用 UIApplicationopenURL: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

餓了么測試 UniversalLink:
https://links.ele.me/stage/download.html?url=eleme%3A%2F%2Fweb%3Faction%3Dali.open.nav%26module%3Dh5%26packageName%3Dme.ele.ios.eleme%26bc_fl_src%3Dlocallife_wtdsp_33440ec21531ffb76841220d57181d65_2684284_21625822188530a19b28bfe99f43cc93d2e5e426567b8f_1%26url%3Dhttps%253A%252F%252Ffc.ele.me%252Fa%252FODE0NDg2MWI0YjFjMTFlYjlhM2QwMjQyMGI1OWUxMjQ%253D%253Fo2i_dsp_channel%253D2%2526shop_id%253D6D0BF4828A0FE2C786638025B7843E14%2526one_id%253D80220634652047782%2526business%253D1%2526item_id%253DE57408B08AC5763F6D9BF151C377BF7B4C5CE50DF9EB6878%2526o2i_code%253D33440ec21531ffb76841220d57181d65%2526latitude%253D39.6154%2526o2i_snid%253D21625822188530a19b28bfe99f43cc93d2e5e426567b8f%2526o2i_deviceid%253D1389b999e85a4e0c774440b5f532e4ff%2526isCharge%253D0%2526city_id%253D%2526longitude%253D118.18012%2526o2i_islp%253D1%26source%3Ddsp_2%26o2i_code%3D33440ec21531ffb76841220d57181d65%26o2i_snid%3D21625822188530a19b28bfe99f43cc93d2e5e426567b8f%26fastmode%3D1&fastmode=1

淘寶測試 UniversalLink:
https://ace.tb.cn/t?smburl=tbopen%3A%2F%2Fm.taobao.com%2Ftbopen%2Findex.html%3Fsource%3Dauto%26action%3Dali.open.nav%26module%3Dh5%26bootImage%3D0%26spm%3D2014.ugdhh.2200803434083.226906-443901-32896%26bc_fl_src%3Dgrowth_dhh_2200803434083_226906-443901-32896%26materialid%3D226906%26h5Url%3Dhttps%253A%252F%252Fstar-link.taobao.com%253Fslk_actid%253D100000000323%2526spm%253D2014.ugdhh.2200803434083.226906-443901-32896%2526bc_fl_src%253Dgrowth_dhh_2200803434083_226906-443901-32896%2526activity_id%253D521012716

三、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)化率。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容