一个比较完整的产品线,必定有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也有相关文档说明。

  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浏览器效果都还算理想。

欢迎讨论,如果有更完美的方案可以告诉我以完善代码。

手机浏览器通过Scheme跳转APP,兼容各种手机浏览器的更多相关文章

  1. 从浏览器直接转跳到APP具体页面---(魔窗)MagicWindow使用教程

    想要实现在网页里一键调到你APP的指定页面吗,好比打开 JD的一个商品的网页,从网页调到APP这个商品的页面.APP服务化, 使用魔窗SDK可以轻松实现! 老规矩:效果图奉上 1.注册魔窗账号,创建A ...

  2. 浏览器通过Scheme协议启动APP中的页面

    在APP开发过程中,通过外部浏览器调起APP页面的场景也很普遍使用.下面就介绍一下通过外部H5页面唤起APP中页面的通用方法. 1.首先需要在AndroidMainifest.xml中对你要启动的那个 ...

  3. 手机浏览器跳转APP

    背景 对于APP来说,回流分享页是最好的最便宜的也是最病毒式的拉新方式.让新用户去下载APP是重要的.对老用户来说,可以直接调起APP也是提升用户体验和让用户有侵入式体验的重要手段.所以我们一起来看看 ...

  4. 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP

    不管是app的下载链接还是普通文件的链接在微信内置浏览器或者QQ内置浏览器都会被屏蔽.这是微信对第三方下载域名实施的拦截政策.被拦截了用户在微信内打开就会提示“已停止访问该网页”. 那么当我们遇到这个 ...

  5. URL Scheme APP跳转safari以及跳回APP

    上图 : 在plist文件里面设置. URL identifier 一般为反域名+项目名称 (尽可能保证少重复) URL Schemes是一个数组.一个APP可以添加多个.该参数为跳转时使用的标识. ...

  6. 从浏览器或者Webview 中唤醒APP

    本文来自网易云社区 作者:刘新奇 移动互联时代,很多互联网服务都会同时具备网站以及移动客户端,很多人认为APP的能帮助建立更稳固的用户关系,于是经常会接到各种从浏览器.webview中唤醒APP的需求 ...

  7. 分析app和wap手机网站的不同

    随着手机3G.4G时代的到来,手机功能的越来越强大,手机App的市场是越来越火爆,时代在更新随之而来的事物也在更新,不能更上时代的步伐是落后的表现,所以不仅仅是手机APP在完善,手机网站WAP也在不断 ...

  8. 移动开发中的Scheme跳转说明——Allowing OtherApps to Start Your Activity

    Allowing OtherApps to Start Your Activity 为了开发更多人使用的App,我们总希望我们的App能够提供一种接口被其他App调用.如我们常见的 大众点评  与  ...

  9. 根据appid跳到App Store某个APP的详情页

    需求 本手机是否装了某个APP 示例百度appid 382201985  scheme BaiduSSO:// 1.是,直接打开百度APP 2.否,跳到App Store百度APP的详情页 NSStr ...

随机推荐

  1. vscode & javascript & react & "editor.foldingStrategy": "indentation"

    vscode & javascript & react & "editor.foldingStrategy": "indentation" ...

  2. how to config custom process.env in node.js

    how to config custom process.env in node.js process.env APP_ENV NODE_ENV https://nodejs.org/api/proc ...

  3. Next.js & SSR & CSR & SG

    Next.js & SSR & CSR & SG getStaticPaths, getStaticProps, getServerSideProps getStaticPro ...

  4. WiFi & QR Code

    WiFi & QR Code https://github.com/bndw/wifi-card https://wifi.dev.bdw.to/ 扫码登录 WIFI:T:WPA;S:free ...

  5. linux DRM 之 GEM 笔记

    原文链接:https://www.cnblogs.com/yaongtime/p/14418357.html 在GPU上的各类操作中涉及到多种.多个buffer的使用. 通常我们GPU是通过图像API ...

  6. CSS中Position属性static、absolute、fixed、relative

    在html中网页可以看成一个立体的空间,一个完整的页面是由很多个页面堆积形成的,如下图所示   CSS中Position属性有四个可选值,它们分别是:static.absolute.fixed.rel ...

  7. list 打乱排序

    public IList<T> RandomSortList<T>(List<T> ListT) { Random random = new Random(); L ...

  8. 为WebView 同步cookie

    import android.os.Build;import android.text.TextUtils;import android.webkit.CookieManager;import and ...

  9. CentOS Install NMP

    目录 Installation steps of the Nginx install run 默认安装路径 指定安装目录 Installation steps of the MySQL 下载源码包 解 ...

  10. Python 元类编程实现一个简单的 ORM

    概述 什么是ORM? ORM全称"Object Relational Mapping",即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码 ...