H5唤起app

Posted by Shen Chaoran on July 31, 2019

三种协议

URL Scheme

安卓老版本和ios都支持 格式: <scheme>://[authority]<path>[?query]

  • scheme 为应用标识
  • authority 认证
  • path 路由
  • query 参数

示例:

weixin://
alipays://
taobao://
mqq://
zhihu://
sms://
cmshowidol://ui_openPage?pageName=${pageName}&data=${encodeURI(JSON.stringify(pageData))}

scheme 的唤起方式会被浏览器和app拦截:

  • chrome 禁止非用户操作的 scheme 跳转,所以必须要加 button 让用户点击才能跳转
  • QQ浏览器、其他 App 内置 webview 的浏览器,都会对 scheme 进行拦截(需要加入app的白名单才行)

Intent

chrome 25以后的版本支持

intent:
   HOST/URI-path // Optional host
   #Intent;
      package=[string];                     必选
      action=[string];
      category=[string];
      component=[string];
      scheme=[string];                      必选
   end;

例如:intent://ui_openPage?pageName=${pageName}&data=${encodeURI(JSON.stringify(pageData))}/#Intent;scheme=cmshowidol;package=com.tencent.kapu;end

IOS 9+支持

触发方式

  • <iframe src='${intentURL}' style='display:none'>打开</iframe>
  • <iframe href='${intentURL}' style='display:none'>打开</iframe>
  • window.location=intentURL

OS的差异性

Android

IOS

  • 下载 app 必须要到跳转到 app store,使用的 scheme 协议为: itms-appss://apps.apple.com/app/id590338362
  • 唤起 app 可以直接用 window.location.href = schemeURL

其他

唤端结果的捕获

唤端成功后浏览器进入后台运行,计时器被推迟(计时器不准),重新切换到浏览器后一般超过2s,此时认为唤端失败

let openTime = new Date()
setTimeout(() => {
    if(+new Date() - openTime > 2000) {
        alert('打开成功')
    }
    else {
        alert('打开失败')
        alert('请使用safari浏览器打开~')
    }
}, 1000);
window.location.href = schemeURL

浏览器的差异性