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

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

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

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

Одна идея:

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

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

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

 Alex Austin16 нояб. 2015 г., 06:14
Universal Links теперь будет поддерживать этот вариант использования без каких-либо сообщений об ошибках. Вот как настроить ваш домен и приложение:blog.branch.io/…
 TommyG03 окт. 2013 г., 02:23
В метро Нью-Йорка есть Wi-Fi от Boingo, который предоставляет вам бесплатный доступ к WiFi, если вы загружаете приложение, которое они рекомендуют. Как только вы загрузите его, вы вернетесь в Safari, и браузер обнаружит его установку, а затем предоставит вам доступ. Есть идеи, как это делается?

Ответы на вопрос(11)

приложение для обработки определенныхhttp:// URL-адрес:Универсальные ссылки.

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

You declare interest in opening http:// URLs for certain domains (web urls) in your app. On the server of the specified domains you have to indicate which URLs to open in which app that has declared interest in opening URLs from the server's domain. The iOS URL loading service checks all attempts to open http:// URLs for a setup as explained above and opens the correct app automatically if installed; without going through Safari first...

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

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

Однако вам придется обрабатывать случай, когда приложение не установлено с "Все еще здесь?" Нажмите на эту ссылку, чтобы загрузить приложение из iTunes. & Quot; на вашей веб-странице.

 25 сент. 2015 г., 10:20
Это больше не правильно: с iOS9 и последними версиями Android вы можете зарегистрировать свое приложение, чтобы слушать навернякаhttp URL-адрес
 25 янв. 2013 г., 15:17
К сожалению, Smart App Banner включен, поддерживается только в Mobile Safari, а не в UIWebviewComponent. Так что не будет отображаться, если ваш сайт отображается в клиенте Twitter для примера.
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

 31 янв. 2013 г., 20:12
Я протестировал это решение и обнаружил, что, хотя оно и доставляет события должным образом, Safari не может открыть эту страницу, поскольку адрес недействителен. на мгновение появляется сообщение об ошибке. (Он автоматически отклоняется через доли секунды).
 27 мая 2014 г., 15:14
@zyanlu: я пытался с iFrame. Bt все еще Safari показывает ту же ошибку.
 26 февр. 2013 г., 07:01
используйте iframe для загрузкиappurl а такжеweburl может решить вашу проблему

если ваш запасной вариант - еще одна ссылка на приложение. Опираясь наПредложение Натана:

<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>

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

 28 июн. 2012 г., 21:46
@Rossini это встроено в Android путем настройкиintent filter for your action that responds to a particular host
 07 сент. 2012 г., 22:42
Кто-нибудь знает, как избежать & quot; не может открыть страницу & quot; сообщение об ошибке от Safari, если приложение не установлено и перед перенаправлением в магазин приложений?
 18 янв. 2012 г., 15:56
Я использовал это решение для Android и iOS. Я обнаружил, что при изменении значения тайм-аута с 500 до 100 я не получаю сообщение "Не удается открыть страницу". всплывающее диалоговое окно в iOS. Я также обнаружил, что тайм-аут должен быть 50 для Android
 20 июн. 2012 г., 14:21
Использование & quot; itms-apps: & quot; вместо & quot; itms: & quot; сохраняет 1 перенаправление и непосредственно открывает страницу приложения в AppStore.
 29 апр. 2011 г., 21:50
Согласитесь с Ли, это кажется более простым решением - хотя я все равно получаю сообщение об ошибке от safari, если приложение не существует и оно перенаправляет в магазин приложений.

я обнаружил, что у Apple есть способ обойти эту проблему.

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

 07 дек. 2011 г., 15:18
Я довольно глубоко вник в то, как работает эта ссылка, и лучшее, что я могу придумать, это то, что это вообще не решение JavaScript. Похоже, что Apple зарегистрировала специальный обработчик URL для своего приложения, который не требует специального протокола и вместо этого соответствует некоторому совпадению в строке URL. Ссылка, которую вы отправляете, перенаправляет сразу с 303 наhere, Если вы отправите эту ссылку в электронное письмо себе, вы можете заметить, что нажатие на нее приведет к открытию приложения AppStore, если оно установлено.
 07 дек. 2011 г., 18:59
Очень интересно. Вы правы: если я нажму на него, то откроется приложение AppStore, если оно установлено. Но если вы удалите некоторые параметры до «праздников», они появятся в Safari. Apple может зарегистрировать специальную схему URL ...
 02 февр. 2015 г., 12:03
@Titignes, не могли бы вы уточнить, как открыть приложение или веб-страницу. Каков шаблон для создания такого URL?

How To Launch App From url w/o Extra Click Если вы предпочитаете решение, которое не включает промежуточный шаг щелчка по ссылке, можно использовать следующее. С помощью этого 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>

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>
 01 дек. 2015 г., 14:00
Это больше не работает на iOS9
 02 февр. 2015 г., 11:56
iOS 6 по-прежнему отображает всплывающее окно. Эта страница не может быть открыта из-за неверного URL
 09 янв. 2015 г., 11:51
Затем я приведу более подробный пример, который покажет фактическое содержание сайта. Я могу удалить & quot; Приложение Twitter не установлено & quot; текст, если это прояснит.
 08 янв. 2015 г., 03:01
Проблема с вашим первым примером заключается в том, что если вы вернетесь в Mobile Safari, на нем будет отображаться «Приложение Twitter не установлено». хотя Twitter был запущен. То же самое со вторым примером, отображающим «содержимое веб-сайта». Должен быть код, который делает что-то другое (загружает другой URL или отображает одно из двух сообщений), если приложение установлено.
 09 янв. 2015 г., 11:34
Да, @mahboudz, если вы читаете текст, это просто простой пример, демонстрирующий возможность автоматического перенаправления в приложение.

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

//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.

 04 сент. 2012 г., 14:13
Большое спасибо за предложение. Я столкнулся с проблемой "запуска внешнего приложения" диалога, кажется, достаточно для размытия, чтобы инактивировать флаг. Это происходит, даже если приложение не установлено (например, при нажатии на ссылку, предназначенную для запуска приложения iPhone на рабочем столе). Идеи?
 04 сент. 2012 г., 14:17
О, и мне пришлось переключиться наwindow.location ...
Решение Вопроса

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

Check if the user-agent is that of an iPhone/iPod Touch Check for an appInstalled cookie If the cookie exists and is set to true, set window.location to your-uri:// (or do the redirect server side) If the cookie doesn't exist, open a "Did you know Your Site Name has an iPhone application?" modal with a "Yep, I've already got it", "Nope, but I'd love to try it", and "Leave me alone" button. The "Yep" button sets the cookie to true and redirects to your-uri:// The "Nope" button redirects to "http://itunes.com/apps/yourappname" which will open the App Store on the device The "Leave me alone" button sets the cookie to false and closes the modal

Другой вариант, с которым я поиграл, но нашел немного неуклюжим, заключался в том, чтобы сделать следующее в 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://";
 06 мар. 2010 г., 01:20
Отличное решение. Если ваш запасной вариант для другого приложения, он загрузитIMMEDIATELY без отображения ошибки. Поэтому вместо того, чтобы отступатьitunes.com... используйте itms: //phobos.apple.com / ... чтобы избежать ошибки всплывающего окна!
 06 янв. 2012 г., 21:19
Problem: Когдаwindow.location="custom-uri:// успешно, запасной таймаут не убит. Когда пользователь возвращается в браузер из вашего приложения, таймер все еще там и запустит ссылку на магазин приложений. Это плохой пользовательский опыт.
 25 янв. 2013 г., 15:15
Кажется, файлы cookie находятся в изолированной среде # ios6, поэтому вы не можете получить доступ к файлам cookie, установленным приложением, из другого. (Приложение WebUI и Safari Mobile, например)
 29 апр. 2013 г., 17:28
Кто-нибудь находит способ предотвратить срабатывание исходного тайм-аута, когда пользователь возвращается в браузер? (проблема Джо Джо упоминается выше)
 06 июн. 2013 г., 11:33
Чтобы решить проблему, о которой упоминает JoJo, запускайте код только в течение тайм-аута, если не «много времени». прошло с тех пор, как пользователь нажал на ссылку. Смотрите это решение:stackoverflow.com/a/14751543/533420

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

Проблема для меня заключалась в том, что пользователь в приложении Twitter нажимал на ссылку, по которой он переходил на мой сайт черезUIWebView в приложении 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://');

РЕДАКТИРОВАТЬ:

Добавьте абсолютную позицию в iframe, чтобы при вставке в нижней части страницы не было случайного бита.

Также важно отметить, что я не нашел необходимости в таком подходе с Android. С помощьюwindow.location.href должно работать нормально.

 02 сент. 2014 г., 15:49
Это лучшее решение, если оно найдено. Спасибо. Больше нет ошибки всплывающего окна.
 21 авг. 2014 г., 17:26
Оно работает!! Спасибо, я наконец нашел решение, которое работает на любом браузере.
 13 окт. 2014 г., 00:08
@ cnotethegr8 Я поместил его в функцию и перенаправил на пользовательский URL-адрес, он отлично работает, но откат к iTunes - нет. Вот мойcode, Что мне не хватает?
 03 сент. 2014 г., 02:39
Это решение не работает на Chrome для Android.
 10 окт. 2014 г., 09:06
@Tim, если вы хотите, чтобы этот код срабатывал при щелчке по ссылке, затем оберните этот код в функцию, которая вызывается после щелчка по ссылке.

Ваш ответ на вопрос