Android Chrome version 25 이상부터는 Chrome의 변경된 정책(Link)으로 인해
기존에 사용하던 아래와 같은 방법(iframe 형식)을 사용할 수 없게 되었다.
<script> function checkApplicationInstall() { document.checkframe.location = "myapp://check_install"; setTimeout("checkApplicationInstall_callback()", 1000); } function checkApplicationInstall_callback() { try { var s = document.checkframe.document.body.innerHTML; // 어플리케이션 설치되어있음 } catch (e) { // 어플리케이션 설치 안 되어있음 } } </script> <input type="button" value="check app install" onclick="checkApplicationInstall()"/><br/> <iframe id="checkframe" name="checkframe" src="check.html" width="1" height="1"></iframe>
안드로이드에서 사용하라는 아래의 방법은 다음과 같은 문제가 있다.
<a href="intent://scan/#Intent;scheme=zxing;package=com.google.zxing.client.android;end"> Take a QR code </a>Application 이 설치되어 있지 않은경우 무조건 Google Play Store 로 이동하게 된다.
1004lucifer
위와 같은 문제로 인해 아래와 같은 불편함이 따른다.
1004lucifer
1. Google Play Store 에 올라와 있지 않고 다른 스토어에 있는 Application 을 다운로드 안내 할 수 없다. (Custom URL)
2. Store 에 올리지 않은 프로그램을 APK 형식으로 배포를 할 수 없다.
(어쩔 수 없이 APK로 배포를 해야 하는 경우가 있을 수 있다.)
1004lucifer
며칠의 고난끝에 다음과 같은 방법을 생각해냈다.
index.html
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, width=device-width" /> <title></title> <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script> <script type="text/javascript"> var schemeUrl = 'kakaolink://'; var redirectUrl = 'http://www.kakao.com/'; window.closeWindow = (function(){ var isWindowRef = null; setInterval(function() { // 새로열린 창이 닫혔을 때 다시 버튼 클릭 시 동작이 실행이 되어야 하므로 해당 객체를 삭제 isWindowRef = (isWindowRef && isWindowRef.window) ? isWindowRef : null; }, 1000); return function (windowRef, time) { // 새로열린 Window에서 백버튼 누를 시 해당 함수가 계속 호출되는 무한루프 방지 if (isWindowRef == null) { isWindowRef = windowRef; setTimeout(function() { try { // Custom Scheme 이 실행되지 않고 잘못된 페이지가 노출된 상태에서 // 아래의 코드 실행 시 Security Error 발생 windowRef.location == 'undefind'; // Custom Scheme 이 실행되었다면 앱 종료 후 해당 tab 을 닫는다. windowRef.close(); } catch (e) { windowRef.location.href = redirectUrl; } }, time); return true; } } })(); function runApp() { // Check Chrome for Android Version is V25 // https://developer.chrome.com/multidevice/android/intents - Android Chrome Version // http://en.wikipedia.org/wiki/Google_Chrome_for_Android - Chrome WebKit Version if (parseFloat(navigator.userAgent.match(/WebKit\/[^\ ]*/)[0].toLowerCase().substr(7)) > 537.22){ var openWindow = window.open('./openWindow.html#' + schemeUrl); } else { $('<iframe></iframe>', { src: schemeUrl, width: 0, height: 0, id: 'checkframe' }).css('border', '0').appendTo('body'); setTimeout(function() { if($("#checkframe").contents().find("body").html() == undefined){ window.location.href = redirectUrl; } }, 1000); } } </script> </head> <body> <a href="javascript:runApp();">앱 실행하기</a> </body> </html>
openWindow.html
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, width=device-width" /> <title></title> <script type="text/javascript"> var valid = parent.window.opener.closeWindow(this, 50); if (valid) { window.location.href = document.location.href.split('#')[1]; } </script> </head> <body> </body> </html>
다른 방법이나 의견 환영합니다. ^^
댓글
댓글 쓰기