program tip

사용자 지정 프로토콜이 지원되는지 확인하는 방법

radiobox 2021. 1. 8. 08:05
반응형

사용자 지정 프로토콜이 지원되는지 확인하는 방법


자체 프로토콜을 등록하는 소프트웨어를 사용하고 있습니다. 브라우저에서 다음과 같은 링크로 애플리케이션을 실행할 수 있습니다.

customprotocol://do_this.

하지만 사용자 시스템에서 이러한 사용자 정의 프로토콜이 지원되는지 확인하는 방법이 있습니까? 그렇지 않은 경우 사용자에게 먼저 소프트웨어를 설치하도록 요청합니다.

예 :

if (canHandle ('customprotocol')) {
     // run software
}
else {
    // ask to install
}

편집 protocolLong 속성에 대해 알고 있지만 IE에서만 작동합니다.


불행히도 이것을 달성하는 쉬운 방법은 없습니다. 프로토콜 처리기가 설치되었는지 여부를 미리 결정하는 방법은 확실히 없습니다.

언급했듯이 Internet Explorer 에는 protocolLong속성이 있지만 모든 사용자 지정 프로토콜 처리기에 대해 "알 수없는 프로토콜"이외의 항목을 반환하는 데 문제가 있습니다. IE가 올바른 값을 반환하도록하는 방법을 아는 사람이 있으면 알려주세요. 이 섹션을 업데이트 할 수 있습니다. IE에서 찾은 최고의 솔루션 은 사용자 에이전트 문자열추가 하거나 Javascript 액세스 가능 속성을 노출하는 앱과 함께 브라우저 확장을 설치하는 것입니다.

Firefox 는 실패한 탐색 시도를 시도하고 포착 할 수 있도록하므로 주요 브라우저 중 가장 쉬운 브라우저입니다. 반환 된 오류 개체에는 name값이 NS_ERROR_UNKNOWN_PROTOCOL다음과 같은 속성이 포함 됩니다 .

try {
    iframe.contentWindow.location.href = "randomprotocolstring://test/";
} catch(e) {
    if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL")
        window.location = "/download/";
}

Firefox는 자체 경고 상자와 함께 팝업됩니다.

Firefox는 프로토콜 (randomprotocolstring)이 어떤 프로그램과도 연결되어 있지 않기 때문에이 주소를 여는 방법을 모릅니다.

이 상자를 닫으면 catch블록이 실행되고 대체 작업이 수행됩니다.

두 번째는 Opera로 , 클릭 한 사용자 지정 프로토콜 링크의 성공을 감지하기 위해 예측 가능성의 법칙을 사용할 수 있습니다. 사용자 정의 프로토콜 클릭이 작동하면 페이지는 동일한 위치에 유지됩니다. 핸들러가 설치되지 않은 경우 Opera는 오류 페이지로 이동합니다. 이렇게하면 iframe으로 쉽게 감지 할 수 있습니다.

   iframe.contentWindow.location = "randomprotocolstring://test/";
   window.setTimeout(function () {
       try {
           alert(ifr.contentWindow.location); 
       } catch (e) { window.location = "/download/"; }
   }, 0);

setTimeout여기 확실히 우리가 위치를 확인하는 것입니다 탐색. 페이지에 액세스하려고하면 Opera에서 ReferenceException (도메인 간 보안 오류)이 발생한다는 점에 유의하는 것이 중요합니다. 우리가 알아야 할 모든 위치를 변경하는 것이 있기 때문에 즉, 중요하지 않습니다 about:blank소위, try...catch잘 작동합니다.

Chrome은 공식적으로 이와 관련하여 짜증납니다. 사용자 지정 프로토콜 처리기가 실패하면 완전히 압축됩니다. 핸들러가 작동한다면 ... 당신은 그것을 짐작했습니다 ... 그것은 절대적으로 압축됩니다. 둘을 구별 할 방법이 없네요.

Safari를 테스트 하지는 않았지만 Chrome과 같을 까 봐 걱정됩니다.

이 문제를 조사하는 동안 작성한 테스트 코드 를 사용해 보셔도 좋습니다 (저는 이에 대해 기득권을 가졌습니다). Opera와 Firefox는 상호 호환되지만 현재 IE와 Chrome에서는 아무것도하지 않습니다.


우리 자신의 경험에 맞추기 위해 FireBreath를 사용하여 간단한 크로스 플랫폼 플러그인을 만들었습니다. 이 플러그인이 설치되면 페이지 새로 고침 후 브라우저 자바 스크립트에서 감지 할 수있는 MIME 유형을 등록합니다. MIME 유형 감지는 프로토콜 핸들러가 설치되었음을 나타냅니다.

if(IE) { //This bastard always needs special treatment
    try {
        var flash = new ActiveXObject("Plugin.Name");
    } catch (e) {
        //not installed
    }
else { //firefox,chrome,opera
    navigator.plugins.refresh(true);
    var mimeTypes = navigator.mimeTypes;
    var mime = navigator.mimeTypes['application/x-plugin-name'];
    if(mime) {
        //installed
    } else {
        //not installed
    }
}

Windows 8의 Internet Explorer 10 은 사용자 지정 프로토콜 URL을 시작하고 성공 또는 실패를 감지하는 데 매우 유용한 navigator.msLaunchUri 메서드를 도입했습니다 . 예를 들면 :

        if (typeof (navigator.msLaunchUri) == typeof (Function)) {
            navigator.msLaunchUri(witchUrl,
                function () { /* Success */ },
                function () { /* Failure */ showError(); });

            return;
        }

Windows 7 / IE 9 이하에서는 @ mark-kahn이 제안한 조건부 주석을 지원합니다.


다음은 비정상적인 대답입니다. 사용자 지정 프로토콜을 등록 할 때 특이한 글꼴을 설치하십시오. 그런 다음 javascript를 사용하여 다음 과 같은 것을 사용하여 해당 글꼴이 있는지 확인하십시오 .

물론 해킹이지만 다른 답변과 달리 브라우저와 운영 체제에서 작동합니다.


Internet Explorer의 경우 내가 찾은 최상의 솔루션은 Conditionl 주석 및 버전 벡터를 사용하는 것입니다 (응용 프로그램은 프로토콜을 설치하는 동안 레지스트리에 무언가를 써야합니다. http://msdn.microsoft.com/en-us/library/ms537512.aspx 참조) . #Version_Vectors ). protocolLong은 사용자 정의 프로토콜에서 작동하지 않습니다.


모바일에서는 임베디드 iframe을 사용하여 사용자 정의 프로토콜과 알려진 프로토콜 (웹 또는 앱 스토어)간에 자동 전환 할 수 있습니다. https://gist.github.com/2662899를 참조 하십시오.


이전 Mark의 답변을 더 설명하고 싶습니다 (예를 들어 user7892745와 같은 일부 사람들은 이해하지 못했습니다).

1) 웹 페이지 또는 웹 응용 프로그램을 시작하면 특이한 글꼴이 있는지 확인합니다 (예 : 중국어 Konfuciuz 글꼴 http://www.fontspace.com/apostrophic-lab/konfuciuz ).

다음은 글꼴을 확인하는 기능 (isFontAvailable이라고 함)이있는 샘플 웹 페이지의 코드입니다.

<!DOCTYPE html>
<html>
<head>

</head>
<body>

<script>
/**
* Checks if a font is available to be used on a web page.
*
* @param {String} fontName The name of the font to check
* @return {Boolean}
* @license MIT
* @copyright Sam Clarke 2013
* @author Sam Clarke <sam@samclarke.com>
*/
(function (document) {
   var width;
   var body = document.body;

                    var container = document.createElement('span');
                    container.innerHTML = Array(100).join('wi');
                    container.style.cssText = [
       'position:absolute',
       'width:auto',
       'font-size:128px',
       'left:-99999px'
   ].join(' !important;');

   var getWidth = function (fontFamily) {
       container.style.fontFamily = fontFamily;

       body.appendChild(container);
       width = container.clientWidth;
       body.removeChild(container);

       return width;
   };

   // Pre compute the widths of monospace, serif & sans-serif
   // to improve performance.
   var monoWidth  = getWidth('monospace');
   var serifWidth = getWidth('serif');
   var sansWidth  = getWidth('sans-serif');

   window.isFontAvailable = function (font) {
       return monoWidth !== getWidth(font + ',monospace') ||
           sansWidth !== getWidth(font + ',sans-serif') ||
           serifWidth !== getWidth(font + ',serif');
   };
})(document);



function isProtocolAvailable()
{
    if (isFontAvailable('Konfuciuz')) 
    {
        return true;
    } 
    else 
    {
        return false;
    }
}

function checkProtocolAvail()
{
    if (isProtocolAvailable()) 
    {
        alert('Custom protocol is available!');
    } 
    else 
    {
        alert('Please run executable to install protocol!');
    }
}
</script>

<h3>Check if custom protocol was installed or not</h3>

<pre>


<input type="button" value="Check if custom protocol was installed!" onclick="checkProtocolAvail()">

</body>
</html>

2) 사용자가이 페이지를 처음 열면 글꼴이 설치되지 않으므로 "사용자 지정 프로토콜을 설치하려면 실행 파일을 실행하십시오 ..."라는 메시지가 표시됩니다.

3) 글꼴을 설치할 실행 파일을 실행합니다. exe는 글꼴 파일 (내 경우 KONFUC __. ttf)을 C : \ Windows 디렉토리에 복사하거나 다음과 같은 코드를 사용하여 복사 할 수 있습니다 (Delphi의 예).

// Adding the font ..

AddFontResource(PChar('XXXFont.TTF'));
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

4) After that, when user runs web app again, he gets "Custom protocol is available!" message because font was installed this time.

Tested on Google Chrome, Internet Explorer and Firefox - working great!

ReferenceURL : https://stackoverflow.com/questions/2872090/how-to-check-if-a-custom-protocol-supported

반응형