Web調起App研究報告
Android
經研究目前主要有以下兩種方式可以通過Web開啟App。
1、 自定義Scheme
2、 Chrome Intent
下面逐一介紹:
自定義Scheme
在Android瀏覽器中(非微信瀏覽器),可以通過scheme協議的方式喚醒本地app客戶端;scheme協議在app註冊之後,與前端進行統一約定,通過H5頁面訪問某個具體的協議地址,即可開啟對應的app客戶端頁面。
訪問協議地址,目前主要有3中方式,以demo為例:
1. 通過a標籤開啟,點選標籤是啟動
<a href="m://zyl.com ">開啟app </a><br/>
2. 通過iframe開啟,設定iframe.src即會啟動
<iframe src=" m://zyl.com "></iframe>
3. 直接通過window.location進行跳轉
window.location.href=
注意:
由於微信的白名單限制,無法通過scheme來喚醒本地app,只有白名單內的app才能通過微信瀏覽器喚醒,這個問題目前沒有找到合適的解決方案。
舉例說明
1、 在AndroidManifest的清單檔案裡的intent-filter中加入如下元素:
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:host="
android:scheme="m"/>
</intent-filter>
示例截圖如下:
2、 通過html頁面開啟Android本地App
<a href="m://zyl.com">開啟app by Scheme</a><br/>
示例截圖如下:
3、 如何獲取scheme方式的網頁傳參
Web端:
<a href="m://zyl.com?arg0=Jason&arg1=Zhao">開啟app by Scheme</a><br/>
示例截圖如下:
Android端:
(1)、通過瀏覽器開啟這個網頁,獲取資料的方式如下:
Uri uri = getIntent().getData();
String test1= uri.getQueryParameter("arg0");
String test2= uri.getQueryParameter("arg1");
(2)、通過webview開啟這個網頁,獲取資料的方式如下:
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Uri uri=Uri.parse(url);
if(uri.getScheme().equals("m")&&uri.getHost().equals("http://zyl.com")){
String arg0=uri.getQueryParameter("arg0");
String arg1=uri.getQueryParameter("arg1");
}else{
view.loadUrl(url);
}
return true;
}
});
Chrome Intent
Chrome Intent簡介
自定義的scheme可以搞定很多瀏覽器,但是Chrome除外。原因是為了更有序的打通瀏覽器頁面和本地應用,Chrome 25後不再支援自定義的scheme,比如通過設定window.location.href=將無法喚醒本地客戶端。
而推出了Chrome Intent,作為標準協議進行推廣,其格式如下:
intent:
HOST/URI-path // Optional host
#Intent;
package=[string];
action=[string];
category=[string];
component=[string];
scheme=[string];
S.browser_fallback_ur=[encoded_full_url];
end;
<a href="intent://zyl.com #Intent;scheme=m;package=com.zyl.demo.htmlcallapp1;S.browser_fallback_url=https%3A%2F%2Fwww.baidu.com;end">開啟app by Intent</a><br/>
S.browser_fallback_url這個引數很重要,在應用調起失敗時,要跳轉到的頁面。
Chrome Intent如何傳參:
<a href="intent://zyl.com?arg0=Jason&arg1=Zhao#Intent;scheme=m;package=com.zyl.demo.htmlcallapp1;S.browser_fallback_url=https%3A%2F%2Fwww.baidu.com;end">開啟app by Intent</a><br/>
示例截圖如下:
如何獲取scheme方式的網頁傳參
(1)、通過瀏覽器開啟這個網頁,獲取資料的方式如下:
Uri uri = getIntent().getData();
String test1= uri.getQueryParameter("arg0");
String test2= uri.getQueryParameter("arg1");
(2)、通過webview開啟這個網頁,獲取資料的方式如下:
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Uri uri=Uri.parse(url);
if(uri.getScheme().equals("m")&&uri.getHost().equals("http://zyl.com")){
String arg0=uri.getQueryParameter("arg0");
String arg1=uri.getQueryParameter("arg1");
}else{
view.loadUrl(url);
}
return true;
}
});
iOS
經研究目前主要有以下兩種方式可以通過Web開啟App。
1、 自定義Scheme
2、 Universal links
自定義Scheme方式與Android類似,此處不做過多的表述。參考文章中有具體的scheme和Universal links的配置方式。主要簡述Universal links。
Universal links為iOS9上一個所謂通用連結的深層連結特性,一種能夠方便的通過傳統HTTP連結來啟動app,使用相同的網址開啟網站和app;通過唯一的網址,就可以連結一個特定的檢視到你的app裡面,不需要特別的scheme。在iOS中,對比scheme的方式Universal links有以下優點:
1、 通過scheme啟動app時,瀏覽器會彈出確認框提示使用者是否開啟,而Universal links不會提示,體驗更好;
2、 Universal links可在微信瀏覽器中開啟外部app
參考文章:
H5CallUpNative 【重要】