Как проверить, установлено ли приложение с веб-страницы на iPhone?
Я хочу создать веб-страницу, страницу, которая перенаправит iPhone в app-store, если на iPhone не установлено приложение, но если на iPhone установлено приложение, я хочу, чтобы оно открыло приложение.
Я уже реализовал пользовательский url-адрес в приложении iPhone, поэтому у меня есть url-адрес для приложения, который выглядит примерно так:
myapp://
и если этот url недействителен, я хочу, чтобы страница перенаправлялась в магазин приложений. Это возможно в все?
Если у меня нет приложения, установленного на телефоне, и написать myapp:// url в safari, все, что я получаю, это сообщение об ошибке.
даже если существует уродливый хак с javascript, я действительно хотел бы знать?
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.
@Алистер указал на ответ что иногда пользователи будут возвращаться в браузер после открытия приложения. Комментатор этого ответа указал, что используемые значения времени должны быть изменены в зависимости от версии 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"> </td> <td> <!-- INTRO --> <span class="iphone_copy_intro">Check out our new app or go to website</span> </td> <td class="iphone_table_leftRight"> </td> </tr> <tr> <td class="iphone_table_leftRight"> </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"> </td> <td class="iphone_btn_on_mid"> <span class="iphone_copy_btn"> Get The Mobile Applications </span> </td> <td class="iphone_btn_on_right"> </td> </tr> </table> </div> </td> <td class="iphone_table_leftRight"> </td> </tr> <tr> <td class="iphone_table_leftRight"> </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"> </td> <td class="iphone_btn_mid"> <span class="iphone_copy_btn"> Visit Website.com </span> </td> <td class="iphone_btn_right"> </td> </tr> </table> </div> </td> <td class="iphone_table_leftRight"> </td> </tr> <tr> <td class="iphone_table_leftRight"> </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"> Don’t show this screen again.</label> </span> </td> </tr> </table> </div> </td> <td class="iphone_table_leftRight"> </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://');
решение даты намного лучше, чем другие, мне пришлось увеличить время на 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-адреса в любом случае является хорошим решением на данный момент!