什么是 URL Scheme?
android中的scheme是一種頁面內(nèi)跳轉(zhuǎn)協(xié)議,是一種非常好的實現(xiàn)機制,通過定義自己的scheme協(xié)議,可以非常方便跳轉(zhuǎn)app中的各個頁面;通過scheme協(xié)議,服務(wù)器可以定制化告訴App跳轉(zhuǎn)那個頁面,可以通過通知欄消息定制化跳轉(zhuǎn)頁面,可以通過H5頁面跳轉(zhuǎn)頁面等。
URL Scheme應(yīng)用場景:
客戶端應(yīng)用可以向操作系統(tǒng)注冊一個 URL scheme,該 scheme 用于從瀏覽器或其他應(yīng)用中啟動本應(yīng)用。通過指定的 URL 字段,可以讓應(yīng)用在被調(diào)起后直接打開某些特定頁面,比如商品詳情頁、活動詳情頁等等。也可以執(zhí)行某些指定動作,如完成支付等。也可以在應(yīng)用內(nèi)通過 html 頁來直接調(diào)用顯示 app 內(nèi)的某個頁面。綜上URL Scheme使用場景大致分以下幾種:
服務(wù)器下發(fā)跳轉(zhuǎn)路徑,客戶端根據(jù)服務(wù)器下發(fā)跳轉(zhuǎn)路徑跳轉(zhuǎn)相應(yīng)的頁面
H5頁面點擊錨點,根據(jù)錨點具體跳轉(zhuǎn)路徑APP端跳轉(zhuǎn)具體的頁面
APP端收到服務(wù)器端下發(fā)的PUSH通知欄消息,根據(jù)消息的點擊跳轉(zhuǎn)路徑跳轉(zhuǎn)相關(guān)頁面
APP根據(jù)URL跳轉(zhuǎn)到另外一個APP指定頁面
URL Scheme協(xié)議格式:
先來個完整的URL Scheme協(xié)議格式:
openapp://thisapp:8888/content?Id=10011002
通過上面的路徑 Scheme、Host、port、path、query全部包含,基本上平時使用路徑就是這樣子的。(Scheme和Host是必要的)
openapp代表該Scheme 協(xié)議名稱(相當(dāng)于http這樣的協(xié)議頭)
thisapp代表Scheme作用于哪個地址域(相當(dāng)于baidu.com這樣的域名格式,當(dāng)然,可以不需要.com這樣的后綴)
content代表Scheme指定的頁面(相當(dāng)于 baidu.com/css 這樣的路徑,然后在app內(nèi)打開相關(guān)的頁面)
Id代表傳遞的參數(shù)(相當(dāng)于 https://www.baidu.com/s?wd=12312 這樣的GET參數(shù))
8888代表port該路徑的端口號
URL Scheme如何使用:
1.在AndroidManifest.xml中對 < activity / > 標(biāo)簽 增加 < intent-filter /> 設(shè)置Scheme
<activity android:name=".GoodsDetailActivity" <!--Activity的名稱--> android:theme="@style/AppTheme"> <!--Activity的主題--> <!--要想在別的App上能成功調(diào)起App,必須添加intent過濾器--> <intent-filter> <data android:scheme="openapp" android:host="thisapp" android:path="/content" android:port="8888"/> <category android:name="android.intent.category.DEFAULT"/> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.BROWSABLE"/> </intent-filter></activity>
2.JAVA獲取Scheme跳轉(zhuǎn)的參數(shù)
Uri uri = getIntent().getData();if (uri != null) { String url = uri.toString(); Log.e(TAG, "url: " + uri); String scheme = uri.getScheme(); Log.e(TAG, "scheme: " + scheme); String host = uri.getHost(); Log.e(TAG, "host: " + host); int port = uri.getPort(); Log.e(TAG, "host: " + port); String path = uri.getPath(); Log.e(TAG, "path: " + path); List<String> pathSegments = uri.getPathSegments(); String query = uri.getQuery(); Log.e(TAG, "query: " + query); String goodsId = uri.getQueryParameter("Id"); Log.e(TAG, "Id: " + Id);}
3.調(diào)用方式
HTML網(wǎng)頁
<a href="openapp://thisapp:8888/content?Id=10011002">打開商品詳情</a>
原生調(diào)用
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002")); startActivity(intent);
4.如何判斷一個Scheme是否有效
PackageManager packageManager = getPackageManager();Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);boolean isValid = !activities.isEmpty();if (isValid) { startActivity(intent);}
如果手機內(nèi)沒有安裝該APP則JS跳轉(zhuǎn)至下載頁面
<!DOCTYPE html> <html lang="en"> <head> <title>h5跳原生</title> </head> <body></body> <script> (function(){ var ua = navigator.userAgent.toLowerCase(); var t; var config = { scheme_IOS: 'openapp://', scheme_Adr: 'openapp://thisapp:8888/content?Id=10011002', download_url: 'http://www.baidu.com', timeout: 600 }; function openclient() { var startTime = Date.now(); var ifr = document.createElement('iframe'); ifr.src = ua.indexOf('os') > 0 ? config.scheme_IOS : config.scheme_Adr; ifr.style.display = 'none'; document.body.appendChild(ifr); var t = setTimeout(function() { var endTime = Date.now();
if (!startTime || endTime - startTime < config.timeout + 200) { window.location = config.download_url; } else { } }, config.timeout); window.onblur = function() { clearTimeout(t); } } openclient(); })()</script> </html>
第二種
<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head><meta charset="utf-8" /><title>文檔標(biāo)題</title></head><body> <div style="font-size: 68px;"> <a href="javascript:open_or_download_app();">打開APP</a> <span id="device"></span> </div> <script type="text/javascript"> function open_or_download_app() { var device = document.getElementById("device"); if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) { device.innerHTML = "ios設(shè)備"; var loadDateTime = new Date(); window.setTimeout(function() { var timeOutDateTime = new Date(); if (timeOutDateTime - loadDateTime <2200) { window.location = "xxxxxxxx"; } else { window.close(); } },2000); window.location = "openapp://thisapp:8888/content?Id=10011002"; } else if (navigator.userAgent.match(/android/i)) { device.innerHTML = "Android設(shè)備"; var loadDateTime = new Date(); window.setTimeout(function() { var timeOutDateTime = new Date(); if (timeOutDateTime - loadDateTime < 2200) { window.location = "xxxxxxxx"; } else { window.close(); } },2000); window.location = "openapp://thisapp:8888/content?Id=10011002"; } } </script></body></html>
總結(jié):
Scheme的基本使用也就這么多了,其他的使用在以后用到的時候再做總結(jié)。
該文章在 2025/8/5 18:39:24 編輯過