Подтвердить что ты не робот

Как проверить, поддерживается ли настраиваемый протокол

Мы используем программное обеспечение, которое регистрирует собственный протокол. Мы можем запустить приложение из браузера, затем по ссылке:

customprotocol://do_this.

но есть ли способ проверить, является ли такой пользовательский протокол, поддерживаемый системой пользователя? Если нет, мы хотели бы попросить пользователя сначала установить программное обеспечение.

например:

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

Edit Я знаю о свойстве protocolLong, но работает только в IE.

4b9b3361

Ответ 1

К сожалению, нет простого способа добиться этого. Разумеется, нет способа предварительного определения того, установлен ли обработчик протокола.

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 официально сосет с этим. Если пользовательский обработчик протокола терпит неудачу, он делает абсолютно zip. Если обработчик работает... вы догадались, что он делает абсолютно zip. Я боюсь, что я не могу различить их.

Я не тестировал Safari, но я боюсь, что он будет таким же, как у Chrome.

Вы можете попробовать тестовый код, который я написал, исследуя это (у меня сам был интерес к нему). Он совместим с Opera и Firefox, но в настоящее время ничего не делает в IE и Chrome.

Ответ 2

Просто, чтобы прослушивать собственный опыт, мы использовали FireBreath для создания простого кросс-платформенного плагина. После установки этот плагин регистрирует тип mime, который можно обнаружить из javascript браузера после обновления страницы. Обнаружение типа 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
    }
}

Ответ 3

Internet Explorer 10 в Windows 8 представил очень полезный метод navigator.msLaunchUri для запуска настраиваемого URL протокола и определения успеха или сбоя. Например:

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

            return;
        }

Windows 7/IE 9 и ниже поддерживают условные комментарии, предложенные @mark-kahn.

Ответ 4

Для Internet Explorer лучшим решением, которое я нашел, является использование комментариев Conditionl и Vector Version (приложение должно записывать что-то в реестр при установке протокола, см. http://msdn.microsoft.com/en-us/library/ms537512.aspx#Version_Vectors). protocolLong не работает для настраиваемого протокола.

Ответ 5

На мобильном телефоне вы можете использовать встроенный iframe для автоматического переключения между настраиваемым протоколом и известным (веб-или магазином приложений), см. https://gist.github.com/2662899

Ответ 6

Здесь нестандартный ответ: установите необычный шрифт во время регистрации своего пользовательского протокола. Затем используйте javascript, чтобы проверить, существует ли этот шрифт, используя что-то как это.

Уверен, это взломать, но в отличие от других ответов он будет работать в браузерах и операционных системах.

Ответ 7

Я просто хочу объяснить более предыдущий ответ 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 <[email protected]>
*/
(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) После этого, когда пользователь снова запускает веб-приложение, он получает "Пользовательский протокол доступен!". потому что на этот раз был установлен шрифт.

Протестировано в Google Chrome, Internet Explorer и Firefox - отлично работает!