实现方式不太完美,最近看了微博、京东的手机版网页,感觉他们的实现方式很不错,研究了一下,实现以下效果:
如果本地已经安装了指定Android应用,就直接打开它;如果没有安装,则直接下载该应用的安装文件(也可以跳转到下载页面)。
实现效果
如下图所示,在手机浏览器中访问京东的手机版网站(m.jd.com),顶部会有一个广告图,点击这个广告图,如果手机上已经安装了京东App,则直接打开,如果没有安装,则开始下载。
实现方式
1.为Android应用的启动Activity设置一个Schema,如下:
<data?android:host="splash"?android:scheme="cundong"/>
2.用户点击浏览器中的链接时,在动态创建一个不可见的iframe,并且让这个iframe去加载步骤1中的Schema,如下:
var?ifr?=?document.createElement('iframe');ifr.src="cundong://splash"
3,如果在指定的时间内没有跳转成功,则当前页跳转到apk的下载地址(或下载页),如下:
window.location?=?download_url;
?
HTML代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | <! doctype ?html> < html > ???? < head > ???????? < meta ?http-equiv = "Content-Type" ?content = "text/html;?charset=utf-8" > ? ???????? < meta ?name = "apple-mobile-web-app-capable" ?content = "yes" > ???????? < meta ?name = "apple-mobile-web-app-status-bar-style" ?content = "black" /> ? ???????? < title >this's?a?demo</ title > ???????? < meta ?id = "viewport" ?name = "viewport" ?content = "width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,minimal-ui" > ???? </ head > ???? < body > ???????? < div > ???????????? < a ?id = "J-call-app" ?href = "javascript:;" ?class = "label" >立即打开>></ a > ???????????? < input ?id = "J-download-app" ?type = "hidden" ?name = "storeurl" ?value = "http://m.chanyouji.cn/apk/chanyouji-2.2.0.apk" > ???????? </ div > ? ???????? < script > ???????????? (function(){ ???????????????? var?ua?=?navigator.userAgent.toLowerCase(); ???????????????? var?t; ???????????????? var?config?=?{ ???????????????????? /*scheme:必须*/ ???????????????????? scheme_IOS:?'cundong://', ???????????????????? scheme_Adr:?'cundong://splash', ???????????????????? download_url:?document.getElementById('J-download-app').value, ???????????????????? 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); ???????????????????? } ???????????????? } ???????????????? window.addEventListener("DOMContentLoaded",?function(){ ???????????????????? document.getElementById("J-call-app").addEventListener('click',openclient,false); ? ???????????????? },?false); ???????????? })() ???????? </ script > ???? </ body > </ html > |
?AndroidMainfext.xml
?
<activity?????android:name=".activity.LauncherActivity"?????android:configChanges="orientation|keyboardHidden|navigation|screenSize"?????android:label="@string/app_name"?????android:screenOrientation="portrait"?>????????<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.DEFAULT"?/>????????????<category?android:name="android.intent.category.BROWSABLE"?/>????????????<data?android:host="splash"?android:scheme="cundong"?/>???????</intent-filter></activity>