最近在作微信、QQ、微博中使用js唤起App,以前也作过相似的功能,不过比较粗糙,考虑的状况不太全,并且那已是好久以前的事情了,不少技术都已过期,如今有体验更好,功能更加完善的唤起技术,以前的不少的方案,到了如今都已经是不太必要了,如今经过这篇文章分享给你们一个全面的、最新的唤起方案,但愿对你们有帮忙。android
用户点击H5页面的打开App或者下载按钮(这个按钮可能在一个下载入口页、各类分享页面的吸顶或吸底的banner),若是用户已经安装了App,则根据业务跳转到相应的Native页面;若是用户没有安装该应用,则跳到AppStore或者应用市场去下载咱们的App。git
首先全部的下载/唤起入口都是一个直接跳转,应该是这样:github
<a href="https://applink-party.mtime.cn/mtlf">下载</a>
或者这样:web
window.location.href = 'https://applink-party.mtime.cn/mtlf'
全部的业务判断都是mtlf
这个页面里面来作,这样有两个好处:json
universal link
universal link
universal link
的优点在iOS9以前,唤起方式和如今安卓是一个的,都是使用scheme
进行唤起,这种方式有个小问题,每次唤起,都会给个提示:是否打开xx应用,这样从体验上来说,又让用户多一步操做。universal link
会直接跳转,不会在页面作停留,条件就是在咱们项目的根目录,增一个apple-app-site-association.json
文件,里面的内容大体是这样:浏览器
而后iOS的App后台再配置一下,就能够实现直接唤起了!缓存
universal link
配置在H5端怎么才算配置成功了呢?只要咱们某一个url在浏览器打开(不论是cdn地址,仍是路由转发),看到json文件的内容,H5这边就算配置成功。而后把这个地址,给iOS
老司机,和他们一说什么事,他们马上就知道作什么,就这么简单!微信
通过长时间的实验,总结了这张在各类状况下,唤起成功/唤起失败的解决方案,咱们接下来一个一个的说。app
微信是最重要的一种分享渠道,可是咱们可以作的,却很少。以前,iOS
下的微信支持universal link
这种唤起方式,可是从2018年1月8日以后,微信把这个给屏蔽了!!!无论微信基于什么缘由,把iOS
下这种最便捷的唤起方式屏蔽,咱们能作的只能是适应了。so,如今不论是iOS仍是android,咱们的处理方式是同样的:都是直接跳到应用宝。iOS的应用宝会引导找开AppStore
,android的应用宝会直接打开App(前提是你已经下载)
注:微信把itunes
连接也屏蔽了,因此也没办法直接跳转AppStore
,只能借助应用宝来搭这个桥。iphone
微博目前还支持universal link
唤起,咱们只须要考虑未下载的状况。
iOS
下,微博是不支持打开应用宝的连接,因此咱们须要引导用户使用Safari
打开,像这样:android
平台下,使用scheme
这种方式是唤不起App的,可是有特例,一样是scheme
,大人点评和网易云音乐就能够唤起,有空你们能够本身试试,因此咱们能够推断出,安卓平台下的微博,也有相似微信同样的白名单,在白名单内的,就可使用scheme
唤起,就像微信之于京东,京东在微信里面就是经过scheme
方式唤起的。so,不论是iOS
仍是android
,咱们的方案是:直接引导用户使用本地浏览器打开。
iOS
平台下,QQ目前还支持universal link
唤起,要是没有安装,QQ下也支持直接打开itunes
连接,比较其余应用,QQ支持是最好的。android
平台下,QQ也支持scheme
方式唤起,可是在一些老机型下,QQ会有必定的几率唤起失败,具体的现象是:第一次打开页面,唤起失败,再次打开,唤起成功。根据现象,咱们能够推测出,在QQ的webview
中,会对scheme
的唤起方式作一些加载时间上的限制,经测试,大约在500ms,超过这个时间值,就会出现唤起失败的状况。为何第二次打开,唤起成功的几率会大,是由于第一次加载时,已缓存了文件,第二次打开直接加载,这样时间在限制以内。Safari这种状况比较简单,支持universal link
,也支持直接打开itunes
,so,如图处理就能够了。
iOS9
中,Safari
不支持直接跳转itunes
,so,这种状况须要作兼容处理,能够直接跳到应用宝setInterval
的时间就会变慢,经我测试,已经用不到这种方法了,只须要使用document.hidden || document.webkitHidden
就能够,兼容性还不错Safari
浏览器时,通常判断都是UA中有没有这个字符串,经测试发现,安卓的UA中,也包含Safari
这个字符串(以下UA展现),因此须要加上操做系统的判断Scheme
唤起,以前有不少方案,好比:使用iframe
、<a>标签点击
、window.location
...经测试,只要使用a标签点击,这样兼容性最好,代码大约长这样:两个平台,这么多状况,要一个一个测试吗?固然要一个一个的验证,可是在开发期间,没有必要改一行,在手机上测试一下,这样效率过低了,尤为是像同样,选了一个安卓4.4的手机,绝对能够磨练你的耐心。为了提升效率,我把我经常使用到的UA分享给你们,这样在Chrome
模拟器里配置一下,就能够本地调试了,经常使用UA以下:
Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_2 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Mobile/15C202 MicroMessenger/6.6.1 NetType/WIFI Language/zh_CN
Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_2 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Mobile/15C202 QQ/7.3.5.473 V1_IPH_SQ_7.3.5_1_APP_A Pixel/1125 Core/UIWebView Device/Apple(iPhone X) NetType/WIFI QBWebViewType/1
Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_2 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Mobile/15C202 Weibo (iPhone10,3__weibo__8.1.0__iphone__os11.2.2)
Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_2 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0 Mobile/15C202 Safari/604.1
Mozilla/5.0 (Linux; Android 4.4.2; PE-TL20 Build/HuaweiPE-TL20; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/043807 Mobile Safari/537.36 MicroMessenger/6.6.1.1220(0x26060135) NetType/WIFI Language/zh_CN
Mozilla/5.0 (Linux; Android 4.4.2; PE-TL20 Build/HuaweiPE-TL20; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/043807 Mobile Safari/537.36 V1_AND_SQ_7.3.2_762_YYB_D QQ/7.3.2.3350 NetType/WIFI WebP/0.3.0 Pixel/1080
Mozilla/5.0 (Linux; Android 4.4.2; PE-TL20 Build/HuaweiPE-TL20) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 Weibo (HUAWEI-PE-TL20__weibo__8.0.2__android__android4.4.2)
配置完成以后,就能够像我同样,在电脑上切换环境啦:
整个唤起流程,能够访问这个下载入口:https://party.mtime.cn/download
也能够扫码: