Deep Link是什么

今天在看Google關于Android Studio 2.0的視頻的時候起便,提到了一個feature:支持Deep Link提示熟妓。筆者在去年上半年時候略微接觸了一下匾乓,之后8月又看到全家桶出了一個山寨版叫AppLink户侥。但是似乎在國內(nèi)不太看到有這方面的介紹,在微博搜了一下,也沒有正式介紹Deep Link的文章刊苍,所以產(chǎn)生了寫本文的念頭施籍。

Deep Link是什么

Deep Link,又叫deep linking占调,中文翻譯作深層鏈接暂题。全家桶搜索的話你會發(fā)現(xiàn)第一個結果是AppLink。呵呵究珊。

說回正題薪者。

簡單地從用戶體驗來講,Deep Link苦银,就是可以讓你在手機的瀏覽器/Google Search上點擊搜索的結果啸胧,便能直接跳轉到已安裝的應用中的某一個頁面的技術。如果你想體驗的話幔虏,可以在Android 4.1以上設備安裝IMDB纺念,然后在Google上搜索一部IMDB的影片,你就會發(fā)現(xiàn)點擊后直接跳轉到了App里的該電影介紹頁面想括。

當然在這簡簡單單的操作背后陷谱,卻隱藏著很多工作。

先讓我們看看現(xiàn)在移動端的搜索體驗問題:

搜索

就因為我司沒有做Web版的頁面,所以搜索引擎就沒法找到我們提供的內(nèi)容烟逊。

搜索結果是不是可以做得更好呢渣窜。對于爬蟲,在我們的印象中都是去爬網(wǎng)站的數(shù)據(jù)宪躯。但是現(xiàn)在作為一個巨大內(nèi)容載體的移動平臺卻被忽略了乔宿,"似乎"只能自己提供一個H5版本去讓搜索引擎爬數(shù)據(jù)索引?就像把自己的網(wǎng)站加入robots協(xié)議一樣访雪,app是不是也能直接這么做呢详瑞?

排名

我的App這么火爆,為什么搜索出來的結果都是別人的引用臣缀?坝橡!

本科在學校時候做過PageRank的實踐,簡單來說就是一個帶權的樹形有向圖精置,用通俗的話來講计寇,大V關注了你,可以讓你的價值提升脂倦。而在App的世界里番宁,我們也經(jīng)常會體驗到在應用之間跳轉的體驗(盡管有些應用時靈時不靈的),這種跳轉難道不也能拿來作為PageRank的有向邊嗎狼讨?

做個例子來說(絕不是廣告):手Q贝淤、QQ空間、QQ音樂都在應用里的某頁面引用了騰訊新聞的某一條新聞的頁面政供,而手Q播聪、QQ空間、QQ音樂這三個應用的該頁面本身在算法里排名就很靠前布隔,那么我們就認為騰訊新聞的該頁面是有價值的离陶,在相同結果的頁面中應該排在更前面。

搜索引擎應該對移動端的app也支持排名和鏈接關系解析衅檀。

移動化

每次在百度搜好吃的招刨,搜到點評的結果后,怎么就不能直接跳到app里呢哀军。

我們知道沉眶,現(xiàn)在從全家桶、Google搜索關于我們自己app的內(nèi)容杉适,往往只能搜到一些相關介紹和下載的鏈接谎倔,然后我們就中斷了。而在Web世界猿推,搜索后我們可以直接打開網(wǎng)頁查看內(nèi)容片习,相比起來體驗實在是差了太多捌肴。難道我們就不能直接點擊跳到手機上已經(jīng)安裝的app上嗎?或者干脆直接跳到某個頁面藕咏?

其實這種體驗也是一種個性化搜索:個性化這個詞比較寬泛状知,早期來說,搜索引擎會根據(jù)IP所在地區(qū)的不同返回有差別的結果孽查。后來在引入賬號系統(tǒng)后饥悴,會讓用戶可以設置語言和地域,恩...還有safe search盲再,你懂的铺坞,會讓我們看不到一些日文的內(nèi)容。


deeplink-2

deeplink-3

而對移動端來說洲胖,個性化則是移動化,不同于返回網(wǎng)頁坯沪,搜索引擎會返回支持Deep Link的應用內(nèi)部頁面的鏈接绿映,比如我們找一部電影,可以直接跳到IMDB應用里這部電影的詳情頁面腐晾,體驗是不是比看網(wǎng)頁好多了呢(明明我安裝了應用叉弦,為什么要讓我看H5呢)。

After Deep Linked

而Deep Link則會解決以上的問題藻糖,搜索引擎可以直接用爬蟲檢索App的內(nèi)容淹冰,對App也列入PageRank排名,安裝了App的設備點擊后巨柒,則可以直接跳到應用內(nèi)的對應頁面SK!Cool洋满!

既然這么酷炫晶乔,那我們要怎么才能讓自家的應用支持Deep Link呢?

使用

乍一看牺勾,Deep Link不就是scheme么正罢?不錯,或者我們該說驻民,目前app的scheme翻具,就是Deep Link的一種雛形(僅僅是跳轉,且沒有標準化的體驗回还,見下文"首次點擊自由"體驗)裆泳。且有的app處理scheme并不是各個activity去注冊自己的path,而會去通過一個中心activity去集成處理比如鑒權懦趋、解出各種參數(shù)晾虑,并美其名曰Navigator。

廢話不多說了,看看正確的姿勢吧帜篇。下文以Android接入為例糙捺,iOS可以查看App Indexing on iOS9

支持Deeplink

參考內(nèi)容:
啟用指向你app的Deep Linking
為純app內(nèi)容創(chuàng)建索引

以Google給的demo為例:search-samples

我們需要添加Intent Filter到manifest:

<activity android:name="com.recipe_app.client.RecipeActivity"
          android:label="@string/app_name" >
    <intent-filter android:label="@string/app_name">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- 接受以"http://recipe-app.com/recipe"開頭的URI -->
        <data android:scheme="http"
              android:host="recipe-app.com"
              android:pathPrefix="/recipe" />
    </intent-filter>
</activity>

然后為該intent filter添加處理代碼:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recipe);
    onNewIntent(getIntent());
}

/**
 * 檢驗該intent是否是deep link的intent笙隙。如果是則從intent數(shù)據(jù)從接觸recipe的URI并調(diào)用
 * showRecipe()來展示菜譜洪灯。
 **/
protected void onNewIntent(Intent intent) {
    String action = intent.getAction();
    String data = intent.getDataString();
    if (Intent.ACTION_VIEW.equals(action) && data != null) {
        String recipeId = data.substring(data.lastIndexOf("/") + 1);
        Uri contentUri = RecipeContentProvider.CONTENT_URI.buildUpon()
                .appendPath(recipeId).build();
        showRecipe(contentUri);
    }
}
重要:通過deep link打開的app必須提供給用戶"首次點擊自由(First Click Free)"的體驗。
這也就是說在第一次訪問你的app的時候竟痰,用戶必須能直接進入相關頁面签钩,而不是被插播式廣告比如
提示、登陸坏快、閃屏等打斷铅檩。你可以提醒用戶在該次點擊之后再進行動作。

即便該應用未曾被啟動過或者用戶未曾登陸莽鸿,也必須提供這種體驗昧旨。

常見問題:如何避免通過deep link打開多個應用實例

測試該intent filter

上述demo運行后,在adb輸入以下命令來trigger一個deep link:

adb shell am start -a android.intent.action.VIEW \
-d "http://recipe-app.com/recipe/pierogi-poutine" com.recipe_app

可以再替換以上url來打開其他菜譜

http://recipe-app.com/recipe/grilled-potato-salad
http://recipe-app.com/recipe/haloumi-salad
http://recipe-app.com/recipe/wedge-salad

常見問題:

獲得來源

從Google的應用中點擊了指向你的應用的鏈接祥得,你的應用的那個頁面將會收到特定的intent extra:

應用引用站點 — android-app://{package_id}/{scheme}/{host_path}
Web 引用站點 — https://{host_path}

比如從Google應用點擊到你的應用兔沃,則會有

android-app://com.google.android.googlequicksearchbox/https/www.google.com

App能在頁面啟動時獲得引用站點的信息,具體如下:

import com.google.android.gms.appindexing.AndroidAppUri;
import android.net.ParseException;

...

public class MainActivity extends Activity {
    /** 返回啟動該Activity的引用者. */
    @Override
    public Uri getReferrer() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            return super.getReferrer();
        }
        return getReferrerCompatible();
    }

    /** 在低于SDK 22版本時使用該方法獲得引用者 */
    private Uri getReferrerCompatible() {
        Intent intent = this.getIntent();
        Uri referrerUri = intent.getParcelableExtra(Intent.EXTRA_REFERRER);
        if (referrerUri != null) {
            return referrerUri;
        }
        String referrer = intent.getStringExtra("android.intent.extra.REFERRER_NAME");
        if (referrer != null) {
            // 嘗試parse引用者URL
            try {
                return Uri.parse(referrer);
            } catch (ParseException e) {
                return null;
            }
        }
        return null;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...

        Intent intent = this.getIntent();
        Uri referrerUri = this.getReferrer();
        if (referrerUri != null) {
            if (referrerUri.getScheme().equals("http") || referrerUri.getScheme().equals("https")) {
                // App從瀏覽器打開
                String host = referrerUri.getHost();
                // host會包含host路徑 (比如www.google.com)

                // 在這里增加分析的代碼以記錄從Web搜索點擊進來的流量

                ...

            } else if (referrerUri.getScheme().equals("android-app")) {
                // App從另一個app被打開
                AndroidAppUri appUri = AndroidAppUri.newAndroidAppUri(referrerUri);
                String referrerPackage = appUri.getPackageName();
                if ("com.google.android.googlequicksearchbox".equals(referrerPackage)) {
                    // App從Google app被打開
                    String host = appUri.getDeepLinkUri().getHost();
                    // host會包含host路徑 (比如www.google.com)

                    // 在這里增加分析的代碼以記錄從Google app點擊進來的流量

                    ...

                } else if ("com.google.appcrawler".equals(referrerPackage)) {
                    // Google的爬蟲來著级及,別把這個算作app使用了
                }
            }
        }

        ...

    }

    ...

}

商業(yè)價值

對搜索引擎提供上來說:廣告乒疏,你懂的。百毒會不會把一些釣魚app的頁面放到最前面呢饮焦?呵呵怕吴。

對App來說則一方面可以解決目前移動應用的孤島局面,另一方面可以通過搜索分析報告來了解通過搜索引擎導流的點擊次數(shù)追驴、查詢次數(shù)械哟,以及最受歡迎的頁面。

各全家桶app企業(yè)也能就此機會更加緊密地抱團在一起殿雪,由大公司投資的各創(chuàng)業(yè)公司則能就此機會表忠心或者抱大腿暇咆。

最后

上文大多是從Google的Deeplink展開的,如果你的應用主打本土市場丙曙,且考慮到目前Google仍然未回歸爸业,可以參考全家桶的Applink,大都是雷同的亏镰,只需要換一下前綴罷了(我猜是這樣的 哈哈)扯旷。

目前App本身和搜索還是沒有結合起來,國內(nèi)只有豌豆莢和全家桶開始了這種體驗的嘗試索抓,App的體驗仍然是一個個信息孤島钧忽,遠不如在Web上搜到哪兒去哪兒毯炮,希望Deep Link的逐漸推廣和應用,可以幫助app們達到和網(wǎng)頁一樣的體驗耸黑。

以后App也能和網(wǎng)頁一樣桃煎,不需要自己提供搜索功能,讓搜索引擎去做一切索引大刊,直接在手機瀏覽器里打開app頁面为迈。甚至可以像現(xiàn)在使用site指定搜索目標一樣,去指定要搜索的app缺菌。

試想我能直接社工搜索到女神的信息葫辐,然后直接跳到微博app里的feed詳情頁。另外伴郁,現(xiàn)在這種聽一首歌要裝3個app還要一個個去搜想聽的到底在哪家的情況是不是也能解決呢耿战?


原文:http://blog.zhaiyifan.cn/2016/02/04/deeplink-intro/

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市焊傅,隨后出現(xiàn)的幾起案子昆箕,更是在濱河造成了極大的恐慌,老刑警劉巖租冠,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異薯嗤,居然都是意外死亡顽爹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門骆姐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镜粤,“玉大人,你說我怎么就攤上這事玻褪∪饪剩” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵带射,是天一觀的道長同规。 經(jīng)常有香客問我,道長窟社,這世上最難降的妖魔是什么券勺? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮灿里,結果婚禮上关炼,老公的妹妹穿的比我還像新娘。我一直安慰自己匣吊,他們只是感情好儒拂,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布寸潦。 她就那樣靜靜地躺著,像睡著了一般社痛。 火紅的嫁衣襯著肌膚如雪见转。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天褥影,我揣著相機與錄音池户,去河邊找鬼。 笑死凡怎,一個胖子當著我的面吹牛校焦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播统倒,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼寨典,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了房匆?” 一聲冷哼從身側響起耸成,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浴鸿,沒想到半個月后井氢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡岳链,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年花竞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掸哑。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡约急,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苗分,到底是詐尸還是另有隱情厌蔽,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布摔癣,位于F島的核電站奴饮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏择浊。R本人自食惡果不足惜拐云,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望近她。 院中可真熱鬧叉瘩,春花似錦、人聲如沸粘捎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泳桦,卻和暖如春汤徽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灸撰。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工谒府, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浮毯。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓完疫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親债蓝。 傳聞我的和親對象是個殘疾皇子壳鹤,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

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