理解Deep Link & URI Schemes & Universal Link & App Link

引言

最近在做客戶端開發(fā)的工作中,需要解決一些渠道流量監(jiān)控的問題疙剑。發(fā)現(xiàn)在喚醒app的時候涉及到很多這樣那樣的link,于是就先對這幾個link做了一些了解践叠。
事實上言缤,這幾個名詞并不是完全區(qū)分的關(guān)系,同時這些技術(shù)都仍處在不斷發(fā)展的階段禁灼,因此面對這樣碎片化的概念管挟,很難去直接解釋清楚它們之間的關(guān)系與不同,所以只能先從每個名字的概念上和實踐運用中去把握了弄捕。
而且僻孝,這幾個概念實際上是有一些從屬和時間上的關(guān)系的,其實也不復(fù)雜守谓,只是我們不光是要了解它們的意思穿铆,還得了解它們出現(xiàn)的情況,怎么使用斋荞。下面我就為大家簡單介紹:

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 悦陋。 通常來講,有很多鏈接就是深度鏈接筑辨,只不過大家都習慣于稱之為鏈接俺驶。
在移動開發(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. URI Schemes

URI、URL凭舶、URN

有興趣了解更多的話可以直接看這篇文章: The Difference Between URLs and URIs
這里我就直接捋一捋URI晌块、URL、URN的關(guān)系帅霜。
首先匆背,先看一下它們?nèi)齻€分別的英文全稱:

  • URI : universal resource identifier
  • URL : universal resource locator
  • URN : universal resource name
    這里可以看出,URI就是一個資源的統(tǒng)一標志符身冀,它既可以是定位符也可以是一個名稱钝尸,因此URL、URN都屬于URI搂根。

如何區(qū)分URL和URN珍促?

URL包含了找到資源的方法(路徑)和資源名稱,也就是當一個URI包含了一個訪問機制或者網(wǎng)絡(luò)位置的時候(e.g. http// or ftp://)剩愧,它就是一個URL了猪叙。
URN就是一個獨一無二的資源名稱,它是由urn開頭的一串URI仁卷。
e.g. urn:oasis:names:specification:docbook:dtd:xml:4.1.2
所以說穴翩,它們之間重要的區(qū)別就在于它的開頭,也就是Scheme.

URI Schemes

大家應(yīng)該都對http:// 非常熟悉锦积,而它就是一個scheme芒帕,也就是一個url的開頭部分。
有興趣也可以去看我在之前寫過一篇關(guān)于URL scheme的介紹:iOS-URL Schemes 充包。而有了以上概念之后副签,我們可以了解到遥椿,實際上scheme不僅僅可以指URL的開頭,URI的開頭也一樣的是scheme淆储。

那么回到正題冠场,來講它和deep link的關(guān)系。URI Schemes其實就是實現(xiàn)deep linking的第一代解決方案本砰。利用它就可以在移動開發(fā)中實現(xiàn)從web頁面或者別的app中喚起自己的app的功能碴裙,然而開發(fā)者們很快就發(fā)現(xiàn),這樣也還有很多限制:

  • 當要被喚起的app沒有安裝時点额,這個鏈接就會出錯舔株。
  • 當注冊有多個scheme相同的時候,目前沒有辦法區(qū)分还棱。

因此為了解決以上問題载慈,蘋果和安卓都有了自己的第二套解決方案,分別是iOS的Universal Link珍手,和安卓的App Link办铡。

Custom URL Scheme

iOS在之前的很長一段時間內(nèi)用來實現(xiàn)deep linking以及app間通信的方法就是上面提到的,被叫做custom URL scheme琳要。處理的方法就是:

  1. 注冊一個URL type寡具,注冊的方法就是在app的info.plist文件里添加 CFBundleURLTypes 鍵,它包含了一個由多個字典組成的數(shù)組稚补,每一個字典定義了這個app支持的一個URL scheme
Key Value
CFBundleURLName 一個包含了URL Scheme的抽象名字的字符串童叠。為了保證它的唯一性,通常需要明確一個reverse-DNS的identifier课幕,同時還應(yīng)該保證它的可讀性厦坛。
CFBundleURLSchemes 一個包含了多個URL Scheme names的字符串數(shù)組。
  1. 用到application:willFinishLaunchingWithOptions:application:didFinishLaunchingWithOptions:這兩個方法去取回關(guān)于URL的信息同時決定是否要打開它撰豺。
  2. 在app delegate中實現(xiàn)入口方法:application:openURL:sourceApplication:annotation:或者application:openURL:options: 粪般。前一個方法從iOS9后開始被淘汰拼余,后一個方法是在iOS 9 之后引入的污桦,若果沒有實現(xiàn)這個方法,在iOS 9 上也還是會向前兼容調(diào)用第一個老的方法匙监,因此現(xiàn)在一般還是實現(xiàn)老方法)凡橱。

在iOS中,所有傳到app中的URL都是一個NSURL的對象亭姥,你可以定義URL的組成稼钩,但NSURL都遵守RFC 1808的一些規(guī)則,所以它支持大多數(shù)的傳統(tǒng)URL組成規(guī)則达罗。NSURL類中還有能夠返回URL中的不同部分的方法坝撑,包括URL中的user静秆、password、query巡李、fragment抚笔、parameter strings等常見部分。
對于業(yè)務(wù)邏輯較少的app來說侨拦,可以直接通過url的字符串比較來區(qū)分業(yè)務(wù)邏輯殊橙。不過對于業(yè)務(wù)邏輯相對復(fù)雜,比如像現(xiàn)在開發(fā)團隊共同維護這塊邏輯的時候狱从,就需要引入路由router來分發(fā)請求膨蛮。在做上一個需求的時候有涉及,這里就不展開說了季研。

3. Universal Link

什么是Universal Link?

而iOS 9之后蘋果推出的一個替代之前的custom URL Scheme的新概念就是Universal Link敞葛。在蘋果開發(fā)者中可以看到對它的介紹是:

Seamlessly link to content inside your app, or on your website in iOS 9 or later. With universal links, you can always give users the most integrated mobile experience, even when your app isn’t installed on their device.

通俗講,就是用了這個Universal Link与涡,就可以讓網(wǎng)站或者web view中的內(nèi)容在用戶點擊跳轉(zhuǎn)或安裝了app之后仍然能夠直接在這個app中被找到制肮。比如,用戶在官網(wǎng)上點擊了“在app中瀏覽該商品”的鏈接递沪,這個時候就可以通過Universal Link去喚起這個app豺鼻,同時直接定位到該商品頁面。

它的實現(xiàn)機制與之前的Deep Link相似款慨,只不過它不是只定義一個custom URL scheme儒飒,而是匹配了多個web頁面到app中相應(yīng)的位置,當用戶打開某個匹配的頁面時檩奠,iOS會自動地將其重定向到app內(nèi)桩了。

Universal Link的好處

接下來說Universal Link厲害的地方:

  1. 之前的Custom URL scheme是自定義的協(xié)議,因此在沒有安裝該app的情況下是無法直接打開的埠戳。而Universal Links本身也就是一個能夠指向一個web頁面或者app中的內(nèi)容頁的標準的web link(形如https://example.com) 因此能夠很好的兼容其他情況井誉。也就是說,當已經(jīng)安裝了這個app的時候整胃,不需要加載任何web頁面颗圣,app就會立即啟動;當這個app沒有安裝的時候屁使,就會默認地從當前瀏覽器中重定向到App Store中引導用戶去下載安裝這個app在岂。
  2. Universal links是從服務(wù)器上查詢是哪個app需要被打開,因此不存在Custom URL scheme那樣名字被搶占蛮寂、沖突的情況蔽午。
  3. Universal links支持從其他app中的UIWebView中跳轉(zhuǎn)到目標app
  4. 安全性,用universl link去打開的時候酬蹋,只有你(開發(fā)這個app的人)可以通過創(chuàng)建和上傳一個允許這個網(wǎng)頁去通過這個URL去打開你的app的文件及老。
  5. 隱私性抽莱,提供Universal link給別的app進行app間的交流,然而對方并不能夠用這個方法去檢測你的app是否被安裝骄恶。(之前的custom scheme URL的canOpenURL方法可以岸蜗,具體可以看這里iOS Review-DetectScheme。)

使用Universal Link

首先叠蝇,你需要創(chuàng)建一個 apple-app-site-association文件璃岳,它是一些JSON格式的數(shù)據(jù),提供了你的app能夠處理的URLs悔捶。然后你需要將這個文件上傳到你的HTTPS web 服務(wù)器上铃慷。之后就是一些準備工作來處理這個Universal Link,有兩種技術(shù)蜕该,Web Browser–to–Native App HandoffShared Web Credentials Reference犁柜。

當一個用戶點擊了這個universal link,iOS就會啟動你的app堂淡,然后會傳入一個NSUserActivity的對象馋缅,讓你能夠查詢到你的app是如何被啟動的。要實現(xiàn)這些绢淀,你需要做以下步驟:

  • 添加一個權(quán)限(entitlement)萤悴,用來具體說明你的app支持哪些域(domains)。
    具體在xcode中皆的,就是在Capabilities欄中找到Associated Domains覆履,在里面添加以applinks:為前綴的域。如圖:
Associated Domains
  • 寫app delegate的方法费薄,使之在收到NSUserActivity對象的時候能夠做出適當?shù)捻憫?yīng)硝全。尤其是application:continueUserActivity:restorationHandler:

當你的app在用戶點擊universal link后被啟動的時候楞抡,就會收到一個NSUserActivity對象伟众,里面包括了值為NSUserActivityTypeBrowsingWeb的activityType。利用這個對象的webpageURL屬性中的URL召廷,就可以知道用戶正在訪問的URL地址凳厢。另外,因為這個webpageURL屬性通常都會包括HTTP或者HTTPS URL柱恤,所以你還可以用NSURLComponents APIs去操縱這個URL的內(nèi)容数初。

Universal Link的缺陷

在講它的缺陷之前找爱,我先介紹一下iOS的Universal link的一個機制:
在用戶點擊了Universal link之后梗顺,iOS會去檢測用戶最近一次是選擇了直接打開app還是打開網(wǎng)站。這個選擇的步驟车摄,實際上是在用戶進入了app之后寺谤,頂部bar的右側(cè)會出現(xiàn)一個通過網(wǎng)站打開的按鈕選項仑鸥。如圖:

bar

因此,一旦用戶點擊了這個選項变屁,他就會通過safiri打開你的網(wǎng)站眼俊。并且在之后的操作中,默認一直延續(xù)這個選擇粟关,除非用戶從你的webpage上通過點擊Smart App Banner上的OPEN按鈕來打開疮胖。也就是說,用戶非常容易在一次選擇之后闷板,使得Universal link喚醒app的功能失效了澎灸。

4. Deferred Deep Link

然而,無論是URI Scheme還是Universal Link都沒有解決一個問題遮晚,就是如果設(shè)備上沒有安裝這個app的時候性昭,保留住此時用戶停留的上下文。例如县遣,利用Universal Link糜颠,在沒有安裝app的情況下,iOS能夠重定位到app store去引導用戶去下載安裝這個app萧求,但是在安裝之后其兴,app只能打開首頁,也就是說丟失了用戶在點擊跳轉(zhuǎn)進入app之前的那個頁面夸政。
因此忌警,有了一個非常重要的另一個概念:Deferred Deep Link。顧名思義秒梳,這里的deferred是延遲的意思法绵,可以理解為延遲一下,在安裝過程中keep住跳轉(zhuǎn)前的特定頁面內(nèi)容酪碘,在app安裝之后朋譬,再利用這個link在app里進行跳轉(zhuǎn)。舉個例子兴垦,用戶在某個電商網(wǎng)站上看到一個商品徙赢,于是他點擊了一個按鈕“在app中查看該商品”,但他并沒有下載這個app探越,于是iOS就引導他到了App Store安裝這個app狡赐,當他安裝完成之后,打開這個app钦幔,就會自動地在app中跳到他剛才想看的那個商品的頁面枕屉。這對于商家來說,也就大大提高了用戶的轉(zhuǎn)化率鲤氢。

其他 Deep Link標準

這里介紹的主要都是針對于iOS開發(fā)中使用到的deep link標準搀擂,那么對應(yīng)安卓開發(fā)西潘,同樣也有類似的標準,大家可以自主了解:

  • Facebook App Links
  • Android App Links
  • Chrome Intents

后話

目前哨颂,移動開發(fā)Deep Link領(lǐng)域?qū)嶋H上仍然是處于一種碎片式混亂的局面喷市,有很多問題都還有待解決,距離達到一個工業(yè)級別的標準還很遠威恼。然而品姓,利用現(xiàn)有的技術(shù)去不斷優(yōu)化用戶的體驗是每一個客戶端開發(fā)工程師的使命,所以我們沒有任何理由去抗拒變革箫措,在目前沒有統(tǒng)一的標準的情況下缭黔,我們能夠做到的就是,應(yīng)用不同的標準去適應(yīng)所有可能的情況。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市故河,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惧互,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喇伯,死亡現(xiàn)場離奇詭異喊儡,居然都是意外死亡,警方通過查閱死者的電腦和手機稻据,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門艾猜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捻悯,你說我怎么就攤上這事匆赃。” “怎么了今缚?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵算柳,是天一觀的道長。 經(jīng)常有香客問我姓言,道長瞬项,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任何荚,我火速辦了婚禮囱淋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘餐塘。我一直安慰自己妥衣,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著称鳞,像睡著了一般涮较。 火紅的嫁衣襯著肌膚如雪稠鼻。 梳的紋絲不亂的頭發(fā)上冈止,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音候齿,去河邊找鬼熙暴。 笑死,一個胖子當著我的面吹牛慌盯,可吹牛的內(nèi)容都是我干的周霉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼亚皂,長吁一口氣:“原來是場噩夢啊……” “哼俱箱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起灭必,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狞谱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后禁漓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跟衅,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年播歼,在試婚紗的時候發(fā)現(xiàn)自己被綠了伶跷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡秘狞,死狀恐怖叭莫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烁试,我是刑警寧澤食寡,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站廓潜,受9級特大地震影響抵皱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辩蛋,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一呻畸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悼院,春花似錦伤为、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叙甸。三九已至,卻和暖如春位衩,著一層夾襖步出監(jiān)牢的瞬間裆蒸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工糖驴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留僚祷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓贮缕,卻偏偏與公主長得像辙谜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子感昼,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 移動互聯(lián)時代装哆,很多互聯(lián)網(wǎng)服務(wù)都會同時具備網(wǎng)站以及移動客戶端,很多人認為APP的能幫助建立更穩(wěn)固的用戶關(guān)系定嗓,于是經(jīng)常...
    zyl04401閱讀 43,986評論 17 72
  • 最近我們有一個 DeepLink 的需求 用的是 Branch, 在這個過程中自然會涉及到 Universal L...
    天空中的球閱讀 15,025評論 10 35
  • 背景說明 通知相關(guān)的頁面跳轉(zhuǎn)POCT項目處于后臺狀態(tài)蜕琴,服務(wù)器發(fā)推信息到客戶端,客戶端在通知欄點擊消息蜕乡,進入App并...
    sycasl閱讀 1,301評論 0 1
  • 并不能說我已經(jīng)習慣用電腦打字的手感 而忘記了筆尖與紙張摩擦碰撞所迸發(fā)出來的靈感奸绷。 只是很多時候,在各種不適的情況下...
    白鹿與小寧閱讀 362評論 0 0
  • 01.平凡的忙碌 今天早上到學校門口的早餐店吃飯,進去的時候一個人都沒有辛块,我還納悶這正飯點的怎么一個顧客都沒有畔派,后...
    宋一二閱讀 3,494評論 9 18