HTML 打开 APP


最近遇到一个需求,给用户发短信,并附带上一串链接,用户点击链接跳转到html页面之后,如果安装了 app,要求自动跳转到应用内的对应页面。通过 HTML 打开 APP, 前端通常需要用到 URL Schema。

url schema

URL schema 可以理解成 app 自定义的跳转协议,使用方式也极其简单,通常访问网站, 输入它的url,例如 https://www.google.com, 在 :// 之前的 https 就是协议,后面的 www.google.com 是协议接纳的参数,组合起来就是访问网络上某地址的资源。 类似的,url schema 是属于 app 的地址,如果系统有安装此应用、可以识别它,那就通过它跳转到应用并访问 app 的资源。

例如:myapp://some-extra-infomation。其中,myapp 需要app在开发过程中预先定义好, 是属于这个 app 的识别名;some-extra-information 是一些其它的app内自定义、自解析的参数,一般和网络上的资源路径类似。

通用做法

有了 url schema, 可以让一个 a 标签指向这个地址,或者是手动修改 window.location 跳转, 都是可行的。但是网上很多的做法是往文档里插入一个 iframe, 然后指定其 src 为特定的 url-schema,延迟一定时间后从 html 中移除 iframe,并跳转到下载链接。代码如下:

function openApp (schema) {
  var iframe = document.createElement('iframe')
  iframe.style = 'display: none;'
  document.body.appendChild(iframe)
  iframe.src = schema
  window.setTimeout(function () {
    document.body.removeChild(iframe)
    window.location = 'http://your-app-download-url'
  }, 2000)
}

这个方法在 ios safari / android uc browser / android qq browser 都是可以并且可以“自动”跳转的。a 标签也可以自动跳, 让它“点击”以下即调用a.click() 即可。

但是在 android chrome 内,以上这些尝试自动跳转的方法都不起作用。查阅了相关文档,均表示: 打开页面自跳转到 app 是一种用户体验非常差的行为。有鉴于此,在 android chrome 会阻止非用户交互触法的自动跳转, 无论是 iframe.src 还是 window.location 还是 a.click() 还是 clickTarget.dispatchEvent(fakeMouseEvent)

仔细想想,由用户选择是否要打开 app 确实是较为合理的用户体验。之前在 ios safari 里打开一些来自知乎、贴吧的页面,自动跳转到 app 内打开了,结果只要切换回 safari 仍然自动跳转一次,很恼人。

reference