??移動互聯(lián)時代嘱能,手機作為我們?nèi)粘=涣鞯闹饕浇榱呙罚钶d了許許多多的移動應(yīng)用程序,這些五花八門的應(yīng)用程序極大的豐富了我們的生活惹骂。目前主流移動應(yīng)用程序主要有Native App和Web App兩種實現(xiàn)形式苏携,其中Native App具有良好的用戶黏性和操作體驗。本篇針對從瀏覽器对粪、短信右冻、甚至是在其他APP中喚醒Native APP的需求,幫助Native App開發(fā)者為用戶提供更好的交互體驗著拭,從而建立更穩(wěn)固的用戶關(guān)系纱扭。
一、Native APP喚醒場景
1儡遮、瀏覽器 -> 喚醒APP
??用戶A在手機上通過瀏覽器打開了某APP的M站或者官網(wǎng)乳蛾,則引導(dǎo)用戶打開該APP或者下載該APP。
2、微信肃叶、QQ等 -> 喚醒APP
??用戶通過某APP分享了一條鏈接至微信或QQ蹂随,用戶B點開該鏈接后,引導(dǎo)用戶B打開該APP或者下載該APP因惭。
3岳锁、短信、郵件蹦魔、二維碼等-> 喚醒APP
??用戶A打開了某APP的推廣短信激率,郵件或者掃描二維碼等,引導(dǎo)用戶打開該APP或者下載該APP勿决。
4柱搜、其他APP -> 喚醒APP
??用戶A通過第三方APP分享了一條鏈接至用戶B,用戶B點開該鏈接后剥险,引導(dǎo)用戶B打開指定APP或者下載指定APP。
二宪肖、那么移動平臺提供了哪些喚醒APP的方法呢表制?
目前常見的喚醒APP方式有幾種:
1、URL Scheme
??URL Scheme是iOS控乾,Android平臺都支持么介,只需要原生APP開發(fā)時注冊scheme, 那么用戶點擊到此類鏈接時蜕衡,會自動喚醒APP壤短,借助于URL Router機制,則還可以跳轉(zhuǎn)至指定頁面慨仿。
??這種方式是當(dāng)前使用最廣泛久脯,也是最簡單的,但是需要手機镰吆,APP支持URL Scheme帘撰。
??優(yōu)點: 開發(fā)成本低,絕大多數(shù)都支持万皿,web-native協(xié)議制定也簡單摧找。
??缺點: 錯誤處理情況因平臺不同,難以統(tǒng)一處理牢硅,部分APP會直接跳錯誤頁(比如Android Chrome/41蹬耘,iOS中老版的Lofter);也有的停留在原頁面减余,但彈出提示“無法打開網(wǎng)頁”(比如iOS7)综苔;iOS8以及最新的Android Chrome/43 目前都是直接停留在當(dāng)前頁,不會跳出錯誤提示。
支持情況: iOS在實際使用中休里,騰訊系的微信蛆挫,QQ明確禁止使用,iOS9以后Safari不再支持通過js妙黍,iframe等來觸發(fā)scheme跳轉(zhuǎn)悴侵,并且還加入了確認(rèn)機制,使得通過js超時機制來自動喚醒APP的方式基本不可用拭嫁;Android平臺則各個app廠商差異很大可免,比如Chrome從25及以后就同Safari情況一樣。
2做粤、Universal Links
??在2015年的WWDC大會上浇借,Apple推出了iOS 9的一個功能:Universal Links通用鏈接。如果你的App支持Universal Links怕品,那就可以訪問HTTP/HTTPS鏈接直接喚起APP進(jìn)入具體頁面妇垢,不需要其他額外判斷;如果未安裝App肉康,訪問此通用鏈接時闯估,可以一個自定義網(wǎng)頁。
3吼和、Android App Links
??在2015年的Google I/O大會上涨薪,Android M宣布了一個新特性:App Links讓用戶在點擊一個普通web鏈接的時候可以打開指定APP的指定頁面,前提是這個APP已經(jīng)安裝并且經(jīng)過了驗證炫乓,否則會顯示一個打開確認(rèn)選項的彈出框刚夺。在推動deep linking上Google和Apple可謂英雄所見略同,優(yōu)缺點也大致相同末捣,只支持Android M以上系統(tǒng)侠姑。
??總結(jié)以上各種方案從長遠(yuǎn)趨勢來看都是Deep Links技術(shù),都需要
- 一個支持HTTPS的Web站
三箩做、DeepLink相關(guān)技術(shù)和產(chǎn)品
??目前市面移動DeepLink相關(guān)技術(shù)和產(chǎn)品结借,包括系統(tǒng)基礎(chǔ)技術(shù),巨頭產(chǎn)品卒茬,創(chuàng)新產(chǎn)品船老,圖示如下。
四圃酵、DeepLink全方位解析
??所謂DeepLink(深度鏈接)就是支持在移動App自由跳轉(zhuǎn)的技術(shù)柳畔,在PC的Web時代,這個問題簡化一個HTTP地址郭赐。到了移動時代薪韩,這個問題變得復(fù)雜起來确沸,移動操作系統(tǒng)有多家,各家處理應(yīng)用間跳轉(zhuǎn)的底層技術(shù)都不一樣俘陷,調(diào)用方式罗捎、代碼都不同拉盾,支持的力度也不同捉偏。目前也沒有任何行業(yè)協(xié)會致力于解決這個問題夭禽,沒有像W3C組織解決Web的規(guī)范化。
1菩彬,什么是deeplink?什么是applink?兩者的關(guān)系和區(qū)別是什么潮梯?
??deeplink是從攔截外部請求到app內(nèi)并定位到具體頁面的技術(shù).
??簡單講酷麦,就是你在手機上點擊一個鏈接之后沃饶,可以直接鏈接到app內(nèi)部的某個頁面轻黑,而不是app正常打開時顯示的首頁氓鄙。不似web,一個鏈接就可以直接打開web的內(nèi)頁升酣,app的內(nèi)頁打開态罪,必須用到deeplink技術(shù)。
2复颈,deeplink的作用是什么?
??deeplink能夠?qū)⑼獠苛髁恳龑?dǎo)到app內(nèi), 并提供連貫的瀏覽體驗, 實在是引流的大殺器.
??deeplink還做高效的流量分發(fā). 通過外部url的投放和內(nèi)部攔截, 可以針對不同場景直接分發(fā)流量到具體頁面, 將用戶直接引導(dǎo)到各個垂直頻道.
3凿菩,有哪些比較成熟的解決方案衅谷?
??魔窗等
4,安全性如何陡叠?
Android Intent Scheme URLs攻擊
五肢执、技術(shù)實現(xiàn)
下面以Android為例實現(xiàn)瀏覽器喚醒APP预茄。
一)瀏覽器喚醒APP
1耻陕,首先創(chuàng)建Android工程诗宣。
2召庞,新建DeepLinkActivity篮灼,并在清單文件中配置如下:
<!--<!– Accepts URIs that begin with "example://gizmos” –>-->
<!--<data android:scheme="example"-->
<!--android:host="gizmos" />-->
<!--<!– Accepts URIs that begin with "http://www.example.com/gizmos” –>-->
<!--<data-->
<!--android:host="www.xp.pro.deeplinkdemo"-->
<!--android:pathPrefix="/gizmos"-->
<!--android:scheme="http" />-->
<activity android:name=".DeepLinkActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "example://gizmos” -->
<data
android:host="detail"
android:scheme="xp" />
</intent-filter>
</activity>
3诅诱,網(wǎng)頁中使用如下代碼髓堪,打開app指定頁面:
<a href="xp://detail">打開詳情</a>
4,在app中接收html打開原生頁面請求:
activityDataWebview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
Uri uri = Uri.parse(url);
if (uri.getScheme().equals("xp") && uri.getHost().equals("detail")) {
Toast.makeText(MainActivity.this, "HTML open Android native App success!", Toast.LENGTH_LONG).show();
Intent intent = new Intent();
intent.setData(uri);
startActivity(intent);
} else {
view.loadUrl(url);
}
return true;
}
});
??從上面的代碼可以看到協(xié)議頭時自定義的"xp"娘荡,在測試過程中發(fā)現(xiàn):href中的鏈接在瀏覽器輸入框里面無法直接打開,只能在html代碼中打開炮沐。
完整代碼見:
https://github.com/XieXiePro/DeeplinkDemo
附:
1疤孕,用python快速搭建http服務(wù)器訪問html及文件央拖。
??如果你的電腦已經(jīng)裝上了Python祭阀,那么鹉戚,搭建一個靜態(tài)文件服務(wù)器將是一件非常簡單的事情专控。
??只需進(jìn)入到項目文件夾抹凳,運行下面這一條命令,就可以把該文件夾作為一個HTTP服務(wù)器的根目錄(后面8888為端口):
python -m SimpleHTTPServer 8888
??這種方法搭建起來的服務(wù)器基本能滿足調(diào)試使用伦腐,如果不夠可以試試增強版BaseHTTPServer
??在Python3中,‘SimpleHTTPServer’已經(jīng)變?yōu)椤甴ttp.server’了柏蘑,對應(yīng)命令為:
python3 -m http.server 8888
??如果要停止HTTP服務(wù)器幸冻,按Ctrl+C即可洽损。
2碑定,Android模擬器訪問本地服務(wù)器 localhost延刘。
要把localhost或者127.0.0.1改為10.0.0.2才能訪問到本地的服務(wù)器數(shù)據(jù)。
3,本實例主要實現(xiàn):
deeplink 原生啟動原生頁面祭芦,可支持應(yīng)用內(nèi)跳轉(zhuǎn)及跨應(yīng)用啟動。
deeplink Html啟動原生頁面,可支持本地html加載及服務(wù)器訪問Html啟動原生頁面。
參考鏈接:
1、喚醒 App 的那些事
2叮趴、iOS/Android 瀏覽器(h5)及微信中喚起本地APP
3割笙、移動DeepLink的前生今世
4、Deep Link是什么
5眯亦、Deep Link技術(shù)
6伤溉、Android實現(xiàn)通過瀏覽器點擊鏈接打開本地應(yīng)用(APP)并拿到瀏覽器傳遞的數(shù)據(jù)
7、html與iOS/Android的兼容交互