Deep Link是什么

weas2883 8年前發布 | 55K 次閱讀 安卓開發 移動開發

來自: http://blog.zhaiyifan.cn/2016/02/04/deeplink-intro/

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

Deep Link是什么

Deep Link,又叫deep linking,中文翻譯作深層鏈接。全家桶搜索的話你會發現第一個結果是AppLink。呵呵。

說回正題

跳轉

我們知道,現在從全家桶、Google搜索關于我們自己app的內容,往往只能搜到一些相關介紹和下載的鏈接,然后我們就中斷了。而在Web世界,搜索后我們可以直接打開網頁查看內容,相比起來體驗實在是差了太多。難道我們就不能直接點擊跳到手機上已經安裝的app上嗎?或者干脆直接跳到某個頁面?

搜索

搜索結果是不是可以做得更好呢。對于爬蟲,在我們的印象中都是去爬網站的數據。但是現在作為一個巨大內容載體的移動平臺卻被忽略了,”似乎”只能自己提供一個H5版本去讓搜索引擎爬數據索引?就像把自己的網站加入robots協議一樣,app是不是也能直接這么做呢?

排名

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

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

移動化

在說移動化前,讓我們先看看個性化:個性化這個詞比較寬泛,早期來說,搜索引擎會根據IP所在地區的不同返回有差別的結果。后來在引入賬號系統后,會讓用戶可以設置語言和地域,恩…還有safe search,你懂的,會讓我們看不到一些日文的內容。

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

商業價值

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

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

各全家桶app企業也能就此機會更加緊密地抱團在一起,由大公司投資的各創業公司則能就此機會表忠心或者抱大腿。

使用

支持Deeplink

以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>

</div>

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

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

/**
 * 檢驗該intent是否是deep link的intent。如果是則從intent數據從接觸recipe的URI并調用
 * 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);
    }
}

</div>

重要:通過deep link打開的app必須提供給用戶"首次點擊自由(First Click Free)"的體驗。
這也就是說在第一次訪問你的app的時候,用戶必須能直接進入相關頁面,而不是被插播式廣告比如
提示、登陸、閃屏等打斷。你可以提醒用戶在該次點擊之后再進行動作。

即便該應用未曾被啟動過或者用戶未曾登陸,也必須提供這種體驗。</pre>

常見問題: 如何避免通過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

</div>

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

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

</div>

常見問題:

獲得來源

從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使用了
                }
            }
        }

        ...

    }

    ...

}

</div>

最后

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

目前App本身和搜索還是沒有結合起來,國內只有豌豆莢和全家桶開始了這種體驗的嘗試。希望以后App也能和網頁一樣,不需要自己提供搜索功能,讓搜索引擎去做一切索引,直接在手機瀏覽器里打開app里的頁面。甚至可以像現在使用site指定搜索目標一樣,去指定要搜索的app。

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

</div>

 本文由用戶 weas2883 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!