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

Как обнаружить обработчики протокола браузера?

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

http://

mailto://

custom://

Я зарегистрировал приложение WinForms для соответствующего ответа. Все это отлично работает.

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

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

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

4b9b3361

Ответ 1

Это будет очень, очень хакерский способ сделать это... но будет ли это работать?

  • Поместите ссылку как обычно...
  • Но приложите к нему обработчик onclick, который устанавливает таймер и добавляет обработчик onblur для окна
  • (теоретически), если браузер обрабатывает ссылку (приложение X), будет загружать кражу фокуса из окна...
  • Если событие onblur срабатывает, очистите таймер...
  • В противном случае через 3-5 секунд пусть ваш огонь по тайм-ауту... и уведомит пользователя "Хм, похоже, что у вас нет приложения Mega Uber Cool... вы хотели бы установить его сейчас? (Ok) ( Отменить)"

Вдали от пуленепробиваемых... но это может помочь?

Ответ 2

Там нет большого способа перекрестного браузера. В IE10 + на Win8 + новый msLaunchUri api позволяет запускать протокол, например:

navigator.msLaunchUri('skype:123456', 
  function() 
  { 
    alert('success');
  }, 
  function()
  {
    alert('failed');
  } 
); 

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

Я обсуждаю эту тему немного дальше: http://blogs.msdn.com/b/ieinternals/archive/2011/07/14/url-protocols-application-protocols-and-asynchronous-pluggable-protocols-oh-my.aspx

Ответ 3

HTML5 определяет Пользовательские схемы и обработчики содержимого (насколько мне известно, Firefox является единственным разработчиком), но, к сожалению, в настоящее время нет способа проверить, существует ли уже обработчик - он был , но не было никаких последующих действий. Это похоже на критическую особенность эффективного использования пользовательских обработчиков, и мы, как разработчики, должны обратить внимание на эту проблему, чтобы реализовать ее.

Ответ 4

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

В модели iTunes Apple предоставляет URL-адреса своим серверам, которые затем предоставляют страницы, на которых запущен некоторый javascript:

http://ax.itunes.apple.com/detection/itmsCheck.js

Таким образом, установщик iTunes, по-видимому, развертывает плагины для основных браузеров, присутствие которых затем может быть обнаружено.

Если ваш плагин установлен, вы можете быть уверены, что перенаправление на ваш URL-адрес приложения будет успешным.

Ответ 5

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

Ответ 6

В каких швах самое простое решение - спросить пользователя в первый раз.

Использование диалогового окна подтверждения Javascript для примера:

You need this software to be able to read this link. Did you install it ?

if yes: create a cookie to not ask next time; return false and the link applies
if false: window.location.href = '/downloadpage/'

Ответ 7

Вы можете попробовать что-то вроде этого:

function OpenCustomLink(link) {

    var w = window.open(link, 'xyz', 'status=0,toolbar=0,menubar=0,height=0,width=0,top=-10,left=-10');
    if(w == null) {            
        //Work Fine
    }
    else {
        w.close();
        if (confirm('You Need a Custom Program. Do you want to install?')) {
            window.location = 'SetupCustomProtocol.exe'; //URL for installer
        }
    }
}

Ответ 8

Если у вас есть контроль над программой, которую вы пытаетесь запустить (код), один из способов проверить, был ли пользователь успешным при запуске приложения, был бы следующим:

  • Прежде чем пытаться открыть настраиваемый протокол, сделайте запрос AJAX на сервер script, который сохранит намерение пользователя в базе данных (например, сохраните идентификатор пользователя и что он хочет делать).

  • Попробуйте открыть программу и передать данные о намерениях.

  • Попросите программу сделать запрос на сервер, чтобы удалить запись базы данных (используя данные о намерениях, чтобы найти правильную строку).

  • Сделайте опрос javascript на сервере некоторое время, чтобы узнать, исчезла ли запись в базе данных. Если запись не удалась, вы узнаете, что пользователь успешно открыл приложение, иначе запись останется (вы можете удалить ее позже с помощью cronjob).

Я не пробовал этот метод, просто подумал.

Ответ 9

Я смог наконец получить кросс-браузер (решение Chrome 32, Firefox 27, IE 11, Safari 6), работающее с комбинацией this и супер-простое расширение Safari. Большая часть этого решения была упомянута так или иначе в этом и этом другом вопросе.

Здесь script:

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);  // true
        });

        location.href = url;

        setTimeout(function () {
            elem.off('blur');
            elem.removeAttr("tabindex");

            if (!success) {
                callback(false);  // false
            }
        }, 1000);
    } else if (Browser.name === "Safari") {
        if (myappinstalledflag) {
            location.href = url;
            success = true;
        } else {
            success = false;
        }

        callback(success);
    }
}

Расширение Safari было легко реализовать. Он состоял из одной линии впрыска script:

myinject.js:

window.postMessage("myappinstalled", window.location.origin);

Затем на веб-странице JavaScript вам необходимо сначала зарегистрировать событие сообщения и установить флаг, если сообщение получено:

window.addEventListener('message', function (msg) {
    if (msg.data === "myappinstalled") {
        myappinstalledflag = true;
    }
}, false);

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

Во всех случаях, если обратный вызов возвращает false, вы знаете, чтобы сообщить пользователю, что приложение (то есть его пользовательский протокол) не установлено.

Ответ 10

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

https://github.com/ismailhabib/custom-protocol-detection

Ответ 11

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

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

Ответ 12

Я пытаюсь сделать что-то подобное, и я только что нашел трюк, который работает с 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, к сожалению, по-прежнему появляется предупреждение по умолчанию, которое появляется при попытке посетить ссылку с неизвестным протоколом, но после запуска предупреждения будет запущен ваш код.

Ответ 13

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

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

"Если у вас есть некоторый контроль над исполняемыми файлами, установленными на компьютере пользователя, проверка UA в script кажется подходящим подходом: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Настройки Интернета\5.0\Пользовательский агент\Почтовая платформа "- Под поддержкой M $

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

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

Ответ 14

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

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

Ответ 15

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

  • Пользователь нажимает ссылку, которая пытается запустить приложение. Уникальный идентификатор помещается в ссылку, чтобы он передавался в когда он запускается. Веб-приложение показывает прядильщик или что-то в этом роде.
  • Затем веб-страница начинает проверку на наличие "приложение phone home" из приложения с этим же уникальным идентификатором.
  • При запуске ваше приложение отправляет HTTP-сообщение в ваше веб-приложение с уникальным идентификатором, чтобы указать наличие.
  • Либо веб-страница видит, что приложение запускается, в конце концов, либо переходит на страницу "загрузите".