今天在看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)容。
而對移動端來說洲胖,個性化則是移動化,不同于返回網(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的時候竟痰,用戶必須能直接進入相關頁面签钩,而不是被插播式廣告比如
提示、登陸坏快、閃屏等打斷铅檩。你可以提醒用戶在該次點擊之后再進行動作。
即便該應用未曾被啟動過或者用戶未曾登陸莽鸿,也必須提供這種體驗昧旨。
測試該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還要一個個去搜想聽的到底在哪家的情況是不是也能解決呢耿战?