最近这个困惑了很久,不断的有一些坑,目前还有疑问关于iOS唤起无效时会出现弹框的问题,这个最后再说

1、首先可能需要判断当前浏览器的来源(目前开发的App还没有上架,所以针对腾讯出品的大家广为人知的微信和qq进行了特殊处理)

function  GetMobelType()  {                
var  browser  =   {                    
versions:   function()  {                        
var  u  =  window.navigator.userAgent;                        
return  {                            
trident:  u.indexOf('Trident')  >  -1, //IE内核
presto:  u.indexOf('Presto')  >  -1, //opera内核
Alipay:  u.indexOf('Alipay')  >  -1, //支付宝
webKit:  u.indexOf('AppleWebKit')  >  -1, //苹果、谷歌内核
gecko:  u.indexOf('Gecko')  >  -1  &&  u.indexOf('KHTML')  ==  -1, //火狐内核
mobile:  !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
ios:  !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
android:  u.indexOf('Android')  >  -1  ||  u.indexOf('Linux')  >  -1, //android终端或者uc浏览器
iPhone:  u.indexOf('iPhone')  >  -1  ||  u.indexOf('Mac')  >  -1, //是否为iPhone或者安卓QQ浏览器
//iPhone: u.match(/iphone|ipod|ipad/),//
iPad:  u.indexOf('iPad')  >  -1, //是否为iPad
webApp:  u.indexOf('Safari')  ==  -1, //是否为web应用程序,没有头部与底部
weixin:  u.indexOf('MicroMessenger')  >  -1, //是否为微信浏览器
qq: u.match(/\sQQ/i) !== null, //是否QQ
Safari:  u.indexOf('Safari')  >  -1,
  ///Safari浏览器,
};                    
}()                
};                
return  browser.versions;            
}

 2、接下来需要搞清楚唤起的原理,这里请教大神,唤起是调用协议,因为我们是不能判断有没有app,只能尝试唤起,如果唤起App就是有,正常来说要将唤起当做没唤起来做,保持整个流程的稳定性,下面是唤起的代码。

经测试发现Android和iOS在微信都是不可以唤起的,所以加了一个蒙板提示在浏览器打开;在QQ里,Android是可以唤起App的,iOS不可以,所以也需要提示用户在浏览器打开。

function jump(myurl) {
var timeout = 2300, timer = null;
if(GetMobelType.weixin) {
$("#bgCoverOPen").show();
} else {
var startTime = Date.now();
if(GetMobelType.android) {
var ifr = document.createElement('iframe');
ifr.src = myurl;//这里是唤起App的协议,有Android可爱的同事提供
ifr.style.display = 'none';
document.body.appendChild(ifr);
timer = setTimeout(function() {
var endTime = Date.now();
if(!startTime || endTime - startTime < timeout + 300) {
document.body.removeChild(ifr);
window.open("唤起失败跳转的链接");
}
}, timeout);
}
if(GetMobelType.ios || GetMobelType.iPhone || GetMobelType.iPad) {
if(GetMobelType.qq) {
$("#bgCoverOPen").show(); //提示在浏览器打开的蒙板
} else {
/*var ifr = document.createElement("iframe");
ifr.src = myurl;
ifr.style.display = "none";*/ iOS9+不支持iframe唤起app
window.location.href = myurl; //唤起协议,由iOS小哥哥提供
//document.body.appendChild(ifr);
timer = setTimeout(function() {
window.location.href = "ios下载的链接";
}, timeout);
};
}
}
}

 3、如上所示,这里在测试过程中发现打开App再回到网页,或者点击唤起的等待时间超出我们自己设定的时间2300时,网页会自动跳转到下载界面,这里是定时器的超出,目前没有明确的办法处理,但是加了一个处理的时间,

          $(document).on('visibilitychange webkitvisibilitychange', function() {
var tag = document.hidden || document.webkitHidden;
if (tag) {
clearTimeout(timer);
}
})
$(window).on('pagehide', function() {
clearTimeout(timer);
})

 结合上面 方法一起使用可以阻止界面打开App再回到网页的展示下载页面,亲测有效,但是无法阻止界面用户唤起等待不操作时间超出这一跳转。

4、另一个坑就是开始说的iOS9+iframe唤起无效,只能使用location唤起,但是会出现弹窗

这个在请教大神的时候说的都是推荐使用Universal Links,需要客户端服务端配合解决,这里因为我们的iOS小哥哥一直在修复历史bug,开发新需求,暂时没有进行,会持更新。问题相关可以在疑问帖这里查看。

大家如果有其他解决方法也可以联系我,请多多指教,蟹蟹。

h5移动网页唤起App的更多相关文章

  1. H5如何实现唤起APP

    前言 写过hybrid的同学,想必都会遇到这样的需求,如果用户安装了自己的APP,就打开APP或跳转到APP内某个页面,如果没安装则引导用户到对应页面或应用商店下载.这里就涉及到了H5与Native之 ...

  2. h5页面唤起app(iOS和Android),没有安装则跳转下载页面

    浏览器和app没有通信协议,所以h5不知道用户的手机释放安装了app.因此只能是h5去尝试唤起app,若不能唤起,引导用户去下载我们的app. 微信里屏蔽了 schema 协议,如果在微信中打开h5, ...

  3. H5页面中唤起native app

    现在各类app,分享出去的H5页面中,一般都会带着一个立即打开的按钮,如果本地安装了app,那么就直接唤起本地的app,如果没有安装,则跳转到下载.这是一个很正常的推广和导流量的策略,最近产品经理就提 ...

  4. H5 唤起 APP的解决方案

    H5 页面唤起APP或跳转到下载APP的某个链接地址.总结如下: 在 IOS 中, 系统版本在 8 以下时,可以监听页面的 pagehide / visibilitychange 事件. 系统版本大于 ...

  5. H5唤起app

    H5唤起app 1.判断是否在微信中打开 无论是在哪个平台的客户端Android/IOS,在微信的平台上访问都有一个问题,那就是无法启动客户端,这是微信为了安全性考虑的限制,android这边屏蔽sc ...

  6. h5唤起APP并检查是否成功

    // 检查app是否打开 function checkOpen(cb) { const clickTime = +(new Date()); function check(elsTime) { if ...

  7. h5 唤起app或跳转appStore

    //唤起app通过唤端媒介(URL Scheme)   //微信浏览器自6.3.x版本起禁用了大多数Scheme跳转功能,扫一扫目前可用   // URL 的组成:   // [scheme:][// ...

  8. 【js】手机浏览器端唤起app,没有app就去下载app 的方法

    这种功能的作用: 1.一般公司有自己的app,而app是需要不断有新用户涌入才能持续运营,达到不错的收入.就需要使用这种方式进行引入新的用户. 2.一些内容在网页端体验不好,或者一些功能需要app内才 ...

  9. 浏览器唤起APP的功能

    http://blog.html5funny.com/2015/06/19/open-app-from-mobile-web-browser-or-webview/ http://panli.mu.g ...

随机推荐

  1. SQL Server 2012无法连接到WMI提供程序

    这篇文章主要介绍了SQL Server 2012无法连接到WMI提供程序(Cannot connect to WMI provider)解决方案,需要的朋友可以参考下 今天一位同事在启动自己工作机的S ...

  2. 第23课 可变参数模板(4)_Optional和Lazy类的实现

    1. optional类的实现 (1)optional的功能 ①optional<T>的内部存储空间可能存储了T类型的值,也可能没有.只有当optional被T初始化之后,这个option ...

  3. 常用命令npm,gulp, node

    npm常用命令: 检查npm模块的安装情况:(以常用模块 grunt为例说明) 1) 检查是否全局安装了模块Grunt: $npm list -g grunt 2) 列出所有已经全局安装的模块:$np ...

  4. composer在phpstorm中安装代码库

    E:\php\PHPTutorial\WWW\kmmhtt>composer install composer 安装地址 :https://getcomposer.org/download/

  5. python-web自动化环境安装

    web自动化环境安装 1.安装selenium 命令行使用以下命令安装selenium:pip install -U selenium 2.安装chrome浏览器 3.chromedriver的下载  ...

  6. python第三方库Requests的基本使用

    Requests 是用python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTT ...

  7. 史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官

    想往高处走,怎么能不懂 Dubbo? Dubbo是国内最出名的分布式服务框架,也是 Java 程序员必备的必会的框架之一.Dubbo 更是中高级面试过程中经常会问的技术,无论你是否用过,你都必须熟悉. ...

  8. 阿里云RDS读写分离数据查询延迟解决

    mysql使用RDS做数据主从读写分离.在使用的过程中发现部分业务对其他服务以来严重.但是由于系统不是采用微服务的架构,造成部分数据插入数据库后,后续操作读取数据库没有查询到前面插入的数据.查看阿里云 ...

  9. python批量处理文件夹中文件的问题

    用os模块读取文件夹中文件 原来的代码: import osfrom scipy.misc import imread filenames=os.listdir(r'./unprocess')for ...

  10. 多个css样式合并到一个“目录”css文件中

    执行访问jsp后发现没有效果 同样的代码,在html中效果对比如下: 具体原因:不清楚,暂时记着~~~在jsp中不支持@import这种css样式的引用