最近这个困惑了很久,不断的有一些坑,目前还有疑问关于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. 使用Go编写WebAssembly

    I. Install go 1. down https://golang.org/dl/ go1.12.3.windows-amd64.zip 2. set path (1) GOROOTvar na ...

  2. VS2012 C# 连接MySQL数据库

    原则:不安装 1.下载: https://dev.mysql.com/downloads/connector/net/6.8.html#downloads 2.解压 → 3.添加引用(一个MySql. ...

  3. linux如何复制文件夹和移动文件夹

    linux下文件的复制.移动与删除命令为:cp,mv,rm一.文件复制命令cp 命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination)cp [option ...

  4. 图灵一代接入V1

    现在官方没有一代接入了,但是还是可用,留个方法 $.ajax({ type:"post", url:"http://www.tuling123.com/openapi/a ...

  5. iReport-5.6.0 新建文件为什么是灰色的?新建项目没有选择项?

    从网上下了绿色版和安装版都出现这个问题. 解决:发现原来是有些插件没有激活,进入手动激活就ok了 -->工具-->插件-->已安装 ,选择未激活的手动激活. 激活成功后如下图(和我同 ...

  6. 清除eclipse,STS workspace历史记录

    记一下 打开eclipse下的/configuration/.settings目录 修改文件org.eclipse.ui.ide.prefs文件 把RECENT_WORKSPACES这项修改为你需要的 ...

  7. python入门 -- 学习笔记1

    学习资料:笨方法学Python 准备: 安装环境----请自行网络搜索(Windows安装很简单,和其他安装程序一样) 找一个自己习惯的编辑器(比如:sublime text 3) 创建一个专门的目录 ...

  8. css之标签选择器

    标签(空格分隔): 标签选择器 选择器定义: 在一个HTML页面中会有很多很多的元素,不同的元素可能会有不同的样式,某些元素又需要设置相同的样式,选择器就是用来从HTML页面中查找特定元素的,找到元素 ...

  9. EasyChat简易聊天室实现

    我是个技术新人,刚刚毕业,平时遇到问题都是在网上查找资料解决,而很多经验都来自园子,于是我也想有自己的园子,把自己的编程快乐与大家分享. 在学校学习的期间,老师带我们做winform,那时候我什么都不 ...

  10. Linux查看某个进程的线程

    线程是现代操作系统上进行并行执行的一个流行的编程方面的抽象概念.当一个程序内有多个线程被叉分出用以执行多个流时,这些线程就会在它们之间共享特定的资源(如,内存地址空间.打开的文件),以使叉分开销最小化 ...