Можно ли открыть пользовательскую схему URL с помощью Google Chrome? - PullRequest
24 голосов
/ 25 февраля 2010

У меня есть протокол (например, http) со схемой, управляемой сторонним приложением, зарегистрированным в Mac OS X. Т.е., x-someapp: // someaction или что-то в этом роде.

Как открыть этот URL с помощью Google Chrome? По умолчанию Chrome начинает поиск в движке Google, вместо этого запускает приложение и передает ему обработку URL-адреса ...

Safari запускает несколько зарегистрированных приложений. И это правильно.

Firefox и Opera спрашивают, что делать ... и я тоже могу запустить приложение.

Но Chrome ... не спрашивает.

Я даже пытался написать некоторую HTML-страницу с JavaScript внутри для отправки XHttpRequest:

function _httpExecuteCallback()
{
 if (httpRequestCallbackFunction != null) {
  if (httpRequest.readyState == 4) {
   if (httpRequest.status == 200) {
    httpRequestCallbackFunction();
    httpRequestCallbackFunction = null;
   }   
  }
 }
}

function _httpGet(url, callbackFunction)
{
 httpRequest = false;
 httpRequestCallbackFunction = callbackFunction;
 httpRequest = new XMLHttpRequest();
 httpRequest.onreadystatechange = _httpExecuteCallback;
 httpRequest.open('GET', url, true);
 httpRequest.send(null);
}


_httpGet('x-someapp://test',function(){})

Нет результатов также ...

Ответы [ 5 ]

24 голосов
/ 18 октября 2013

В текущем принятом решении есть проблема с Chrome для SSL https. Наблюдая за журналом консоли, Chrome блокирует запрос, поскольку считает, что пользовательский протокол URL-адресов небезопасен:

[blocked] The page at reports blah blah ran insecure content from customproto//blah blah

Вот решение (на поиски которого у меня ушло несколько дней):

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

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

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

Этот код не будет работать для IE. Я обнаружил, что при использовании этой техники IE ограничивает аргумент пользовательского протокола менее 1000, тогда как при использовании техники iFrame IE допускает 2083 символа.

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

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

Так что сейчас я использую одну функцию для Chrome / FF и другую функцию для IE.

Эти ссылки помогли мне разработать это решение:

https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page

Имитация клика в jQuery / JavaScript по ссылке

(жаль, что я знал это несколько дней назад .... надеюсь, это кому-нибудь поможет)

=============================================== ===

Обновление: (через 8 часов)

=============================================== ===

Джейк опубликовал отличное решение для хрома: https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page

Это работает только в Chrome:

 window.location.assign("customprotocol://");

В iframe произойдет сбой, поэтому это работает:

var w = (window.parent)?window.parent:window
w.location.assign(service + '://' +  data)

=============================================== ===

Обновление: (недели спустя)

=============================================== ===

Все примеры открытия пользовательского протокола, включая мой собственный, имеют в URL ": //". И это то, что вызывает предупреждения SSL.

Оказывается, решение состоит в том, чтобы изменить ": //" на ":"

так сделайте это:

src="x-myproto:query"  .....

и предупреждения SSL исчезнут.

=============================================== ===

Следуйте: (после нескольких месяцев использования продукции)

=============================================== ===

Это хорошо работает для chorme. Определите браузер и, если Chrome сделает это:

var w = (window.parent)?window.parent:window
w.location.assign('myproto://xyzabcdefetc')

Для IE и других браузеров я делаю что-то немного другое.

Обратите внимание, что браузеры накладывают ограничение на объем данных, которые вы можете поместить в собственный протокол URL. Пока ваша строка меньше 800 символов, похоже, это магическое число, которое работает во всех браузерах.

7 голосов
/ 01 апреля 2011

Похоже, что это мешает разбору адресной строки Google.

Однако браузер, похоже, правильно обрабатывает пользовательские схемы URL. Попробуйте это в вашей адресной строке:

javascript:document.location = 'myscheme://whatever'

Любая ссылка на вашей странице, которая использует пользовательскую схему, также должна работать правильно.

4 голосов
/ 07 марта 2015

Вот решение, которое также включает перенаправление в App Store / Play Store, если у пользователя нет приложения. Для этого он использует setTimeout. Он также использует iframe для поддержки большего количества браузеров. Так что это работает на Chrome и любом другом мобильном браузере. Мы используем это как мою компанию, Филиал . Просто измените две ссылки ниже, чтобы они соответствовали вашему URI и ссылке в App Store.

<!DOCTYPE html>
<html>
    <body>
        <script type="text/javascript">
            window.onload = function() {
                // Deep link to your app goes here
                document.getElementById("l").src = "my_app://somepath";

                setTimeout(function() {
                    // Link to the App Store should go here -- only fires if deep link fails                
                    window.location = "https://itunes.apple.com/us/app/myapp/id123456789?ls=1&mt=8";
                }, 500);
            };
        </script>
        <iframe id="l" width="1" height="1" style="visibility:hidden"></iframe>
    </body>
</html>

Опять же, это должно работать в любом браузере, благодаря iframe.

2 голосов
/ 25 февраля 2010

Я нашел решение, которое работает с Chrome.Я использую IFRAME-way.

Пример (с JQuery):

$("body").append('<span id="__protoProxy"></span>');

function queryWord(aWord)
{
 var protoProxy = document.getElementById('__protoProxy');
 if (protoProxy)
 {   
  var word = aWord.replace('"','\"');
  protoProxy.innerHTML = '<div style="display:none;"><iframe src="x-myproto://query?' + word + '"></iframe></div>';
 }
}

queryWord('hello');
2 голосов
/ 25 февраля 2010

Если Chrome не распознает схему URL, по умолчанию используется поиск.

Вот что я вижу в Safari: альтернативный текст http://img62.imageshack.us/img62/6792/clipboard02oh.jpg

и в Firefox:

альтернативный текст http://img138.imageshack.us/img138/9986/clipboard04xk.jpg

Я считаю, что причина, по которой Chrome по умолчанию выполняет поиск, заключается в том, что существуют специальные поисковые запросы Google, в которых используется двоеточие.

например:

  • определение: словарь
  • тип файла: pdf google chromium

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

Ajax-запросы не помогут вам справиться с этим.

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