zoukankan      html  css  js  c++  java
  • 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,开发新需求,暂时没有进行,会持更新。问题相关可以在疑问帖这里查看。

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

  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/simba-lkj/p/8027809.html
Copyright © 2011-2022 走看看