Program/javascript

웹뷰(webview)에서 자바스크립트로 앱(app) 실행하기

soccerda 2022. 2. 4. 14:59
반응형

내가 찾는 기능은 있으면 실행 없으면 특정 url로 페이지를 전환하고 싶었으나..

 

안드로이드 최근 버전에서는 지원이 안 되는 듯....

 

<script> 
var AappChecker = { 
	appUserAgent:"MGPay",
	urlSchemeName:"hancapMobile", 
	urlHostName:"hancap", 
	packageName:"kr.co.hankookcapital.m", 
	browserFallbackUrl:"/ib20/mnu/HKMCOM050000", 
	iosMarketUrl:"https://itunes.apple.com/kr/app/%ED%95%9C%EA%B5%AD%EC%BA%90%ED%94%BC%ED%83%88-%EB%AA%A8%EB%B0%94%EC%9D%BC/id1358958350?mt=8", 
	googleMarketUrl:"market://details?id="+this.packageName+"&hl=ko&rdid="+this.packageName,
	getAppType:function() { 
		var phoneOS = ""; 
		var agent = navigator.userAgent; 
		if(agent){ 
			var re = new RegExp(this.appUserAgent, 'i'); 
			if((agent.match(re))){ 
				if(agent.match(/IOS/i) || agent.match(/iPhone/i)){ // iOS 
					phoneOS = "I"; 
				} else if(agent.match(/ANDROID/i)){ // Android 
					phoneOS = "A"; 
				} 
			} else { 
				if(agent.match(/iPhone/i) || agent.match(/iPod/i)){ // iOS mobile 
					phoneOS = "MI"; 
				} else if(agent.match(/Android/i)){ // Android mobile 
					phoneOS = "MA"; 
				} else if( agent.match(/BlackBerry/i) || agent.match(/Windows CE/i) || agent.match(/SAMSUNG/i) || agent.match(/LG/i) || agent.match(/MOT/i) || agent.match(/SonyEricsson/i)){ 
					phoneOS = "M"; 				
				}else{ 
					phoneOS = "X"; 
				} 
			} 
		} 
		return phoneOS; 
	}, 
	runApp:function(obj,url) { 
		this.runAppResult = url?{ "header":{ "api":"125" } , "body":{ "url":url} }:{ "header":{ "api":"125" } , "body":{ "url":""} }; 
		this.iosScheme = this.urlSchemeName+"" + "://?"+JSON.stringify(this.runAppResult); this.androidScheme = "intent://"+this.urlHostName+"?" + JSON.stringify(this.runAppResult) + "#Intent;scheme="+this.urlSchemeName+";end"; 
		if(this.getAppType() == "MA"){ 
			if( confirm("앱으로 이동하시겠습니까?") == true ) { 
				this.is_installed_app_and(obj); 
			}else{ 
				return; 
			} 
		}else if(this.getAppType() == "MI") { 
			this.is_installed_app_ios(obj); 
		} 
	}, 
	is_installed_app_ios:function (obj) { 
		var clickedAt = +new Date; 
		setTimeout(function() { 
			if(obj === false){ 
				if (+new Date - clickedAt < 2000) 
					this.GoStore(this.iosMarketUrl); 
				} 
			}, 1500); 
		if(obj !== false) CallApp("I"); 
	}, 
	is_installed_app_and:function (obj){ 
		if(obj === false) this.GoStore(this.googleMarketUrl); 
		if(obj !== false) this.CallApp("A"); 
	}, 
	CallApp:function (obj) { 
		if(obj === "A"){ 
			var chromeExcVer; 
			var fireExcVer; 
			if(navigator.userAgent.match(/Chrome/) != null){ 
				chromeExcVer = navigator.userAgent.match(/Chrome\/[\d+\.]{2,2}/)[0].replace('Chrome/',''); 
			} 
			if(navigator.userAgent.match(/Firefox/) != null){ 
				fireExcVer = navigator.userAgent.match(/Firefox\/[\d+\.]{2,2}/)[0].replace('Firefox/',''); 
			} 
			var iframe = document.createElement('IFRAME'); 
			iframe.style.display = 'none'; 
			if(chromeExcVer <= 25 || fireExcVer <= 40 || navigator.userAgent.match(/Daum/i)){ 
				var iframe; var start; 
				iframe.src = androidScheme; 
				document.body.appendChild(iframe); 
				start = +new Date(); 
				setTimeout(function() { 
					var now = +new Date(); 
					if (now - start < 2000) { 
						window.location.href = fallbackURL; 
					} 
				}, 500); 
			}else if((chromeExcVer > 26 && chromeExcVer < 42)){ 
				if(navigator.userAgent.match(/SamsungBrowser/i)){ 
					var intentURI = [ 
						'intent://'+this.urlHostName+'?'+JSON.stringify(this.runAppResult)+'#Intent', 
						'scheme='+this.urlSchemeName, 
						'package='+this.packageName, 
						'S.browser_fallback_url='+this.browserFallbackUrl, 
						'end' 
					].join(';'); 
					window.location.href = intentURI; 
    			}else{ 
    				var SCHEME = 'intent://open#Intent;scheme=;end'; 
    				self = this; 
    				
    				iframe.addEventListener('load', function onload() { 
    					if (iframe.src === SCHEME) { 
    						self.isNotSupportedFallbackURL = true; 
    					} else { 
    						self.isPrepared = true; 
    						iframe.removeEventListener('load', onload); 
    						document.body.removeChild(iframe); 
    					} 
    				}); 
    				iframe.src = SCHEME; 
    				document.body.appendChild(iframe); 
    				setTimeout(function() { 
    					iframe.src = androidScheme; 
    				}, 100); 
    			} 
    		}else if(chromeExcVer >= 42){ 
    			var intentURI = [ 
        			'intent://'+this.urlHostName+'?'+JSON.stringify(this.runAppResult)+'#Intent', 
        			'scheme='+this.urlSchemeName, 
        			'package='+this.packageName, 
        			'S.browser_fallback_url='+this.browserFallbackUrl, 
        			'end' 
    			].join(';'); 
    			// intent://hancap?{"header":{"api":"125"},"body":{"url":""}}#Intent;scheme=hancapMobile;package=com.lottecap.mweb.app;S.browser_fallback_url=https://m.lottecap.com/co/CO150000.do;end 
    			/** 
    			* chrome 4.0이상의 버전에서 앱미설치 상태에서 모바일웹 페이지에서 스키마를 통해(intent) 설치화면으로 이동하면 
    			* 빈화면이(blank) 뜨는 오류가 발생함 이를 해결 하기 위해 location.href가 아닌 window.open 함수 사용 
    			* **/ 
    			window.open(intentURI); 
    			//window.location.href = intentURI; 
    		}else if(fireExcVer > 40){ 
    			window.location = androidScheme; 
    		} 
    	}else{ 
    		var visitedAt = (new Date()).getTime(); 
    		setTimeout( 
    			function() { 
    				if ((new Date()).getTime() - visitedAt < 2000) { 
    					GoStore(iosMarketUrl); 
    				} 
    			}, 500); 
    		setTimeout(function() { 
    			location.href = iosScheme; 
    		}, 0); 
    	} 
	}, 
	GoStore:function (appstoreUrl) { 
		location.href = appstoreUrl; 
	} 
}  
AappChecker.runApp();

 

웹뷰에서 특정 앱을 실행할 때 없으면 설치 있으면 실행하는 소스..

 

기존 처리방식은 아래처럼 seTimeout을 주어 특정 시간이 지나도 페이지 전환이 없으면 특정 함수를 호출하거나 페이지 이동이 가능했다..

 

기존 가능했던 소스

 

			window.onload = function () {
				app_check();
				triggerAppOpen();
			};
			
			
			
			var fallbackToStore = function() {
              window.location.replace('http://naver.com');
            };
            var openApp = function() {
              window.location.replace('intent://app/SplashScreen#Intent;scheme=app_;package=com.sdf.android.dsds;end');
            };
            var triggerAppOpen = function() {
              openApp();
              setTimeout(fallbackToStore, 700);
            };

 

 

아마도 파싱 등의 보안 이슈 때문에 막힌 듯..

 

그래서 현재 사용자가 수동으로 선택하게 하였다..

 

페이지 이동 or 앱 실행(기 설치지 실행 미 설치지 설치 유도)

반응형