首先明晰苍姜,微信里屏蔽了schema協(xié)議译蒂。除非你是微信的合作伙伴之類(lèi)的曼月,他們專(zhuān)門(mén)給你配置進(jìn)白名單。否則柔昼,我們就沒(méi)辦法通過(guò)這個(gè)協(xié)議在微信中直接喚起app哑芹。
因此,我們需要先判斷頁(yè)面場(chǎng)景是否在微信中捕透,如果在微信中聪姿,則會(huì)提示用戶在瀏覽器中打開(kāi)。
H5中間接判斷應(yīng)用是否安裝
這里的邏輯很簡(jiǎn)單乙嘀,當(dāng)沒(méi)有成功打開(kāi)app的時(shí)候末购,新頁(yè)面不會(huì)彈出則頁(yè)面邏輯繼續(xù)進(jìn)行;否則如果進(jìn)入了新頁(yè)面虎谢,則頁(yè)面邏輯便終止了盟榴。所以我們可以另開(kāi)一個(gè)延時(shí)的線程來(lái)判斷這個(gè)事情
if(...){
document.location = '';
setTimeout(function(){
//此處如果執(zhí)行則表示沒(méi)有app
},200);
}
通過(guò)H5喚起APP
編輯AndroidManifest.xml,主要是增加第二個(gè)<intent-filter>婴噩,launchapp用來(lái)標(biāo)識(shí)schema擎场,最好能保證手機(jī)系統(tǒng)唯一,那樣就可以打開(kāi)應(yīng)用几莽,而不是彈出一個(gè)選擇框迅办。可以附帶自己的數(shù)據(jù)通過(guò)string傳遞到activity章蚣,比如完整url為 launchapp://?data=mydata
<activity
android:name="com.robert.MainActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="launchapp" android:pathPrefix="/haha" />
</intent-filter>
</activity>
然后通過(guò)activity獲得data數(shù)據(jù):
public void onCreate(Bundle savedInstanceState) {
Uri uridata = this.getIntent().getData();
String mydata = uridata.getQueryParameter("data");
}
編寫(xiě)html頁(yè)面
整個(gè)頁(yè)面也許是某個(gè)app的詳細(xì)介紹站欺,這里只寫(xiě)出關(guān)鍵的js代碼:
<activity
android:name="com.robert.MainActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="launchapp" android:pathPrefix="/haha" />
</intent-filter>
</activity>
下面代碼可以達(dá)到這樣一個(gè)目的,先請(qǐng)求 launchapp:// ,如果系統(tǒng)能處理,或者說(shuō)已經(jīng)安裝了myapp表示的應(yīng)用矾策,那么就可以打開(kāi)磷账,另外,如果不能打開(kāi)蝴韭,直接刷新一下當(dāng)前頁(yè)面够颠,等于是重置location熙侍。
function openApp() {
if (/android/i.test(navigator.userAgent)) {
var isrefresh = getUrlParam('refresh'); // 獲得refresh參數(shù)
if(isrefresh == 1) {
return
}
window.location.href = 'launchapp://haha?data=mydata';
window.setTimeout(function () {
window.location.href += '&refresh=1' // 附加一個(gè)特殊參數(shù)榄鉴,用來(lái)標(biāo)識(shí)這次刷新不要再調(diào)用myapp:// 了
}, 500);
}
}
整體代碼
代碼功能: 判斷手機(jī)/平板是否安裝app 如果安裝 則調(diào)用app的scheme,傳入url當(dāng)作參數(shù)蛉抓,來(lái)做后續(xù)操作 如果沒(méi)有安裝 則跳轉(zhuǎn)到app store/google play 下載app
(function () {
var openUrl = window.location.search;
try {
openUrl = openUrl.substring(1, openUrl.length);
} catch (e) {}
var isiOS = navigator.userAgent.match('iPad') || navigator.userAgent.match('iPhone') || navigator.userAgent.match(
'iPod'),
isAndroid = navigator.userAgent
.match('Android'),
isDesktop = !isiOS && !isAndroid;
if (isiOS) {
setTimeout(function () {
window.location = "itms-apps://itunes.apple.com/app/[name]/[id]?mt=8";
}, 25);
window.location = "[scheme]://[host]?url=" + openUrl;
} else if (isAndroid) {
window.location = "intent://[host]/" + "url=" + openUrl + "#Intent;scheme=[scheme];package=[package_name];end";
} else {
window.location.href = openUrl;
}
})();