1. 程式人生 > android教程 > Deep Link是什麼

Deep Link是什麼

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


Deep Link是什麼

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


說回正題。


簡單地從使用者體驗來講,Deep Link,就是可以讓你在手機的瀏覽器/Google Search上點選搜尋的結果,便能直接跳轉到已安裝的應用中的某一個頁面的技術。如果你想體驗的話,可以在Android 4.1以上裝置安裝IMDB,然後在Google上搜索一部IMDB的影片,你就會發現點選後直接跳轉到了App裡的該電影介紹頁面。


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


先讓我們看看現在移動端的搜尋體驗問題:


搜尋

就因為我司沒有做Web版的頁面,所以搜尋引擎就沒法找到我們提供的內容。


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


排名

我的App這麼火爆,為什麼搜尋出來的結果都是別人的引用?!


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


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


搜尋引擎應該對移動端的app也支援排名和連結關係解析。


移動化

每次在百度搜好吃的,搜到點評的結果後,怎麼就不能直接跳到app裡呢。


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


其實這種體驗也是一種個性化搜尋:個性化這個詞比較寬泛,早期來說,搜尋引擎會根據IP所在地區的不同返回有差別的結果。後來在引入賬號系統後,會讓使用者可以設定語言和地域,恩...還有safe search,你懂的,會讓我們看不到一些日文的內容。


Deep Link是什麼
deeplink-2
Deep Link是什麼
deeplink-3

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


After Deep Linked

而Deep Link則會解決以上的問題,搜尋引擎可以直接用爬蟲檢索App的內容,對App也列入PageRank排名,安裝了App的裝置點選後,則可以直接跳到應用內的對應頁面!!Cool!


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


使用

乍一看,Deep Link不就是scheme麼?不錯,或者我們該說,目前app的scheme,就是Deep Link的一種雛形(僅僅是跳轉,且沒有標準化的體驗,見下文"首次點選自由"體驗)。且有的app處理scheme並不是各個activity去註冊自己的path,而會去通過一箇中心activity去整合處理比如鑑權、解出各種引數,並美其名曰Navigator。


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


支援Deeplink

參考內容:
啟用指向你app的Deep Linking。
為純app內容建立索引


以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資料從接觸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);
}
}
重要:通過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

常見問題:


為什麼提示"Error: Activity not started, unable to resolve Intent"?
怎麼讓我的deep link在搜尋結果中出現
獲得來源

從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使用了
}
}
}
...
}
...
}
商業價值

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


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


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


最後

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


目前App本身和搜尋還是沒有結合起來,國內只有豌豆莢和全家桶開始了這種體驗的嘗試,App的體驗仍然是一個個資訊孤島,遠不如在Web上搜到哪兒去哪兒,希望Deep Link的逐漸推廣和應用,可以幫助app們達到和網頁一樣的體驗。


以後App也能和網頁一樣,不需要自己提供搜尋功能,讓搜尋引擎去做一切索引,直接在手機瀏覽器裡開啟app頁面。甚至可以像現在使用site指定搜尋目標一樣,去指定要搜尋的app。


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


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