Можно ли зарегистрировать схему URL-адресов на базе домена http + для приложений iPhone, таких как YouTube и Карты? - PullRequest
222 голосов
/ 10 июля 2009

Мне бы хотелось, чтобы iOS открывала URL-адреса из моего домена (например, http://martijnthe.nl) с моим приложением, когда приложение установлено на телефоне, и с Mobile Safari, если это не так.

Я прочитал, что для этого можно создать уникальный суффикс протокола и зарегистрировать его в Info.plist, но Mobile Safari выдаст ошибку в случае, если приложение не установлено.

Что бы обойти?

Одна идея:

1) Используйте http: // URL-адреса, которые открываются в любом браузере настольного компьютера и предоставляют сервис через браузер

2) Проверьте User-Agent и, если это Mobile Safari, откройте myprotocol: // URL, чтобы (попытаться) открыть приложение iPhone, и откройте Mobile iTunes для загрузки приложения в случае неудачной попытки.

Не уверен, что это сработает ... предложения? Спасибо!

Ответы [ 12 ]

240 голосов
/ 10 июля 2009

Я думаю, что наименее навязчивый способ сделать это заключается в следующем:

  1. Проверьте, является ли пользовательский агент iPhone / iPod Touch
  2. Проверить наличие appInstalled печенья
  3. Если файл cookie существует и имеет значение true, установите window.location на your-uri:// (или выполните перенаправление на стороне сервера)
  4. Если файл cookie не существует, откройте «Знаете ли вы, что у вашего сайта есть приложение для iPhone?» модальный с «Да, у меня уже есть», «Нет, но я бы хотел попробовать» и «Оставь меня в покое».
    1. Кнопка "Yep" устанавливает для cookie значение true и перенаправляет на your-uri://
    2. Кнопка «Нет» перенаправляет на «http://itunes.com/apps/yourappname", что откроет App Store на устройстве
    3. Кнопка «Оставь меня в покое» устанавливает для 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's not set, you'll get an ugly "Cannot Open Page"
// dialogue prior to the App Store application launching
window.location = "custom-uri://";
95 голосов
/ 06 марта 2010

Это вполне возможно сделать в 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>

Посмотрите живую демонстрацию здесь .

26 голосов
/ 15 октября 2012
23 голосов
/ 10 июня 2014

Я обнаружил, что выбранный ответ работает для приложений браузера, но у меня были проблемы с кодом, работающим в не браузерных приложениях, которые реализуют UIWebView.

Проблема для меня заключалась в том, что пользователь в приложении Twitter щелкал ссылку, по которой он переходил на мой сайт через UIWebView в приложении Twitter. Затем, когда они нажали кнопку на моем сайте, Твиттер пытается проявить фантазию и заполнить window.location, только если сайт доступен. Итак, всплывающее окно UIAlertView говорит о том, что вы действительно хотите продолжить, а затем немедленно перенаправляет в App Store без второго всплывающего окна.

Мое решение включает в себя фреймы. Это позволяет избежать представления 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 должно работать нормально.

20 голосов
/ 18 сентября 2015

В iOS9 Apple наконец-то представила возможность зарегистрировать ваше приложение для обработки определенных http:// URL-адресов: Универсальные ссылки .

Очень грубое объяснение того, как это работает:

  • Вы заявляете о своей заинтересованности в открытии http:// URL-адресов для определенных доменов (веб-URL) в вашем приложении.
  • На сервере указанных доменов необходимо указать, какие URL открывать в каком приложении, которое заявило о своей заинтересованности в открытии URL из домена сервера.
  • Служба загрузки URL-адресов iOS проверяет все попытки открыть http:// URL-адреса для настройки, как описано выше, и автоматически открывает правильное приложение, если оно установлено; не пройдя сначала Safari ...

Это самый чистый способ создания глубоких ссылок на iOS, к сожалению, он работает только в iOS9 и новее ...

9 голосов
/ 29 ноября 2012
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

9 голосов
/ 29 сентября 2012

СТРОИТЕЛЬСТВО снова на ответ Натана и 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>
5 голосов
/ 04 января 2015

Если вы добавите 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>

Вот более подробный пример, который перенаправляет в магазин приложений, если приложение не установлено:

<!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>
3 голосов
/ 31 августа 2012

Вот решение.

Настройка логической ситуации, используя размытие и фокус

//see if our window is active
window.isActive = true;
$(window).focus(function() { this.isActive = true; });
$(window).blur(function() { this.isActive = false; });

Свяжите вашу ссылку с помощью обработчика щелчков jquery, который вызывает что-то вроде этого.

function startMyApp(){
  document.location = 'fb://';

  setTimeout( function(){
    if (window.isActive) {
        document.location = 'http://facebook.com';
    }
  }, 1000);
}

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

2 голосов
/ 10 июля 2009

Насколько я знаю, вы не можете заставить всю ОС понимать URL-адрес домена http: +. Вы можете зарегистрировать только новые схемы (я использую x-darkslide: в моем приложении). Если приложение установлено, Mobile Safari правильно его запустит.

Однако вам нужно будет обработать случай, когда приложение не установлено, с сообщением «Все еще здесь? на вашей веб-странице.

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