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

Возможно ли открыть схему URL-адресов с помощью Google Chrome?

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

Как открыть этот URL с Google Chrome? По умолчанию Chrome начинает поиск в Google engine, вместо этого запуская приложение и передавая ему 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(){})

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

4b9b3361

Ответ 1

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

Пример (с 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

В текущем принятом решении возникла проблема с 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

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

 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. Обнаружите браузер, и если хром сделает это:

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

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

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

Ответ 3

Похоже, что синтаксический анализ на панели управления Google, который мешает.

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

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

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

Ответ 4

Здесь есть решение, которое также включает перенаправление в App Store/Play Store, если у пользователя нет приложения. Для этого используется setTimeout. Он также использует iframe для поддержки большего количества браузеров. Таким образом, это работает в Chrome и любом другом мобильном браузере. Мы используем это как мою компанию, Branch. Просто измените две ссылки ниже, чтобы соответствовать вашей ссылке 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.

Ответ 5

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

Это то, что я вижу в Safari: alt text http://img62.imageshack.us/img62/6792/clipboard02oh.jpg

и в Firefox:

alt text http://img138.imageshack.us/img138/9986/clipboard04xk.jpg

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

например:

  • define: dictionary
  • filetype: pdf google chromium

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

Запросы Ajax не помогут вам в этом.