Как определить обработчики протоколов браузера? - PullRequest
76 голосов
/ 08 мая 2009

Я создал собственный обработчик протокола URL.

http://

mailto://

custom://

Я зарегистрировал приложение WinForms, чтобы отвечать соответствующим образом. Все это прекрасно работает.

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

Для того, чтобы сделать это, мне нужно иметь возможность обнаруживать зарегистрированные обработчики протоколов браузера, я бы предположил из JavaScript. Но я не смог найти способ опроса информации. Я надеюсь найти решение этой проблемы.

Спасибо за любые идеи, которыми вы могли бы поделиться.

Ответы [ 15 ]

3 голосов
/ 28 сентября 2009

Вы говорите, что вам нужно определить обработчики протокола браузера - неужели?

Что если вы сделали что-то вроде того, что происходит, когда вы загружаете файл из sourceforge? Допустим, вы хотите открыть myapp: // что-то. Вместо того, чтобы просто создать ссылку на него, создайте ссылку на другую HTML-страницу, доступ к которой осуществляется через HTTP. Затем на этой странице скажите, что вы пытаетесь открыть приложение для них. Если это не работает, им нужно установить ваше приложение, что они могут сделать, нажав на ссылку, которую вы предоставите. Если это работает, то все готово.

1 голос
/ 06 декабря 2010

Это был рекомендуемый подход для IE при поддержке Microsoft

http://msdn.microsoft.com/en-us/library/ms537503%28VS.85%29.aspx#related_topics

"Если у вас есть некоторый контроль над двоичными файлами, устанавливаемыми на компьютере пользователя, проверка UA в сценарии кажется подходящим подходом: HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows \ CurrentVersion \ Internet Settings \ 5.0 \ User Agent \ Post Platform "- M $ support

Каждая веб-страница имеет доступ к строке userAgent, и если вы отбрасываете пользовательское значение пост-платформы, обнаружить его в javascript с помощью navigator.userAgent довольно просто.

К счастью, другие крупные браузеры, такие как Firefox и Chrome (за исключением Safari :(), не выдают ошибки «страница не найдена», когда нажата ссылка с пользовательским протоколом и протокол не установлен на компьютере пользователя. очень неумолимо, любой трюк, чтобы кликнуть в невидимом фрейме или перехватить ошибки javascript, не работает и заканчивается уродливой ошибкой «веб-страница не может быть отображена». Уловка, которую мы используем в нашем случае, состоит в том, чтобы информировать пользователей с изображениями, специфичными для браузера, которые нажимают на ссылка на специальный протокол откроет приложение. И если они не обнаружат, что приложение открывается, они могут щелкнуть «страницу установки». С точки зрения XD это wprks намного лучше, чем подход ActiveX для IE. Для FF и Chrome просто запустите пользовательский протокол без какого-либо обнаружения. Позвольте пользователю рассказать вам, что он видит. Для Safari :( пока нет ответов

1 голос
/ 29 января 2010

Я пытаюсь сделать нечто подобное, и я только что обнаружил уловку, которая работает с Firefox. Если вы объедините его с трюком для IE, у вас может быть тот, который работает в обоих основных браузерах (я не уверен, что он работает в Safari, и я знаю, что он не работает в Chrome)

if (navigator.appName=="Microsoft Internet Explorer" && document.getElementById("testprotocollink").protocolLong=="Unknown Protocol") {
    alert("No handler registered");
} else {
    try {
        window.location = "custom://stuff";
    } catch(err) {
        if (err.toString().search("NS_ERROR_UNKNOWN_PROTOCOL") != -1) {
            alert("No handler registered");
        }
    }
}

Для того, чтобы это работало, вам также необходимо иметь скрытую ссылку где-то на странице, например:

<a id="testprotocollink" href="custom://testprotocol" style="display: none;">testprotocollink</a>

Это немного глупо, но работает. К сожалению, в версии Firefox по-прежнему появляется предупреждение по умолчанию, которое появляется при попытке перейти по ссылке с неизвестным протоколом, но оно запускает ваш код после отклонения предупреждения.

0 голосов
/ 28 марта 2014

Вот еще один хакерский ответ, который потребует (надеюсь, легкой) модификации вашего приложения, чтобы «позвонить домой» при запуске.

  1. Пользователь нажимает на ссылку, которая пытается запустить приложение. Уникальный идентификатор помещается в ссылку, так что он передается приложение, когда оно запускается. Веб-приложение отображает счетчик или что-то в этом роде.
  2. Веб-страница затем начинает проверять наличие Событие 'application phone home' из приложения с таким же уникальным идентификатором.
  3. При запуске ваше приложение отправляет HTTP-сообщение в ваше веб-приложение. с уникальным идентификатором, чтобы указать присутствие.
  4. Либо веб-страница видит, что приложение, в конце концов, запущено, либо переходит со страницы «Пожалуйста, загрузите».
0 голосов
/ 08 мая 2009

Это не тривиальная задача; Одним из вариантов может быть использование подписанного кода, который вы можете использовать для доступа к реестру и / или файловой системе (обратите внимание, что это очень дорогой вариант). Также нет унифицированного API или спецификации для подписи кода, поэтому вам потребуется сгенерировать определенный код для каждого целевого браузера. Кошмар поддержки.

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

...