Возможно ли открыть схему 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(){})
Нет результатов...
Ответы
Ответ 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 не помогут вам в этом.