手机浏览器通过Scheme跳转APP,兼容各种手机浏览器

 一个比较完整的产品线,必定有APP和网站,另外还有微信公众号网页和小程序。那么有一个比较常见的需求就是在手机浏览器内打开APP,实现起来也比较简单,只要APP配置的有URLScheme即可。但是因为无法判断是否安装APP,所有只能尝试去打开APP,如果打不开则跳转到APP下载页面。另外手机浏览器的类型很多,各个浏览器显示的效果也不一样,一直无法找到一个完全兼容所有浏览器的方法,没有完美的解决方案。

  打开APP的操作就是链接打开 location.href = "scheme://",APP未安装的时候链接打开有的时候会跳转到错误页面,所以可以使用iframe来跳转,保证浏览器链接一直在当前页面 document.querySelector("#iframeId").src = "scheme://",打开APP大部分手机浏览器会弹窗是否允许跳转打开。

  打开APP失败时跳转到下载,因为无法判断打开是否成功,所以通过setTimeout两秒后跳转下载地址。下载地址ios:https://itunes.apple.com/cn/app/要跳转的APP的appid,安卓下载地址自定义即可,放到自己的服务器地址上边,浏览器打开.apk地址自动提示下载。

测试了流行的几个手机浏览器,总结一下需要注意以下几点:

  1. 微信公众号网页打开APP,微信已经开放了接口,在微信开放平台配置域名代码里面添加按钮后即可跳转,小程序打开APP也有相关文档说明。https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Resource_Center_Homepage.html

  2. 安卓下的谷歌浏览器无法通过iframe的方式打开,必需使用location.href。

  3. 手机百度浏览器不支持打开APP,这个是百度自己的问题,不允许打开APP。另外百度浏览器中页面的按钮文字含有“下载”或“打开”的时候,按钮会被百度给隐藏掉(好霸道),所以只能换下文字或者加空格“下 载”“打 开”。

  4. UC浏览器页面初始化后直接通过js打开APP打开不了,需要点击实际的按钮触发打开。

最终实现的方式如下:

1. 通过js判断浏览器类型 

 var Navigator = navigator.userAgent;

  var ifChrome = Navigator.match(/Chrome/i) != null && Navigator.match(/Version\/\d+\.\d+(\.\d+)?\sChrome\//i) == null ? true : false; //判断是不是谷歌浏览器

  var ifAndroid = (Navigator.match(/(Android);?[\s\/]+([\d.]+)?/)) ? true : false; //判断是不是安卓

  var ifIos = /(iPhone|iPad|iPod|iOS)/i.test(Navigator); //判断是不是ios

  var ifUCorBaidu = /(UCBrowser|baiduboxapp)/i.test(Navigator); //判断是不是UC或百度浏览器

  var openUrl = "scheme://";

  var androidDownUrl = "https://xxx/1.0.0.apk";

  var iosDownUrl = "https://itunes.apple.com/cn/app/要跳转的APP的appid";

2. 分别操作

<div class="buttons" @click="openApp">{{text}}</div>

<iframe id="myDown" style="width: 1px;height: 1px;position: absolute;z-index: -1;top:10px"></iframe>

if(ifUCorBaidu) {

  this.text = '点 击 下 载 APP';

} else {

  this.text = '正在跳转中';

  openApp();

} //这里使用了vue,也可以用其他方式修改按钮文字

function openApp() {

window.onblur = function() {

  if(myTimeout) {
    clearTimeout(myTimeout);
  }
}; //onblur可以检测到页面消失,这时候一般已经打开了APP,就清除掉下载定时器,不跳出下载链接。

if (ifIos) {
  if(ifUCorBaidu) {
    window.location.href = iosDownUrl; //ios跳到App Store也可以打开APP,所以直接打开就好了。
  } else {
    window.location.href = openUrl;
    var myTimeout = setTimeout(function () {
      window.location.href = iosDownUrl;
    }, 1000);
  } else{

    if(ifChrome && ifAndroid) {
      setTimeout(function() {
        window.location.href = openUrl;
      }, 50)
    } else {
      document.querySelector("#myDown").src = openUrl;
    }
    var loadDateTime = Date.now();
    setTimeout(function() {
      var myTimeout = setTimeout(function() {
      var timeOutDateTime = Date.now();
      if (loadDateTime && (timeOutDateTime - loadDateTime) < (1500 + 200)) {
          window.location.href = androidDownUrl
        } //这里的操作跟直接setTimeout是一样的
      }, 1500);
    }, 100)
  }

}

}

经过测试 百度浏览器,QQ浏览器,UC浏览器,360浏览器,搜狗浏览器,夸克浏览器,Safari浏览器效果都还算理想。

### 微信小程序中安卓端点击后自动跳转手机外部浏览器打开APP下载链接的功能实现 为了实现在微信小程序中,当用户在安卓设备上点击某个按钮时能够自动跳转手机外部浏览器打开APP下载链接的功能,可以参考以下技术方案: #### 技术背景 由于微信内置浏览器的安全策略限制,在微信环境中直接触发外部浏览器的行为需要特定的技术手段。对于安卓平台而言,可以通过`WebView`的特性以及URL Scheme机制来间接实现这一目标[^2]。 #### 解决思路 1. **利用微信内置浏览器的局限性** 当前微信环境下的H5页面如果尝试直接调用外部应用或强制跳转外部浏览器,通常会被阻止。然而,通过某些特殊的方式(如模拟文件下载行为),仍然可以在一定程度上绕过这些限制[^3]。 2. **具体实现逻辑** 针对安卓设备,可以通过创建一个隐藏的iframe标签,并将其src属性设置为目标下载链接的方式来诱导微信内部浏览器主动唤起系统的默认浏览器。以下是具体的代码示例: ```javascript function redirectToExternalBrowser(url) { const iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = url; document.body.appendChild(iframe); } ``` 上述代码片段的作用是在当前文档中动态插入一个不可见的iframe元素,并将它的源指向所需的下载地址。此操作往往会促使安卓版微信启动系统级浏览器加载对应资源。 3. **注意事项** - 对于iOS设备来说,这种方法未必有效,因为iOS上的Safari拥有更严格的沙盒保护措施。 - 如果希望兼容更多场景,则需额外考虑服务端配合下发不同类型的响应头(Content-Disposition字段设为attachment形式)从而进一步增强跨平台适配能力。 4. **补充说明** 此外需要注意的是,随着各大社交软件不断更新其安全防护政策,未来此类做法可能会面临更大的挑战甚至完全失效的风险。因此建议始终关注官方最新API文档和技术公告以便及时调整开发策略[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值