我一人,我异人,我亦人

导航

h5移动网页唤起App

最近这个困惑了很久,不断的有一些坑,目前还有疑问关于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,开发新需求,暂时没有进行,会持更新。问题相关可以在疑问帖这里查看。

 

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

posted on 2017-12-12 14:57  苏小十~  阅读(17664)  评论(0编辑  收藏  举报