2

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

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

[заблокировано] На странице https://my.site.com/path/to/page был небезопасный контент из iwd:-action = myaction

Эти же ссылки отлично работают в Internet Explorer и Firefox.

Есть идеи, как сделать эту работу? Кстати, мое внешнее приложение - это консольное приложение, которое установлено на клиенте.

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

4 ответа4

2

Решение состояло в том, чтобы не указывать целевой кадр для пользователей Chrome. Похоже, что Chrome просматривает URL-адрес, передаваемый с главной страницы во встроенный iframe, и видит, что встроенный URL-адрес iframe небезопасен, и поэтому отклоняет его.

Я не думаю, что Chrome всегда так себя вел, но с v30+ решение, похоже, заключается в том, чтобы указать и очистить цель в ссылке.

Edit - расширенное решение

Вот JavaScript, который я использую для очистки целевых атрибутов ссылок (только для пользователей Chrome). В противном случае простое решение состоит в том, чтобы не указывать целевой атрибут в HTML в первую очередь.

// Get a list of all the links with external commands
var commandButtons = $("a[target='my_command']");
updateCommandButtonTargetsForChrome();

// Remove target attribute for Chrome only users
function updateCommandButtonTargetsForChrome() {
    var browserInfo = getBrowserInfo();
    if (browserInfo[0] == "Chrome")
        commandButtons.attr("target", "");
}

function getBrowserInfo() {
    var n = navigator.appName, ua = navigator.userAgent, tem;
    var m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
    if (m && (tem = ua.match(/version\/([\.\d]+)/i)) != null) m[2] = tem[1];
    m = m ? [m[1], m[2]] : [n, navigator.appVersion, '-?'];
    return m;
}
1

Похоже, что проблема все время в том, как написан URL.

создать URL без "//":

customproto:xyzabcdef

Вместо:

customproto://xyzabcdef
1

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

Просто вызовите window.location.assign("customprotocol://"); , Что касается пользователя, то это будет работать точно так же, как и используемый подход IFRAME. Если у пользователя не установлен обработчик протокола, ничего не происходит. Если обработчик протокола установлен, он откроет приложение.

Это будет работать только в Chrome, так как Firefox и IE перенаправят пользователя на страницу "Не удалось загрузить", если на его компьютере не установлен обработчик протокола.

0

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

    <input type='button' value='Test Custom Url' onclick='exec()'>

    <script>
    function submitRequest(buttonId) {
        if (document.getElementById(buttonId) == null || document.getElementById(buttonId) == undefined) return;
        if (document.getElementById(buttonId).dispatchEvent) {
                var e = document.createEvent("MouseEvents");
                e.initEvent("click", true, true);
                document.getElementById(buttonId).dispatchEvent(e);
        } 
        else {
                document.getElementById(buttonId).click();
        }
    }

    function exec(){
        var f = document.getElementById('customUrlLink')
        if (f ) {f.parentNode.removeChild(f);}
        var a = document.createElement('a');
        a.href =  'mycustomproto://arg1';    
        a.innerHTML = "Link"                                    
        a.setAttribute('id',        'customUrlLink');
        a.setAttribute("style", "display:none; "); 
        document.body.appendChild(a); 
        submitRequest("customUrlLink");
    }
    </script>

Во-первых, этот код не будет работать в iframe. Таким образом, iframe может вызывать это в родительском объекте или возможно создать объект ссылки в родительском объекте.

Кроме того, IE позволяет использовать <1000 (я не знаю точное число) символов, используя этот подход.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .