반응형
내가 찾는 기능은 있으면 실행 없으면 특정 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 앱 실행(기 설치지 실행 미 설치지 설치 유도)
반응형
'Program > javascript' 카테고리의 다른 글
사파리 window.open 사용 불가 (0) | 2024.08.22 |
---|---|
onclick 이벤트 다중 함수 호출 (0) | 2022.03.14 |
자바스크립트 함수에서 ajax호출후 response 값 return 하기 (0) | 2021.06.25 |
CORS (Cross Domain) ajax 우회하기 (0) | 2020.10.22 |
현재서부터 입력받은 날짜시간까지의 남은 기간 출력 (0) | 2018.04.07 |