Возможно ли зарегистрировать http + доменную схему URL для приложений iPhone, например YouTube и Maps?
Я хочу, чтобы iOS открывал URL-адреса из моего домена (например http://martijnthe.nl) с моим приложением, когда приложение установлено на телефона и с Mobile Safari, если это не так.
Я читал, что для этого можно создать уникальный суффикс протокола и зарегистрировать его в Info.plist, но Mobile Safari выдаст ошибку, если приложение не установлено.
Каким будет обходной путь?
Одна идея:
1) Используйте URL http://, которые открываются в любом обозревателе рабочего стола и предоставляют услугу через браузер
2) Проверьте User-Agent и в случае его Mobile Safari откройте URL-адрес myprotocol://, чтобы открыть приложение iPhone, и открыть его для загрузки приложения iTunes для загрузки приложения в случае неудачной попытки
Не уверен, что это сработает... предложения? Спасибо!
Ответы
Ответ 1
Я думаю, что наименее навязчивый способ сделать это выглядит следующим образом:
- Проверьте, является ли пользовательский агент устройством iPhone/iPod Touch
- Проверьте наличие
appInstalled
cookie
- Если файл cookie существует и имеет значение true, установите
window.location
в your-uri://
(или выполните команду сервера переадресации)
- Если файл cookie не существует, откройте "Знаете ли вы, что у вашего сайта есть приложение для iPhone?" модальный с "Да, у меня уже есть", "Нет, но я бы хотел попробовать" и кнопку "Оставь меня в покое".
- Кнопка "Yep" устанавливает cookie в true и перенаправляет на
your-uri://
- Кнопка "Нет" перенаправляется на " http://itunes.com/apps/yourappname", который откроет App Store на устройстве
- Кнопка "Оставь меня в покое" устанавливает cookie в false и закрывает модальный
Другой вариант, с которым я играл, но нашел немного неуклюжий, должен был сделать следующее в Javascript:
setTimeout(function() {
window.location = "http://itunes.com/apps/yourappname";
}, 25);
// If "custom-uri://" is registered the app will launch immediately and your
// timer won't fire. If it not set, you'll get an ugly "Cannot Open Page"
// dialogue prior to the App Store application launching
window.location = "custom-uri://";
Ответ 2
Вполне возможно сделать это в JavaScript, пока ваш резерв - это еще одно приложение. На основе Предложения Натана:
<html>
<head>
<meta name="viewport" content="width=device-width" />
</head>
<body>
<h2><a id="applink1" href="fb://profile/116201417">open facebook with fallback to appstore</a></h2>
<h2><a id="applink2" href="unknown://nowhere">open unknown with fallback to appstore</a></h2>
<p><i>Only works on iPhone!</i></p>
<script type="text/javascript">
// To avoid the "protocol not supported" alert, fail must open another app.
var appstorefail = "itms://itunes.apple.com/us/app/facebook/id284882215?mt=8&uo=6";
function applink(fail){
return function(){
var clickedAt = +new Date;
// During tests on 3g/3gs this timeout fires immediately if less than 500ms.
setTimeout(function(){
// To avoid failing on return to MobileSafari, ensure freshness!
if (+new Date - clickedAt < 2000){
window.location = fail;
}
}, 500);
};
}
document.getElementById("applink1").onclick = applink(appstorefail);
document.getElementById("applink2").onclick = applink(appstorefail);
</script>
</body>
</html>
Просмотрите демо-версию здесь.
Ответ 3
Для устройств iOS 6 есть опция: Сопоставление приложений с помощью смарт-баннеров
Ответ 4
Я обнаружил, что выбранный ответ работает для приложений браузера, но у меня возникли проблемы с кодом, работающим в приложениях без браузера, которые реализуют UIWebView
.
Проблема для меня заключалась в том, что пользователь в приложении Twitter щелкает ссылку, которая приведет их на мой сайт через UIWebView
в приложении Twitter. Затем, когда они нажали кнопку с моего сайта, Twitter пытается стать фантазией и только завершает window.location
, если сайт доступен. Итак, что происходит, появляется UIAlertView
, вы уверены, что хотите продолжить, а затем сразу перенаправляетесь в App Store без второго всплывающего окна.
Мое решение включает iframes. Это позволяет избежать отображения UIAlertView
, обеспечивающего простой и элегантный пользовательский интерфейс.
JQuery
var redirect = function (location) {
$('body').append($('<iframe></iframe>').attr('src', location).css({
width: 1,
height: 1,
position: 'absolute',
top: 0,
left: 0
}));
};
setTimeout(function () {
redirect('http://itunes.apple.com/app/id');
}, 25);
redirect('custom-uri://');
Javascript
var redirect = function (location) {
var iframe = document.createElement('iframe');
iframe.setAttribute('src', location);
iframe.setAttribute('width', '1px');
iframe.setAttribute('height', '1px');
iframe.setAttribute('position', 'absolute');
iframe.setAttribute('top', '0');
iframe.setAttribute('left', '0');
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null;
};
setTimeout(function () {
redirect('http://itunes.apple.com/app/id');
}, 25);
redirect('custom-uri://');
EDIT:
Добавить абсолютную позицию в iframe, поэтому при вставке в нижней части страницы нет случайного бита пробела.
Также важно отметить, что я не нашел необходимости в этом подходе с Android. Использование window.location.href
должно работать нормально.
Ответ 5
В iOS9 Apple наконец представила возможность зарегистрировать ваше приложение для обработки определенных http://
URL-адресов: Универсальные ссылки.
Очень грубое объяснение того, как это работает:
- Вы объявляете интерес к открытию URL-адресов
http://
для определенных доменов (веб-ссылок) в вашем приложении.
- На сервере указанных доменов вы должны указать, какие URL-адреса будут открыты, в каком приложении, которое объявило о заинтересованности в открытии URL-адресов из домена сервера.
- Служба загрузки URL-адресов iOS проверяет все попытки открыть
http://
URL-адреса для установки, как описано выше, и автоматически открывает правильное приложение, если установлено; не пройдя сначала Safari...
Это самый чистый способ сделать глубокую ссылку на iOS, к сожалению, он работает только в iOS9 и новее...
Ответ 6
СТРОЕНИЕ Еще раз на Натан и JB Ответ:
Как запустить приложение из URL-адреса без дополнительного клика
Если вы предпочитаете решение, которое не включает промежуточный шаг при нажатии ссылки, можно использовать следующее. С помощью этого javascript мне удалось вернуть объект Httpresponse из Django/Python, который успешно запускает приложение, если он установлен, или, альтернативно, запускает магазин приложений в случае тайм-аута. Примечание. Мне также нужно было настроить период ожидания от 500 до 100, чтобы это работало на iPhone 4S. Протестируйте и настройте, чтобы все было правильно для вашей ситуации.
<html>
<head>
<meta name="viewport" content="width=device-width" />
</head>
<body>
<script type="text/javascript">
// To avoid the "protocol not supported" alert, fail must open another app.
var appstorefail = "itms://itunes.apple.com/us/app/facebook/id284882215?mt=8&uo=6";
var loadedAt = +new Date;
setTimeout(
function(){
if (+new Date - loadedAt < 2000){
window.location = appstorefail;
}
}
,100);
function LaunchApp(){
window.open("unknown://nowhere","_self");
};
LaunchApp()
</script>
</body>
</html>
Ответ 7
window.location = appurl;// fb://method/call..
!window.document.webkitHidden && setTimeout(function () {
setTimeout(function () {
window.location = weburl; // http://itunes.apple.com/..
}, 100);
}, 600);
document.webkitHidden
заключается в обнаружении того, что ваше приложение уже вызывается, а текущая вкладка сафари - в фоновом режиме, этот код находится на сайте www.baidu.com
Ответ 8
Если вы добавите iframe
на свою веб-страницу с src
, настроенным на пользовательскую схему для вашего приложения, iOS автоматически перенаправит это место в приложении. Если приложение не установлено, ничего не произойдет. Это позволяет вам глубоко входить в приложение, если оно установлено, или перенаправить в App Store, если он не установлен.
Например, если у вас установлено приложение twitter и перейдите на веб-страницу, содержащую следующую разметку, вы сразу же будете перенаправлены в приложение.
<!DOCTYPE html>
<html>
<head>
<title>iOS Automatic Deep Linking</title>
</head>
<body>
<iframe src="twitter://" width="0" height="0"></iframe>
<p>Website content.</p>
</body>
</html>
Вот более подробный пример, который перенаправляется в App Store, если приложение не установлено:
<!DOCTYPE html>
<html>
<head>
<title>iOS Automatic Deep Linking</title>
<script src='//code.jquery.com/jquery-1.11.2.min.js'></script>
<script src='//mobileesp.googlecode.com/svn/JavaScript/mdetect.js'></script>
<script>
(function ($, MobileEsp) {
// On document ready, redirect to the App on the App store.
$(function () {
if (typeof MobileEsp.DetectIos !== 'undefined' && MobileEsp.DetectIos()) {
// Add an iframe to twitter://, and then an iframe for the app store
// link. If the first fails to redirect to the Twitter app, the
// second will redirect to the app on the App Store. We use jQuery
// to add this after the document is fully loaded, so if the user
// comes back to the browser, they see the content they expect.
$('body').append('<iframe class="twitter-detect" src="twitter://" />')
.append('<iframe class="twitter-detect" src="itms-apps://itunes.com/apps/twitter" />');
}
});
})(jQuery, MobileEsp);
</script>
<style type="text/css">
.twitter-detect {
display: none;
}
</style>
</head>
<body>
<p>Website content.</p>
</body>
</html>
Ответ 9
Вы не можете, насколько мне известно, полностью понять ОС URL http:
+. Вы можете регистрировать только новые схемы (я использую x-darkslide:
в своем приложении). Если приложение установлено, Mobile Safari запустит приложение правильно.
Однако вам придется обрабатывать случай, когда приложение не установлено с помощью "Все еще здесь? Нажмите эту ссылку, чтобы загрузить приложение из iTunes". на вашей веб-странице.
Ответ 10
Вот решение.
Настройка булевого синтаксиса с использованием размытия и фокусировки
//see if our window is active
window.isActive = true;
$(window).focus(function() { this.isActive = true; });
$(window).blur(function() { this.isActive = false; });
Свяжите свою ссылку с обработчиком jquery click, который вызывает что-то вроде этого.
function startMyApp(){
document.location = 'fb://';
setTimeout( function(){
if (window.isActive) {
document.location = 'http://facebook.com';
}
}, 1000);
}
если приложение откроется, мы потеряем фокус на окне, и таймер закончится. в противном случае мы ничего не получаем и загружаем обычный URL-адрес facebook.
Ответ 11
Проверьте User-Agent и в случае, если это Mobile Safari, откройте myprotocol:// URL-адрес (попытка) открыть iPhone приложение, и он откроет Mobile iTunes для загрузка приложения в случае, если попытка не работает
Это звучит разумно для меня, но я не думаю, что вы сможете заставить его открыть мобильный itunes в качестве второго курорта. Я думаю, вам придется выбрать тот или другой - либо перенаправить на свое приложение, либо на itunes.
то есть. если вы перенаправляете на myprotocol://, а приложение не на телефоне, вы не получите второй шанс перенаправить на itunes.
Возможно, вы сначала можете перенаправить на целевую страницу (оптимизированную для iphone) и предоставить пользователю возможность щелкнуть по вашему приложению или на itunes, чтобы получить приложение, если у него его нет? Но вы будете полагаться на то, что пользователь поступил правильно. (Edit: хотя вы можете установить cookie так, чтобы это была только первая вещь?)
Ответ 12
В попытке решить проблему всплывающих окон я обнаружил, что Apple способствовала этой проблеме.
Действительно, когда вы нажимаете эту ссылку, если вы установили приложение, оно перенаправляется на него; в противном случае вы будете перенаправлены на веб-страницу без всплывающих окон.