前端视角中的H5页面调起APP全解决方案

2,084 阅读5分钟

自从智能手机开始流行,进入移动互联网时代,各个企业开始发布自己的APP,公共流量逐渐流入并固化到APP内部生态圈。而给到Web前端的其中一个重要任务就是引流,也就是从H5页面打开APP。

常用调起APP方式

URL Scheme

URL Scheme是一种由APP自定义的URL格式,用于实现调用APP执行特定操作的方式。 它和http的url很像,格式为myapp://path,下面列举一些常用APP的URL Scheme:

  • 微信
    • 打开微信(不指定具体功能页面):weixin://
    • 打开“扫一扫”功能:weixin://scanqrcode
  • 支付宝
    • 余额宝:alipays://platformapi/startapp?appId=20000032
    • 付款码:alipays://platformapi/startapp?saId=20000056
  • 淘宝
    • 打开购物车页面:taobao://main.m.taobao.com/cart/index.html

调用方式

它的调用方式也很简单,最广泛使用的是通过改变地址栏发出请求,也就是 window.location.href 或者 <a href="">打开APP</a> 这样的形式。但是会存在着如果没有安装该APP的话,会出现一个显示“无法打开页面”的弹窗

还有同样利用地址栏,但是相对间接一些的,就是使用 <iframe src=""></iframe> 去调起APP。它的好处是不会像上面那样在没有安装APP的时候出现弹窗,影响用户体验。缺点是可能存在兼容性问题,部分浏览器或者APP内部的webview可能会屏蔽这种调用方式,导致无效。

另外在古早时期(iPhone 3GS年代)也曾经可以使用 alert('xxx') 去调用。

Universal Link

这个是苹果在iOS 9添加的一种iOS系统特有的调用方式,用户体验更佳更丝滑,对用户无感知,即使没有安装APP也不会有弹窗提示。

下面有两个苹果官方提供的原生APP开发文档和使用手册

Universal links for developers

Allowing apps and websites to link to your content

下图是我总结的前端视角的Universal Link全流程:

前端视角中的H5页面调起APP全解决方案.png

由上面的叙述可知,Universal Link实际上传输给APP的内容就是页面地址,因此需要传给客户端的内容都要在地址上得到体现(新接入的话,可能需要进行一定程度的改造),并且地址上的结构、参数等都要和APP开发达成一致。

注意事项:

  • 确保配置文件可访问(我们曾经试过由于访问文件404导致整个链路失效)
  • 由于是系统层面拦截http请求页面,所以如果已安装用户是不会发出页面请求而直接打开APP,如果该中转页有相关数据埋点上报,就会绕过导致缺失
  • 由于此功能关系到用户导流,这个流程理论上应该是在每个客户端版本上线都需要覆盖测试(我们曾经多次遇到客户端代码优化导致该功能失效或者进入APP后解析出错无法跳转到期望的页面)

更加极致的方案

难道还有高手?必须得~

正如上面所说的,如果iOS设备已经安装了APP,页面请求就会被系统拦截而不会发出,意味如果服务器收到请求且UserAgent判断为iOS的话,几乎可以认为是未安装APP的设备。那么,就可以直接在HTTP返回头返回301状态码,并且Location字段返回App Store里APP的下载地址,如https://apps.apple.com/US/app/idxxxxxxxxxx?mt=8

这样,iOS用户的体验将会变得更加简洁,要么直接打开APP,要么进入App Store下载页。

微信开放跳转按钮(wx-open-launch-app)

目前Android微信基本上都把APP内部webview打开URL Scheme的路径给屏蔽掉了。一般情况下我们判断出微信打开页面的话,给出一个提示页让用户自己手动右上角点击浏览器打开,这样的操作就足以让这个链路的用户损失了不少。而这个方式是针对Android设备在微信场景内更优雅的跳转处理,则大大提高了这个场景下的用户体验。

简单来说,

  • 首先公司的服务号需要在微信平台登记备案,并绑定指定APP
  • 在微信开放平台完成相关配置
  • 同时APP需要接入微信OpenSDK
  • H5页面完成接入
    • 模版代码加入按钮组件
    • JS代码添加相关功能注册和调用

微信官方的开发文档

微信社区的代码实现事例

配置成功后,显示按钮:

前端视角中的H5页面调起APP全解决方案-2.jpg

整个用户体验也是非常丝滑:

  • 已安装APP,则显示提示是否允许跳转(目前Android 系统的常规操作)
  • 未安装APP,则跳转到 应用宝 内相应的APP下载页

总结

无论上面提到的哪一种方案,都有各自的适用场景和一定程度的缺陷,可以混合搭配根据不同场景不同优先级使用。

另外,有一点特别重要需要说明,无论什么情况下,对于页面代码来说,都是无法明确知晓本设备有没有安装APP。 所以,当业务侧提出诸如用户没有安装的时候就直接走下载、或者URL Scheme的方案能不能不出现弹窗,都是无法实现的。根据我多年和不同产品经理或运营同学合作,几乎每一个都会提出这样的想法或疑问,即需要我们提前和他们拉通好能做到的程度和功能。