Deep Link背景知識(shí)
Web鏈接不知道app的存在亡驰,當(dāng)在手機(jī)上打開(kāi)一個(gè)Jet.com這樣一個(gè)網(wǎng)頁(yè)鏈接饿幅,你會(huì)進(jìn)入到瀏覽器中打開(kāi)Jet.com網(wǎng)站,盡管你的手機(jī)上已經(jīng)安裝了Jet app栗恩。Deep Link解決的問(wèn)題就點(diǎn)擊一個(gè)網(wǎng)頁(yè)鏈接,能夠跳轉(zhuǎn)到對(duì)應(yīng)的app中磕秤。
傳統(tǒng)的deep link
傳統(tǒng)的deep link當(dāng)你在點(diǎn)擊鏈接的時(shí)候乳乌,能夠跳轉(zhuǎn)到相應(yīng)的app中市咆,只要你已經(jīng)安裝了app汉操。也就是如果手機(jī)上沒(méi)有安裝app蒙兰,跳轉(zhuǎn)至下載頁(yè)磷瘤。在iOS中芒篷,可以通過(guò)URL Scheme和Universe Link來(lái)實(shí)現(xiàn)。
deferred deep Link
deferred deep link是指用戶打開(kāi)一個(gè)web page的時(shí)候并沒(méi)有安裝對(duì)應(yīng)的app,在用戶安裝app以后打開(kāi)直接跳轉(zhuǎn)到鏈接對(duì)應(yīng)的內(nèi)容医窿。
實(shí)現(xiàn)思路:H5需要上報(bào)設(shè)備的一些信息到服務(wù)器端進(jìn)行保存糊识,用戶下載后摔蓝,第一次啟動(dòng)也上報(bào)設(shè)備信息,去服務(wù)器端查找是否有匹配的H5頁(yè)點(diǎn)擊行為拌滋,如果匹配則進(jìn)行app內(nèi)部跳轉(zhuǎn)猜谚。
應(yīng)該上報(bào)哪些信息更獲得比較高的匹配準(zhǔn)確率败砂?
Device Info
1> 前端獲取盡可能多的信息上報(bào)后臺(tái)進(jìn)行存儲(chǔ)
2> app啟動(dòng)時(shí)魏铅,同樣提供盡可能多的設(shè)備信息,向后臺(tái)查詢
3> 后臺(tái)根據(jù)相關(guān)設(shè)備信息以及前端和app端訪問(wèn)時(shí)間進(jìn)行模糊匹配览芳,匹配成功后向app返回?cái)?shù)據(jù)
支持設(shè)備無(wú)限制,無(wú)侵入性沧竟,理論成功率低,實(shí)踐成功率較高Paste Board
1> 前端生成唯一標(biāo)識(shí)符identifier悟泵,通過(guò)js腳本保存在剪貼板
2> 前端將identifier和其他數(shù)據(jù)上報(bào)后臺(tái),后臺(tái)進(jìn)行存儲(chǔ)
3> app啟動(dòng)時(shí)讀取剪貼板中的identifier魁袜,向后臺(tái)查詢數(shù)據(jù)
支持設(shè)備iOS10+,有侵入性峰弹,成功率高-
網(wǎng)頁(yè)和app共用Cookies
Github上的例子[2]
app內(nèi)SFSafariViewController和系統(tǒng)的safari是同一個(gè),共享同一個(gè)沙盒鞠呈,可以操作同一個(gè)cookie。
1> 啟動(dòng)本地服務(wù)器蚁吝,safari訪問(wèn)指定頁(yè)面設(shè)置cookie舀射,對(duì)應(yīng)于為XXXHost
2> 前端將相關(guān)數(shù)據(jù)上報(bào)后臺(tái),后臺(tái)解析cookie并與數(shù)據(jù)進(jìn)行綁定保存
3> app啟動(dòng)時(shí)怀伦,先開(kāi)啟SFSafariViewController,訪問(wèn)特定url邢羔,并攜帶設(shè)備id
4> 后臺(tái)解析上述訪問(wèn)url的設(shè)備id,并解析訪問(wèn)的cookie拜鹤,將cookie與設(shè)備id綁定
5> app請(qǐng)求api接口流椒,攜帶設(shè)備id,通過(guò)后臺(tái)查詢相關(guān)信息
app啟動(dòng)時(shí)SFSafariViewController設(shè)置為透明惯裕,用戶無(wú)法感知這一流程:蘋(píng)果審核指南:5.1.1
支持設(shè)備iOS9,iOS10绣硝,無(wú)侵入性
流程如下圖所示:
整體流程示意圖
現(xiàn)有的Deep Link成熟產(chǎn)品Branch links
翻譯自How Branch links work
Branch Links是一個(gè)成熟的Deep Link產(chǎn)品域那,查看其官方文檔有助于理解Deep Link在前端和后臺(tái)的多方面應(yīng)用及在前端和后臺(tái)的API設(shè)計(jì)猜煮。
1. 創(chuàng)建Links
- Mobile SDK
當(dāng)你集成了Mobile SDK,在你的app內(nèi)分享或者邀請(qǐng)另一個(gè)用戶的時(shí)候淑蔚,利用SDK發(fā)出請(qǐng)求愕撰,然后SDK返回一個(gè)Branch link。 - Web SDK
當(dāng)你集成了Web SDK搞挣,在的網(wǎng)頁(yè)內(nèi)一個(gè)用戶點(diǎn)擊分享或者邀請(qǐng)另一個(gè)用戶的時(shí)候,利用SDK發(fā)出請(qǐng)求仓犬,然后SDK返回一個(gè)Branch link舍肠。 - API
使用API批量生成Branch Link窘面,比如需要為郵件聯(lián)系人每一個(gè)人發(fā)一個(gè)唯一的link叽躯。 - Dynamic Long Links
不想通過(guò)SDK的API來(lái)創(chuàng)建links点骑,只是在自己的link后邊加上一些查詢參數(shù)。 - Quick Links
具體定制links的外觀等等畔况,通過(guò)Dashboard平臺(tái)訂制
2. links中攜帶數(shù)據(jù)
通過(guò)Dashboard的Quick Link Creator跷跪,可以為link添加任一額外的key-value數(shù)據(jù)馋嗜。建議添加如下字段:
說(shuō)明 | 例子 | |
---|---|---|
channel | 分發(fā)link的渠道 | Facebook, email, SMS |
feature | link的動(dòng)作 | share, invite, deal, gift |
campaign | link對(duì)應(yīng)的運(yùn)營(yíng)活動(dòng) | "Fall Sale"秋季促銷(xiāo), "Launch Event"發(fā)布活動(dòng) |
tags | link相關(guān)的標(biāo)簽 | boots, recipes, paid |
3. 點(diǎn)擊links
Branch link實(shí)際上是web上的一個(gè)網(wǎng)頁(yè)吵瞻,當(dāng)用戶點(diǎn)擊Branch link時(shí)橡羞,打開(kāi)了這個(gè)webpage,我們使用matching去檢測(cè)你的用戶設(shè)備卿泽,操作系統(tǒng)签夭,瀏覽器,和瀏覽器相關(guān)的cookie措拇,檢查用戶是否安裝了app慎宾,然后進(jìn)行下一步操作。
4.使用數(shù)據(jù)
deep linking的難點(diǎn)在于券犁,與link相關(guān)的數(shù)據(jù)汹碱,比如用戶從哪來(lái),要到哪去色难,都會(huì)在app store丟失。一旦你打開(kāi)app娇昙,app就通過(guò)Mobile SDK請(qǐng)求Branch笤妙,我們使用device fingerprints去將app打開(kāi)與最初的link點(diǎn)擊匹配起來(lái),即使中間被app store下載步驟所分割股毫。
當(dāng)匹配完成后召衔,將發(fā)送與該link相關(guān)的數(shù)據(jù)(步驟2)到你app中,然后趣席,app就可以使用這些數(shù)據(jù)醇蝴∮扑ǎ可以使用與鏈接關(guān)聯(lián)的數(shù)據(jù)進(jìn)行個(gè)性化顯示(比如link中配置了一張圖片),當(dāng)然也可以鏈接到app的具體內(nèi)容頁(yè)面嵌纲。
5. 匹配準(zhǔn)確率
見(jiàn)第二節(jié)Branch Matching
6. 統(tǒng)計(jì)圖表
所有的link攜帶的數(shù)據(jù)腥沽,link的點(diǎn)擊鸠蚪,app的使用情況都可以通過(guò)圖表展示出來(lái)茅信。通過(guò)圖表獲得的信息包括:
- 獲取最多下載的渠道
- 推薦貢獻(xiàn)最多的用戶
- 對(duì)某一塊內(nèi)容的查閱,點(diǎn)擊和安裝
如下圖所示:
Branch Matching
100%匹配的方法
直接deeplinking
當(dāng)app已經(jīng)安裝妖谴,可以直接通過(guò)Branch links的配置得到app的URL scheme(myapp://)或者Universal Links膝舅,我們可以直接打開(kāi)app并傳遞一個(gè)click identifier;click identifier然后被發(fā)送到Branch servers去獲取與link相關(guān)聯(lián)的數(shù)據(jù)洼滚。
非100%匹配的方法
瀏覽器到app的fingerprint匹配
Branch搜集了用戶在瀏覽器中點(diǎn)擊Branch Link獲取的設(shè)備信息技潘,和用戶在打開(kāi)app時(shí)搜集到的設(shè)備信息。這些信息包括IP地址铲掐,操作系統(tǒng)值桩,操作系統(tǒng)版本,設(shè)備類型以及其他參數(shù)斯入。這就是用戶的digital fingerprint蛀蜜,能夠從瀏覽器和app中獲取到。
但是由于瀏覽器中獲取的digital fingerprint數(shù)據(jù)比從app中獲取的digital fingerprint數(shù)據(jù)量要少磅摹,所以從app中獲取到的digital fingerprint是無(wú)法100%匹配到從瀏覽器中獲取到的digital fingerprint霎奢。當(dāng)打開(kāi)app時(shí),發(fā)現(xiàn)有多個(gè)瀏覽器digital fingerprint與之匹配帝美,可以選擇一個(gè)最小時(shí)間范圍內(nèi)的digital fingerprint作為匹配晤硕,但是這個(gè)匹配可能不準(zhǔn)確。
Configuring Your iOS App for 100% Match ( > iOS 10 only)
Include SafariServices.framework
First off, you'll need to include the SafariServices.framework into your app to leverage this. Currently, as soon as you add the Framework, Branch will start triggering the Safari-based 100% match technique. To add the framework, simply go to your Xcode project:
- Select the right build target
- Select the General tab
- Scroll down to Linked Frameworks and Libraries
- Click the + button
- Add SafariServices.framework
Set the matching domain to app.link
Because our Safari View Controller matching method works based on comparing the cookie Branch set on a click to the cookie set with the View Controller, the domains must be consistent. iOS assumes that you're on the bnc.lt domain, so if you're using app.link domain as your default (most apps), you must specify this domain in your PLIST file.
Please set the branch_app_domain to app.link in your PLIST as shown below:
Need to disable SafariViewController?
Note that this mechanism can be disabled using the following method, which should be called before initSession.
Objective-C|Swift
[[Branch getInstance] disableCookieBasedMatching];
參考文獻(xiàn)
[1] LDLink方案設(shè)計(jì). 老周
[2] App自動(dòng)登錄