H5 唤醒APP功能

最近遇到一个需求,需要在从APP分享出去的H5页面中,带有一个立即打开的按钮,如果本地安装了app,那么就直接唤起本地的app,如果没有安装,则跳转到下载。这是一个很正常的推广和导流量的策略。前端小白从来没有做过这个需求,只能开始哼唧哼唧地开启自己的度娘和谷歌之旅。

经过一段时间的探索之旅发现里面的学问很多,要做一个兼容性很好的方案,就需要考虑各种情况,在不同的情况适配不同的方案,比方说用户是在手机浏览器打开还是微信中打开,或者是在pc中打开,universal腾讯应用宝直接打开 APP link是否被关闭等,这就使代码实现变得复杂,且容易出错,且还有安卓平台机型众多、浏览器众多等导致的兼容问题。由于时间有限,这次主要先介绍一个比较普遍的使用URL Scheme进行App跳转的方法。

URL Scheme —— 唤端媒介

来源

一般来说,我们使用的智能设备上有许多我们的个人信息。比如:联系方式、银行卡/信用卡信息、支付宝/Paypal/各大商城的账户密码、照片甚至行程与位置信息等。

如果说,你设备上的每一个应用,不管是官方的还是你从任何商城安装的应用都可以随意地获取这些信息,那么你轻则收到骚扰信息和邮件、重则后果不堪设想。如何让这些信息不被其它应用随意使用,或者说,如何让这些信息仅在设备所有者本人知情并允许的情况下被使用,是所有智能设备与操作系统所要在乎的核心安全问题。针对这个问题,苹果使用了名为「沙盒」的机制:应用只能访问它声明可能访问的资源。一切提交到 App Store 的应用都必须遵守这个机制。

在安全方面沙盒是个很好的解决办法,但是有些矫枉过正。敏感的个人信息我们不愿意透露,却不代表所有的信息我们都不想与其它应用共享。因此,我们急需要一个辅助工具来帮助我们实现应用通信, URL Schemes 就是这个工具。

URL Schemes是什么

[scheme]://[host]/[path]?[query]

我们拿 https://www.baidu.com 来举例,scheme 自然就是 https 了,后面拼接的是传递的参数。URL Schemes 没有特别严格的规范,所以后面参数的具体定义是app开发者去自定义。

就像给服务器资源分配一个 URL,以便我们去访问它一样,我们同样也可以给手机APP分配一个特殊格式的 URL,用来访问这个APP或者这个APP中的某个功能(来实现通信)。APP得有一个标识,好让我们可以定位到它,它就是 URL 的 Scheme 部分。

但是,两者还有几个重要的区别:

  • 所有网页都一定有网址,不管是首页还是子页。但未必所有的应用都有自己的 URL Schemes,更不是每个应用的每个功能都有相应的 URL Schemes。几乎没有所有功能都有对应 URL 的应用。一个 App 是否支持 URL Schemes 要看那个 App 的作者是否在自己的作品里添加了 URL Schemes 相关的代码。
  • 一个网址只对应一个网页,但并非每个 URL Schemes 都只对应一款应用。这点是因为苹果没有对 URL Schemes 有不允许重复的硬性要求,所以曾经出现过有 App 使用支付宝的 URL Schemes 拦截支付帐号和密码的事件。
  • 一般网页的 URL 比较好预测,而URL Scheme 因为没有统一标准,所以非常难猜,通过猜来获取 应用的 URL Schemes 是不现实的。

前面普及了一下URL Schemes的相关知识,作为个前端开发者,就不去深究其中的原理,都交给app开发者吧。接下来开始我们的正题。首先当然是要客户端提供App的Url Schemes。

用浏览器去打开scheme

在浏览器中打开 scheme 就像打开一个不同的http地址一样。可以在一个 a 标签中打开。

 打开App打开应用

点击上面的H5页面中的链接将会尝试唤醒对应app,在一些浏览器中,可能会弹出一个提示框,询问用户是否允许打开应用。

如果打开的 scheme 在本地没有对应的 app,则点击不会反应。

当然还可以使用 JavaScript 代码打开,只需要添加相应的事件触发和处理即可。

在JavaScript代码中打开连接有以下几种方式:

  • 新建一个隐藏的 iframe ,地址指向需要打开的url
  • 使用 window.location 或者 window.location.href 刷新当前页面
  • 新建一个隐藏的 a 标签,地址指向打开的url,并触发打开链接事件
  • 动态创建一个script脚本,在这个脚本中新建一个a标签并打开

以上方法是只是解决了在已安装App设备唤醒App的功能,并不能判断是否已安装App,没有安装即跳转至下载链接。

浏览器判断是否安装应用

在浏览器实际上是没有能力判断手机里是否安装了某个App的,所以只能够采取一种投机取巧的方式。

在JavaScript中判断页面是否进入后台来判断打开成功。Html5提供了下列事件和属性可以利用:

  • pagehide : 页面隐藏时触发
  • visibilitychange : 页面隐藏没有在当前显示时触发(切换tab也会触发该事件)
  • document.hidden : 当页面隐藏时,该值为true,显示时为false

上面这些事件或者属性并不是所有浏览器都支持。下面是一个给出为id为openBtn 的按钮添加打开scheme或者下载事件的例子,但对于Android 4.4版本以下则不支持

没有完美的方案

  • 微信中无法唤醒App,需要“用浏览器打开”是因为微信对所有的分享链接接做了scheme屏蔽,也就是说分享连接中所有对于scheme的调用都被微信封掉了。有些app是能在微信打开是因为微信有一个白名单(有关系就是不错),对于在白名单中的分享链接是不会屏蔽掉scheme调用的。
  • 本文只是小小地抛个砖,介绍了一种比较常用简单的方法去唤醒app,该方案兼容性不是特别好吧。要做出一个比较完美的方案还需要细细去钻研,还需要不停地去搬砖~不说了,搬砖去了~

作者:suan_suan

https://segmentfault.com/a/1190000018661914

h5 iframe显示不全_H5 唤醒APP小记相关推荐

  1. h5 intent 调起_H5唤醒App方式汇总

    最近在做扫码之后的h5页面唤醒App的功能,牵涉到oemApp等复杂的场景,做下记录 唤醒方式列表URL Schemes chrome intent ios UniversalLink / andro ...

  2. H5 唤醒APP小记

    最近遇到一个需求,需要在从APP分享出去的H5页面中,带有一个立即打开的按钮,如果本地安装了app,那么就直接唤起本地的app,如果没有安装,则跳转到下载.这是一个很正常的推广和导流量的策略.前端小白 ...

  3. h5页面启动安卓应用_H5唤醒App方式汇总

    H5唤醒App方式汇总 最近在做扫码之后的h5页面唤醒App的功能,做下记录 唤醒方式列表URL Schemes chrome intent ios UniversalLink / android a ...

  4. html iframe显示不全,滚动的iframe解决,但在iframe页面显示不全

    我试图滚动iOS上的iframe,我成功了,它的滚动的好,参考:滚动的iframe解决,但在iframe页面显示不全 但是,所有的解决方案都有一个问题:iframe页面没有完全显示... 我测试了我的 ...

  5. h5单页,微信浏览器唤醒APP

    微信内的H5单页,都不能直接唤醒APP.所以需要打开外部浏览器.目前android能够通过后台的配合修改请求头,打开外部浏览器唤醒APP.ios目前没找到合适的方法,只能引导用户自己使用默认浏览器打开 ...

  6. H5唤醒app,不完全兼容

    ---ps---最近新发现一个开源的H5唤醒app的库:建议使用第三方开源库https://github.com/suanmei/callapp-lib实现:或者极光魔链(后期可能会收费)https: ...

  7. 微信开放标签<wx-open-launch-app>之Vue项目H5唤醒APP

    微信开放标签<wx-open-launch-app>之Vue项目H5唤醒APP 在微信开放标签出来之前,大多数人都是采用 URI Scheme 以及 ios 的universal Link ...

  8. H5页面唤醒app的方法

    iOS/Android 浏览器(h5)及微信中唤起本地APP 会遇到的问题: 如何解决未安装APP时的做好引导页 如何在微信中唤醒APP 在iOS9中如何处理universal link被用户误关的情 ...

  9. android webview 网页图片加载不出来、显示不全、进入某页面退出,h5页面滑不了,点不了等功能异常等问题集锦

    在我们的android开发中,难免会嵌套一些h5页面在APP中,固然是减轻了开发者的负担,但也容易遇到一些很奇怪的问题. 一.网页图片加载不出来 此前笔者公司由于h5网页链接频繁被劫持篡改(链接被篡改 ...

最新文章

  1. Xcode中通过删除原先版本的程序来复位App
  2. Ubuntu Nginx uwsgi django 初试
  3. java file取不到linux文件_Java中高级核心知识全面解析——Linux基本命令(切换、增删改查、压缩文件、权限命令)...
  4. 在Excel中如何引用其他的工作表或者工作簿
  5. [转]解决Android studio升级到3.5的一些问题
  6. linux杀掉进程后总是重启,Linux监控进程,进程关闭自动重启方案
  7. python的zipfile压缩文件夹_python zipfile压缩使用说明
  8. html5+css3第一次作业_在家写作业日记200字
  9. Goodfellow说,聊失败才不是在秀优越...
  10. Windows下开源截屏工具软件Free Shooter
  11. 笔记本电脑下载python视频-笔记本怎样安装Python64位的?
  12. caffe︱Pascal VOC 2012 Multilabel Classification Model
  13. 【转】使用红雪越狱iPhone 4.3.3教程
  14. 贱人工具箱使用技巧6——制作表格和表格居中
  15. R_leaflet包_最易上手地图教程(二)
  16. mybaties中resultMap和resultType的区别
  17. 华为未来是铺满鲜花还是荆棘遍布?
  18. 中国3D打印软件市场现状分析及发展前景预测报告
  19. 爬取北京二手房数据信息(python)
  20. 如何评价python知乎_如何看待当下许多人盲目追风Python

热门文章

  1. 判断 std map 中是否有 key
  2. File errorchecker.pyx, line 17, in OpenGL_accelerate.errorchecker._ErrorChecker.__init__ (src\erro
  3. AngularJS 最佳实践
  4. ospfdr选举规则_OSPF-DR与BDR的选举及作用
  5. 性能案例-Linux下解决time_wait连接过多(Linux内核优化)
  6. 二十六、redis哨兵模式
  7. js输出php文件大小,前端js实现文件的断点续传 后端PHP文件接收
  8. redis失效了mysql扛不住_我是Redis,MySQL大哥被我害惨了!
  9. python cookbook 豆瓣_备受好评的20本python图书,不用到处找了!
  10. 去掉linux开关机图片,在Deepin Linux系统下去掉NVIDIA开机Logo的方法