Возможно ли зарегистрировать 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>

Просмотрите демо-версию здесь.

Ответ 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 способствовала этой проблеме.

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