一:deeplink
DeepLink:
深度鏈接技術(shù),主要應(yīng)用場(chǎng)景是通過(guò)Web頁(yè)面直接調(diào)用Android原生app姥宝,并且把需要的參數(shù)通過(guò)Uri的形式础米,直接傳遞給app,例如可以直接在短信內(nèi)的http/https連接打開(kāi)應(yīng)用彤蔽。
Applink:
與deeplink一樣,區(qū)別在于applink用于是在6.0及以上系統(tǒng)庙洼,deeplink在點(diǎn)擊連接時(shí)顿痪,會(huì)讓用戶(hù)選擇啟動(dòng)的應(yīng)用,applink是直接打開(kāi)應(yīng)用沒(méi)有詢(xún)問(wèn)的彈窗油够。
目前Android源碼提供的是一個(gè)雙向認(rèn)證的方案:在APP安裝的時(shí)候蚁袭,客戶(hù)端根據(jù)APP配置像服務(wù)端請(qǐng)求,如果滿(mǎn)足條件石咬,scheme跟服務(wù)端配置匹配的上揩悄,就為APP設(shè)置默認(rèn)啟動(dòng)選項(xiàng),若校驗(yàn)失敗則和deepink一致鬼悠。applink在使用時(shí)候删性,需要在xml中對(duì)頁(yè)面配置autoverify=true棉饶;
二:項(xiàng)目?jī)?nèi)實(shí)現(xiàn)
引入的第三方庫(kù):https://github.com/airbnb/DeepLinkDispatch
目前已上線(xiàn)的i版地址中存在"aaaa/bbbb/id"、"aaaaa/id"镇匀、"aaaaa/id/bbbb"等等沒(méi)有一個(gè)統(tǒng)一規(guī)則的連接,為了適配已上線(xiàn)的地址袜啃,引入DeepLinkDispatch汗侵,具體使用及原理看上面連接。
項(xiàng)目代碼:
AppDeepLinkModule:通過(guò)Deeplink注解群发,傳入對(duì)應(yīng)的連接就可以映射到對(duì)應(yīng)的方法晰韵。
@DeepLink({
"http://xxxxx/xxxx/xxxx",
"https://xxxx/xxxx/xxxx"})
public static Intent intentAAAMethod(Context context, Bundle extras) {
long id = DeeplinkUtils.getId(extras, DeeplinkUtils.PATH_TYPE_ONE);
if (id <= 0) {
return null;
}
Intent intent = new Intent(xxx,xxxx);
return intent;
}
DeeplinkRouterNewActivity:deeplink分發(fā)頁(yè)面,點(diǎn)擊跳轉(zhuǎn)連接后先調(diào)起該頁(yè)面然后進(jìn)行分發(fā)熟妓,默認(rèn)先啟動(dòng)首頁(yè)雪猪,之后跳轉(zhuǎn)到對(duì)應(yīng)的頁(yè)面,如果沒(méi)有對(duì)應(yīng)的頁(yè)面起愈,則留在首頁(yè)只恨。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
toHome();
DeepLinkDelegate deepLinkDelegate =
new DeepLinkDelegate(new AppDeepLinkModuleLoader());
deepLinkDelegate.dispatchFrom(this);
finish();
}
DeeplinkUtils:參數(shù)處理,通過(guò)getid獲取對(duì)應(yīng)參數(shù)抬虽,如果只有一個(gè)參數(shù)官觅,并且名字為id,則通過(guò)這個(gè)通用方法獲取即可(參數(shù)可以在query或者path中)阐污。
public class DeeplinkUtils {
public static final String PATH_TYPE_ONE = "/[a-zA-Z]+/[a-zA-Z]+/(\\d+)";
public static final String PATH_TYPE_TWO = "/[a-zA-Z]+/(\\d+)";
public static final String PATH_TYPE_THERE = "/[a-zA-Z]+/(\\d+)+/[a-zA-Z]";
/**
* 通用取參數(shù)-參數(shù)在path中
* */
public static long getPathParamsOne(String path, String PATH_TYPE_ONE) {
try {
Pattern pattern = Pattern.compile(PATH_TYPE_ONE);
Matcher matcher = pattern.matcher(path);
String result = "";
if (matcher.find()) {
result = matcher.group(1);
}
return Long.valueOf(result);
} catch (Exception ex) {
return 0;
}
}
/**
* 通用去參數(shù)-參數(shù)在query中休涤,名字為id
* */
public static long getQueryParams(String query) {
UrlParse urlParse = new UrlParse();
urlParse.parser(query);
if (urlParse.strUrlParas.size() > 0) {
return Long.valueOf(urlParse.strUrlParas.get("id"));
}
return 0;
}
/**
* 取參數(shù)id
* */
public static long getId(Bundle extras, String type) {
Uri uri = Uri.parse(extras.getString(DeepLink.URI));
String query = uri.getQuery();
long id = 0;
if (!TextUtils.isEmpty(query)) {
id = DeeplinkUtils.getQueryParams(query);
} else {
id = DeeplinkUtils.getPathParamsOne(uri.getPath(), type);
}
return id;
}
}
注:android手機(jī)瀏覽器有自帶的,有第三方的笛辟,每個(gè)機(jī)型不同瀏覽器不同功氨,對(duì)http/https的識(shí)別也不同,目前自測(cè)chrome瀏覽器可以識(shí)別手幢,自帶瀏覽器分機(jī)型識(shí)別