Как проверить, установлено ли приложение с веб-страницы на iPhone?

Я хочу создать веб-страницу, страницу, которая перенаправляет iPhone в приложение-магазин, если iPhone не имеет установленного приложения, но если iPhone установлен, я хочу, чтобы он открыл приложение.

Я уже внедрил собственный URL-адрес в приложении iPhone, поэтому у меня есть URL-адрес приложения, что-то вроде:

myapp://

И если этот URL недействителен, я хочу, чтобы страница перенаправлялась в хранилище приложений. Возможно ли это вообще?

Если у меня нет приложения, установленного на телефоне, и напишите myapp://url в сафари, все, что я получаю, это сообщение об ошибке.

Даже если существует уродливое взломание с javascript, мне бы очень хотелось узнать?

Ответ 1

Насколько я знаю, вы не можете в браузере проверить, установлено ли приложение или нет.

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

setTimeout(function () { window.location = "https://itunes.apple.com/appdir"; }, 25);
window.location = "appname://";

Если вторая строка кода дает результат, первая строка никогда не выполняется.

Надеюсь, это поможет!

Аналогичный вопрос:

Ответ 2

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

var now = new Date().valueOf();
setTimeout(function () {
    if (new Date().valueOf() - now > 100) return;
    window.location = "https://itunes.apple.com/appdir";
}, 25);
window.location = "appname://";

Таким образом, если произошло замораживание выполнения кода (т.е. переход приложения), он не будет работать.

Ответ 3

В iOS Safari есть функция, позволяющая добавить на ваш веб-сайт "умный" баннер, который будет привязан либо к вашему приложению, либо к нему, либо к магазину приложений.

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

Подробности находятся в Apple Сопровождение приложений с помощью смарт-баннеров.

Механизм имеет преимущества быть легким и представлять стандартизированный баннер. Недостатком является то, что у вас нет большого контроля над внешним видом или местоположением. Кроме того, все ставки отключены, если страница просматривается в браузере, отличном от Safari.

Ответ 4

Вы можете проверить этот плагин, который пытается решить проблему. Он основан на том же подходе, который описывается missemisa и Alastair и т.д., Но вместо этого использует скрытый iframe.

https://github.com/hampusohlsson/browser-deeplink

Ответ 5

@Alistair указал в этом ответе, что иногда пользователи возвращаются в браузер после открытия приложения. Комментарий к этому ответу указывал, что используемые значения времени должны были быть изменены в зависимости от версии iOS. Когда нашей команде приходилось иметь дело с этим, мы обнаружили, что значения времени для начального тайм-аута и указание того, вернулись ли мы в браузер, должны были быть настроены и часто не работали для всех пользователей и устройств.

Вместо того, чтобы использовать произвольный порог разницы во времени, чтобы определить, вернулись ли мы в браузер, имеет смысл обнаруживать события "страницы" и "страницы".

Я разработал следующую веб-страницу, чтобы помочь диагностировать происходящее. Он добавляет HTML-диагностику, поскольку события разворачиваются, главным образом потому, что использование таких методов, как ведение журнала протоколов, предупреждений или Web Inspector, jsfiddle.net и т.д., Имело свои недостатки в этом потоке работы. Вместо того, чтобы использовать пороговое значение времени, Javascript подсчитывает количество событий "screenhide" и "pageshow", чтобы узнать, произошли ли они. И я обнаружил, что наиболее надежной стратегией было использование начального таймаута 1000 (а не 25, 50 или 100, сообщенных/предложенных другими).

Это может обслуживаться на локальном сервере, например. python -m SimpleHTTPServer и просмотрен на iOS Safari.

Чтобы играть с ним, нажмите либо ссылку "Открыть установленное приложение", либо "Не устанавливать приложение". Эти ссылки должны приводить к открытию приложения Maps или App Store. Затем вы можете вернуться в Safari, чтобы увидеть последовательность и время событий.

(Примечание: это будет работать только для Safari. Для других браузеров (например, Chrome) вам придется устанавливать обработчики для событий, связанных с экранами/шоу-эквивалентами).

Обновление: Как отметил @Mikko в комментариях, события, которые мы используем в качестве страниц/страниц, по-видимому, больше не поддерживаются в iOS8.

<html>
<head>
</head>
<body>
<a href="maps://" onclick="clickHandler()">Open an installed app</a>
<br/><br/>
<a href="xmapsx://" onclick="clickHandler()">App not installed</a>
<br/>

<script>

var hideShowCount = 0 ;
window.addEventListener("pagehide", function() {
    hideShowCount++ ;
    showEventTime('pagehide') ;
});

window.addEventListener("pageshow", function() {
    hideShowCount++ ;
    showEventTime('pageshow') ;
});

function clickHandler(){
    var hideShowCountAtClick = hideShowCount ;
    showEventTime('click') ;
    setTimeout(function () {
               showEventTime('timeout function '+(hideShowCount-hideShowCountAtClick)+' hide/show events') ;
               if (hideShowCount == hideShowCountAtClick){
                    // app is not installed, go to App Store
                    window.location = 'http://itunes.apple.com/app' ;
               }
            }, 1000);
}

function currentTime()
{
    return Date.now()/1000 ;
}

function showEventTime(event){
    var time = currentTime() ;
    document.body.appendChild(document.createElement('br'));
    document.body.appendChild(document.createTextNode(time+' '+event));
}
</script>
</body>
</html>

Ответ 6

Мне нужно сделать что-то вроде этого, я закончил работу со следующим решением.

У меня есть определенный URL-адрес веб-сайта, который откроет страницу с двумя кнопками

1) Кнопка One перейдите на веб-сайт

2) Кнопка Two перейдите в приложение (телефон/планшет iphone/android), вы можете вернуться сюда по умолчанию, если приложение не установлено (например, другой URL-адрес или магазин приложений)

3) cookie для запоминания выбора пользователей

<head>
<title>Mobile Router Example </title>


<script type="text/javascript">
    function set_cookie(name,value)
    {
       // js code to write cookie
    }
    function read_cookie(name) {
       // jsCode to read cookie
    }

    function goToApp(appLocation) {
        setTimeout(function() {
            window.location = appLocation;
              //this is a fallback if the app is not installed. Could direct to an app store or a website telling user how to get app


        }, 25);
        window.location = "custom-uri://AppShouldListenForThis";
    }

    function goToWeb(webLocation) {
        window.location = webLocation;
    }

    if (readCookie('appLinkIgnoreWeb') == 'true' ) {
        goToWeb('http://somewebsite');

    }
    else if (readCookie('appLinkIgnoreApp') == 'true') {
        goToApp('http://fallbackLocation');
    }



</script>
</head>
<body>


<div class="iphone_table_padding">
<table border="0" cellspacing="0" cellpadding="0" style="width:100%;">
    <tr>
        <td class="iphone_table_leftRight">&nbsp;</td>
        <td>
            <!-- INTRO -->
            <span class="iphone_copy_intro">Check out our new app or go to website</span>
        </td>
        <td class="iphone_table_leftRight">&nbsp;</td>
    </tr>
    <tr>
        <td class="iphone_table_leftRight">&nbsp;</td>
        <td>
            <div class="iphone_btn_padding">

                <!-- GET IPHONE APP BTN -->
                <table border="0" cellspacing="0" cellpadding="0" class="iphone_btn" onclick="set_cookie('appLinkIgnoreApp',document.getElementById('chkDontShow').checked);goToApp('http://getappfallback')">
                    <tr>
                        <td class="iphone_btn_on_left">&nbsp;</td>
                        <td class="iphone_btn_on_mid">
                            <span class="iphone_copy_btn">
                                Get The Mobile Applications
                            </span>
                        </td>
                        <td class="iphone_btn_on_right">&nbsp;</td>
                    </tr>
                </table>

            </div>
        </td>
        <td class="iphone_table_leftRight">&nbsp;</td>
    </tr>
    <tr>
        <td class="iphone_table_leftRight">&nbsp;</td>
        <td>
            <div class="iphone_btn_padding">

                <table border="0" cellspacing="0" cellpadding="0" class="iphone_btn"  onclick="set_cookie('appLinkIgnoreWeb',document.getElementById('chkDontShow').checked);goToWeb('http://www.website.com')">
                    <tr>
                        <td class="iphone_btn_left">&nbsp;</td>
                        <td class="iphone_btn_mid">
                            <span class="iphone_copy_btn">
                                Visit Website.com
                            </span>
                        </td>
                        <td class="iphone_btn_right">&nbsp;</td>
                    </tr>
                </table>

            </div>
        </td>
        <td class="iphone_table_leftRight">&nbsp;</td>
    </tr>
    <tr>
        <td class="iphone_table_leftRight">&nbsp;</td>
        <td>
            <div class="iphone_chk_padding">

                <!-- CHECK BOX -->
                <table border="0" cellspacing="0" cellpadding="0">
                    <tr>
                        <td><input type="checkbox" id="chkDontShow" /></td>
                        <td>
                            <span class="iphone_copy_chk">
                                <label for="chkDontShow">&nbsp;Don&rsquo;t show this screen again.</label>
                            </span>
                        </td>
                    </tr>
                </table>

            </div>
        </td>
        <td class="iphone_table_leftRight">&nbsp;</td>
    </tr>
</table>

</div>

</body>
</html>

Ответ 7

По состоянию на 2017 год, похоже, нет надежного способа обнаружения приложения, и трюк перенаправления не будет работать везде.

Для таких, как я, которым требуется глубокая ссылка непосредственно из электронных писем (довольно часто), стоит отметить следующее:

  • Отправка электронной почты с помощью appScheme://не будет работать нормально, потому что ссылки будут отфильтрованы в Gmail

  • Перенаправление автоматически в appScheme://заблокировано Chrome: я подозреваю, что Chrome требует, чтобы перенаправление было синхронным с взаимодействием с пользователем (например, щелчком)

  • Теперь вы можете использовать глубокую ссылку без appScheme://и лучше, но для этого требуется современная платформа и дополнительная настройка. Android iOS


Стоит отметить, что другие люди уже давно задумались об этом. Если вы посмотрите, как Slack реализует свою функцию "волшебной ссылки", вы можете заметить, что:

  • Он отправляет электронное письмо с обычной ссылкой http (ok с Gmail).
  • На веб-странице есть большая кнопка, которая ссылается на appScheme://(ok с Chrome)

Ответ 8

После компиляции нескольких ответов я придумал следующий код. Меня поразило то, что таймер не застыл на ПК (Chrome, FF) или Android Chrome - триггер работал в фоновом режиме, а проверка видимости была единственной надежной информацией.

var timestamp             = new Date().getTime();
var timerDelay              = 5000;
var processingBuffer  = 2000;

var redirect = function(url) {
  //window.location = url;
  log('ts: ' + timestamp + '; redirecting to: ' + url);
}
var isPageHidden = function() {
    var browserSpecificProps = {hidden:1, mozHidden:1, msHidden:1, webkitHidden:1};
    for (var p in browserSpecificProps) {
        if(typeof document[p] !== "undefined"){
        return document[p];
      }
    }
    return false; // actually inconclusive, assuming not
}
var elapsedMoreTimeThanTimerSet = function(){
    var elapsed = new Date().getTime() - timestamp;
  log('elapsed: ' + elapsed);
  return timerDelay + processingBuffer < elapsed;
}
var redirectToFallbackIfBrowserStillActive = function() {
  var elapsedMore = elapsedMoreTimeThanTimerSet();
  log('hidden:' + isPageHidden() +'; time: '+ elapsedMore);
  if (isPageHidden() || elapsedMore) {
    log('not redirecting');
  }else{
    redirect('appStoreUrl');
  }
}
var log = function(msg){
    document.getElementById('log').innerHTML += msg + "<br>";
}

setTimeout(redirectToFallbackIfBrowserStillActive, timerDelay);
redirect('nativeApp://');

JS Fiddle

Ответ 9

Не прочитал все это, но может использовать iframe и добавить источник в "мое приложение://независимо".

Затем регулярно проверять заданный интервал страницы на 404 или нет.

Вы также можете использовать Ajax-вызов. Если 404 ответ, то приложение не установлено.

Ответ 10

Решение по дате намного лучше, чем другие, мне приходилось увеличивать время на 50, это пример Tweeter:

//on click or your event handler..
var twMessage = "Your Message to share";
var now = new Date().valueOf();
setTimeout(function () {
   if (new Date().valueOf() - now > 100) return;
   var twitterUrl = "https://twitter.com/share?text="+twMessage;
   window.open(twitterUrl, '_blank');
}, 50);
window.location = "twitter://post?message="+twMessage;

Единственная проблема в Safari Mobile IOS - это когда у вас нет приложения, установленного на устройстве, и поэтому Safari показывает предупреждение, что autodismiss при открытии нового URL-адреса в любом случае является хорошим решением!