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


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

Я уже реализовал пользовательский url-адрес в приложении iPhone, поэтому у меня есть url-адрес для приложения, который выглядит примерно так:

myapp://

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

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

даже если существует уродливый хак с javascript, я действительно хотел бы знать?

10 116

10 ответов:

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

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

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

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

надеюсь, что это помогает!

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

чтобы продолжить принятый ответ, вам иногда нужно добавить дополнительный код для обработки людей, возвращающих браузер после запуска приложения-эта функция 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://";

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

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

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

подробности у Apple продвижение приложений с помощью смарт-баннеров приложений страница.

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

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

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

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

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

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

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

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

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

обновление: как указал @Mikko в комментариях, события pageshow/pagehide, которые мы используем, по-видимому, больше не поддерживаются в 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>

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

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

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

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

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


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

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

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

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

1) кнопка один перейти на сайт

2) Кнопка два перейти к приложению (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>

после компиляции нескольких ответов, я придумал следующий код. Что меня удивило, так это то, что таймер делает не заморозить на ПК (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

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

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

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

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

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

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