Как проверить, установлено ли приложение с веб-страницы на 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"> </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>
Ответ 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-адреса в любом случае является хорошим решением!