마침내 이것 과 매우 간단한 Safari 확장 프로그램 의 조합으로 작동하는 크로스 브라우저 (Chrome 32, Firefox 27, IE 11, Safari 6) 솔루션을 얻을 수있었습니다 . 이 솔루션의 많은 부분이이 질문 과 다른 질문 에서 어떤 식 으로든 언급되었습니다 .
다음은 스크립트입니다.
function launchCustomProtocol(elem, url, callback) {
var iframe, myWindow, success = false;
if (Browser.name === "Internet Explorer") {
myWindow = window.open('', '', 'width=0,height=0');
myWindow.document.write("<iframe src='" + url + "'></iframe>");
setTimeout(function () {
try {
myWindow.location.href;
success = true;
} catch (ex) {
console.log(ex);
}
if (success) {
myWindow.setTimeout('window.close()', 100);
} else {
myWindow.close();
}
callback(success);
}, 100);
} else if (Browser.name === "Firefox") {
try {
iframe = $("<iframe />");
iframe.css({"display": "none"});
iframe.appendTo("body");
iframe[0].contentWindow.location.href = url;
success = true;
} catch (ex) {
success = false;
}
iframe.remove();
callback(success);
} else if (Browser.name === "Chrome") {
elem.css({"outline": 0});
elem.attr("tabindex", "1");
elem.focus();
elem.blur(function () {
success = true;
callback(true);
});
location.href = url;
setTimeout(function () {
elem.off('blur');
elem.removeAttr("tabindex");
if (!success) {
callback(false);
}
}, 1000);
} else if (Browser.name === "Safari") {
if (myappinstalledflag) {
location.href = url;
success = true;
} else {
success = false;
}
callback(success);
}
}
Safari 확장은 구현하기 쉬웠습니다. 한 줄의 주입 스크립트로 구성되었습니다.
myinject.js :
window.postMessage("myappinstalled", window.location.origin);
그런 다음 웹 페이지 JavaScript에서 먼저 메시지 이벤트를 등록하고 메시지가 수신되면 플래그를 설정해야합니다.
window.addEventListener('message', function (msg) {
if (msg.data === "myappinstalled") {
myappinstalledflag = true;
}
}, false);
이것은 사용자 정의 프로토콜과 관련된 응용 프로그램이 Safari 확장 설치를 관리한다고 가정합니다.
모든 경우에 콜백이 false를 반환하면 사용자에게 응용 프로그램 (즉, 사용자 지정 프로토콜)이 설치되지 않았 음을 알려야합니다.