IOS9: попробуйте открыть приложение по схеме, если это возможно, или перенаправить на приложение в противном случае

Мой вопрос касается только iOS9!

У меня есть целевая страница HTML, и я пытаюсь перенаправить пользователя в мое приложение по схеме URL, если приложение установлено или перенаправлено на Appstore в противном случае.

Мой код:

document.addEventListener("DOMContentLoaded", function(event) {

  var body = document.getElementsByTagName('body')[0];
  body.onclick = function () {
    openApp();
  };
});

var timeout;

function preventPopup() {

    clearTimeout(timeout);
    timeout = null;
    window.removeEventListener('pagehide', preventPopup);
}

function openApp(appInstanceId, platform) {

  window.addEventListener('pagehide', preventPopup);
  document.addEventListener('pagehide', preventPopup);

  // create iframe
  var iframe = document.createElement("iframe");
  document.body.appendChild(iframe);
  iframe.setAttribute("style", "display:none;");
  iframe.src = 'myscheme://launch?var=val';

  var timeoutTime = 1000;
  timeout = setTimeout(function () {

    document.location = 'https://itunes.apple.com/app/my-app';

  }, timeoutTime);
}

Проблема заключается в том, что трюк iframe не работает в Safari iOS9.

Любая идея, почему?

Мой iframe трюк на основе этого ответа.

Ответ 1

Трейк iframe больше не работает - я полагаю, Apple знает, что он будет поощрять больше разработчиков к внедрению Universal Links, быстрее.

Вы можете установить window.location='your-uri-scheme://'; и вернуться в App Store через 500 мс. Существует танец между всплывающими окнами, если вы примете этот подход, как мы делаем в Branch (мы делаем это как резерв, если Universal Links не работают).

window.location = 'your-uri-scheme://'; // will result in error message if app not installed
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);

Хотелось бы, чтобы у меня был лучший ответ для вас. iOS 9 определенно более ограничен.

Для полезного обзора того, что необходимо для Universal Links, вы должны пойти по этому маршруту, посмотрите мой ответ здесь или прочитайте этот учебник

Ответ 2

Как уже упоминалось, установка window.location на iOS 9 все еще работает. Однако это вызывает диалог Open in App. Я привел пример https://bartt.me/openapp, который:

  • Запускает Twitter при нажатии на кнопку "Открыть в Twitter".
  • Возвращается в приложение Twitter в App Store.
  • Перенаправление в Twitter или App Store без выбора пользователем Open в диалоговом окне Open in App.
  • Работает во всех браузерах на iOS и Android.

Для получения дополнительной информации просмотрите источник https://lab.bartt.me/openapp.

Ответ 3

Возможно, попробуйте предоставить поддержку приложений для Universal Links

Идея: Избегайте настраиваемых (JavaScript, iframe) решений в Safari, замените код на поддерживаемую Universal Link.

Пример

<html>
<head>
...
</head>
<body>
    <div class"app-banner-style">
        <a href="http://yourdomain.com">In app open</a> 
    </div>
...content
</body>
</html>

Если приложение поддерживает Universal Links (например, yourdomain.com), вы можете настроить свой домен (и путь), и iOS9 должен реагировать на его ссылку, открыв вам приложение. Это только теория, но я думаю, это должна быть работа:)

https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12

Ответ 4

iframe hack больше не работает в ios9. Возможным решением является использование двух кнопок. Пример:

$('#goToStoreBtn').text( "go to store" ).click(function(event){
    event.preventDefault();
    event.stopPropagation();
    window.location = storeUrl; // https://itunes.apple.com/...
});

$('#goToAppBtn').text( "go to app" ).click(function(event){
    event.preventDefault();
    event.stopPropagation();
    window.location = appUrl;  // myApp://...
});

Ответ 5

Это относительно старый поток, но я создал библиотеку, которая поддерживает deeplinking на большинстве современных мобильных браузеров. Но для этого требуется отдельная страница deeplinking, которая должна быть размещена в разных доменах для поддержки универсальной привязки в браузере iOS9 facebook.

https://github.com/prabeengiri/DeepLinkingToNativeApp