Браузер iPhone: проверка, установлено ли приложение iPhone из браузера - PullRequest
17 голосов
/ 27 сентября 2011

У меня есть веб-страница, где у меня есть кнопка, которая либо открывает приложение (если оно установлено), либо направляет в магазин приложений, если приложение не установлено. Все работает, если приложение установлено (я звоню в «MYAPP: //»). Однако, если приложение не установлено, Safari показывает сообщение об ошибке «Невозможно открыть URL» и все. Есть ли способ отключить это сообщение из JScript или есть другой способ узнать из JScript, установлено ли приложение (вместо того, чтобы нажать на URL приложения)?

Модератору: я видел, как кто-то задал аналогичный вопрос , и Модератор ошибочно пометил его как дубликат. Пожалуйста, поймите, что этот вопрос был конкретно о том, чтобы сделать это из браузера.

Нашел несколько подходящее решение здесь

Кстати, если кто-то интересуется, как сделать то же самое для Android, вот код. Мы используем библиотеку Dojo:

  dojo.io.iframe.send({
    url: "yourApp://foo/bar",
    load: function(resp) {
      // nothing to do since it will automagically open App
    },
    error: function () {
      window.location = "go to Android market";
    }
  });

Ответы [ 5 ]

13 голосов
/ 12 июня 2015

В Филиал мы используем форму кода ниже - обратите внимание, что iframe работает на большем количестве браузеров.Просто замените его в URI вашего приложения и на ссылку в App Store.Кстати, использование iframe заставляет замолчать ошибку, если у них не установлено приложение.Это здорово!

<!DOCTYPE html>
<html>
    <body>
        <script type="text/javascript">
            window.onload = function() {
                // Deep link to your app goes here
                document.getElementById("l").src = "my_app://";

                setTimeout(function() {
                    // Link to the App Store should go here -- only fires if deep link fails                
                    window.location = "https://itunes.apple.com/us/app/my.app/id123456789?ls=1&mt=8";
                }, 500);
            };
        </script>
        <iframe id="l" width="1" height="1" style="visibility:hidden"></iframe>
    </body>
</html>

Если у других есть лучшие решения, чтобы определить, действительно ли произошел сбой вызова схемы URI, пожалуйста, пишите!Я не видел ни одного, и я потратил кучу времени на поиски.Все существующие решения зависят только от пользователя, который все еще находится на странице, и от запуска setTimeout.

4 голосов
/ 01 июля 2012

- это код, который работает на iO, даже если по-прежнему отображается «Не удается открыть URL».

    window.location = "yourApp://foo/bar";      
    clickedAt = +new Date;
    setTimeout(function() {
        if (+new Date - clickedAt < 2000) {
            window.location = "go to Android market";
        }
    }, 500);

Спасибо за решение для Android.

0 голосов
/ 16 мая 2017

Есть несколько вещей, которые вы можете сделать, чтобы улучшить другие ответы.Начиная с iOS 9, ссылка может быть открыта в UIWebView или в SFSafariViewController.Возможно, вы захотите обращаться с ними по-разному.

SFSafariViewController разделяет файлы cookie между приложениями и встроенным Safari.Таким образом, в вашем приложении вы можете сделать запрос через SFSafariViewController, который установит cookie-файл с надписью «мое приложение установлено».Например, вы открываете свой веб-сайт, запрашивая у вашего сервера такой файл cookie.Затем в любое время, когда вы получаете запрос от SFSafariViewController, вы можете проверить этот файл cookie и перенаправить на MYAPP://, если найдете, или в магазин приложений, если нет.Не нужно открывать веб-страницу и выполнять перенаправление JavaScript, вы можете сделать 301 с вашего сервера.Такие приложения, как Messages или Safari, делятся этими файлами cookie.

UIWebView очень сложный процесс, поскольку он полностью изолирован в песочнице и не использует файлы cookie ни с кем другим.Таким образом, вам придется вернуться к тому, что было описано в других ответах:

window.onload = function() {
  var iframe = document.createElement("iframe");
  var uri = 'MYAPP://';
  var interval = setInterval(function() {
      // Link to the App Store should go here -- only fires if deep link fails                
      window.location = "https://itunes.apple.com/us/app/my.app/id123456789?ls=1&mt=8";
  }, 500);
  iframe.onload = function() {
      clearInterval(interval);
      iframe.parentNode.removeChild(iframe);
      window.location.href = uri;
  };
  iframe.src = uri;
  iframe.setAttribute("style", "display:none;");
  document.body.appendChild(iframe);  
};

Я нахожу это раздражающим, что это подскажет пользователю, если он хочет покинуть текущее приложение (чтобы перейти к вашемуприложение), даже если ваше приложение не установлено.(эмпирически это кажется верным только из UIWebView, если вы делаете это из обычного Safari, например, этого не произойдет), но это все, что мы получили!

Вы можете отличить UIWebView от SFSafariViewControllerс вашего сервера, поскольку у них другой заголовок пользовательского агента: SFSafariViewController содержит Safari , а UIWebView - нет.Например:

Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E269
-> UIWebView

Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E269 Safari/602.1
-> SFSafariViewController

Другие соображения:

  • при первом подходе вам может потребоваться обработка удалений: если пользователь удаляет ваше приложение, у вас все еще есть файл cookie, который говоритчто приложение есть, но его нет, поэтому вы можете получить сообщение "Can not open URL".Я обработал его, удалив файл cookie после нескольких попыток, которые не привели к открытию приложения (что я знаю, потому что при каждом открытии приложения я сбрасываю этот файл cookie с ошибками)
  • Во втором случаеНеясно, лучше ли вам использовать setInterval или setTimeout.Проблема с тайм-аутом заключается в том, что, если он срабатывает при включенном запросе, он будет игнорироваться.Например, если вы откроете ссылку из Messenger, ОС спросит вас «Выйти из Messenger? Вы собираетесь открыть другое приложение», когда iframe попытается загрузить ваше приложение.Если вы не ответите в любом случае в течение 500 мс времени ожидания, перенаправление в тайм-ауте будет проигнорировано.
  • Наконец, даже если UIWebView находится в «песочнице», вы можете дать ему cookie для его идентификации,передайте его в свою ссылку и сохраните этот идентификатор как соответствующий устройству с вашим приложением на вашем сервере, когда ваше приложение откроется.В следующий раз, если вы увидите такой файл cookie в запросе, поступающем от UIWebView, вы можете проверить, соответствует ли оно известному устройству с приложением, и перенаправить напрямую с 301, как и раньше.
0 голосов
/ 07 августа 2014

Я объединил несколько вещей и использовал следующий код, чтобы проверить, является ли это устройством iOS, прежде чем использовать метод try / catch из chazbot.К сожалению, устройство все еще выдает всплывающее окно пользователю, говоря, что адрес недействителен ... кто-нибудь знает, является ли это ожидаемым поведением при попытке открыть недопустимый URL в блоке try?

    var i = 0,
    iOS = false,
    iDevice = ['iPad', 'iPhone', 'iPod'];

    for ( ; i < iDevice.length ; i++ ) {
        if( navigator.platform === iDevice[i] ){ iOS = true; break; }
    }

    try {
        //run code that normally breaks the script or throws error
        if (iOS) { window.location = "myApp://open";}
    }
    catch(e) {
        //do nothing
    }
0 голосов
/ 01 октября 2011

Я думаю, что вы все еще можете использовать URL-адрес приложения в качестве теста.Попробуйте обернуть его в try...catch блок,

try {
  //run code that normally breaks the script or throws error
}
catch(e) {
  //do nothing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...