Як перевірити, чи встановлено додаток із веб-сторінки на iPhone?


142

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

Я вже реалізував власну URL-адресу в додатку iPhone, тому у мене є URL-адреса програми, яка є на зразок:

myapp://

І якщо ця URL-адреса недійсна, я хочу переспрямувати сторінку в магазин додатків. Чи можливо це взагалі?

Якщо у мене не встановлено додаток на телефоні та написати myapp: // url в сафарі, я отримую лише повідомлення про помилку.

Навіть якщо існує некрасивий хак з JavaScript, я б дуже хотів знати?


1
Це постійно змінюється у кожній версії iOS - iOS9 просто знову все порушив. Я рекомендую скористатися такою послугою, як bran.io, щоб подбати про це за вас. Я допоміг створити частини служби зв’язку Branch, і вона наразі обробляє понад 6000 різних кейсів перенаправлення ... божевільні.
Алекс Остін

1
У 2017 році, якщо вам потрібно зв’язатись із вашим додатком із електронних листів, скоріше подивіться на мою відповідь: stackoverflow.com/questions/13044805/…
Sebastien Lorber

Відповіді:


198

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

Але ви можете спробувати перенаправити телефон на додаток, і якщо нічого не відбудеться, перенаправіть телефон на вказану сторінку, наприклад:

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

Якщо другий рядок коду дає результат, перший рядок ніколи не виконується.

Сподіваюся, це допомагає!

Подібне запитання:


20
В даний час в iOS 6.1.2 це, здається, працює лише в режимі webapp. Якщо ви користуєтесь додатком безпосередньо з браузера, він відкриває зовнішній додаток, як очікувалося, але час очікування також звільняється, і браузер перенаправляється.
Міка Туупола

4
Якщо додаток не встановлено, він видає некрасиве сповіщення про "сторінку не знайдено". У будь-якому випадку ми можемо придушити це
Акшат Агарвал

3
@AkshatAgarwal, будь ласка, розкажіть, як кодувати, щоб придушити "сторінку не знайдено сповіщення"
Harpreet

2
Зараз в Android та iOS існують нові способи їх реалізації. Перегляньте посилання для додатків для Android та універсальні посилання для iOS
maledr53

1
Відкрийте додаток, але також перенаправляйте браузер на appstore / playstore. Будь-який метод / хак для запобігання цього?
Sujeet Kumar

157

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

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


2
Це рішення набагато краще, ніж інші, мені довелося збільшити час на 50
Magico

1
Мій коментар щодо цього на iOS 7 був помилковим: мені просто довелося збільшити 100 мс до пари секунд (все-таки немає потреби в тому, щоб він був таким коротким).
devios1

Замість itunes.apple.com/appdir збережіть крок (не чекаючи перенаправлення http) та зв’яжіть безпосередньо зі схемою URL-адреси магазину додатків. Наприклад: itms: //itunes.apple.com/us/app/yelp/id284910350
Джастін

Дивовижно, це добре працює для додатків ios, той самий код перенаправлення на обидва URL-адреси одночасно в додатках для Android. ви займаєтесь андроїдом для відкриття магазинів додатків та ігор?
Мехул Дудхат

6
Це послідовно відкриває і мій додаток, і магазин додатків, навіть у 50. iOS 12
Josh Wolff

27

iOS Safari має функцію, яка дозволяє додати "розумний" банер на свою веб-сторінку, який буде посилатися або на ваш додаток, якщо він встановлений, або на App Store.

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

Детальна інформація знаходиться на сторінці рекламування додатків Apple із смарт-банерами додатків .

Переваги цього механізму є легкістю та поданням стандартизованого банера. Мінус полягає в тому, що ви не маєте великого контролю над виглядом чи місцем розташування. Крім того, всі ставки знімаються, якщо сторінку переглядають у веб-переглядачі, окрім Safari.


2
Але він не відображає банер програми, якщо користувач не встановив його
TomSawyer

Ні універсальні посилання, ні смарт-банери не працюють для мене. Мені потрібно мати кілька нативних посилань на різні програми. Кожен із встановленим чеком, якщо встановлено, запустіть його, інакше заходьте в магазин. Я також не маю контролю над доменами для завантаження файлу власності для універсальних посилань. Тож обидва варіанти для мене виправдані. Потрібно чисте рішення JavaScript.
FranticRock

16

Станом на 2017 рік, здається, немає надійного способу виявити, що додаток встановлено, і фокус з перенаправленням працюватиме не скрізь.

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

  • Надсилання електронних листів за допомогою appScheme: // не буде добре, оскільки посилання будуть відфільтровані в Gmail

  • Автоматичне перенаправлення на appScheme: // блокується Chrome: я підозрюю, що Chrome вимагає перенаправлення синхронізувати взаємодію з користувачем (як-от клацання)

  • Тепер ви можете поглибити посилання без appScheme: //, і це краще, але це вимагає сучасної платформи та додаткових налаштувань. Android iOS


Варто відзначити, що інші люди вже над цим глибоко думали. Якщо ви подивитеся на те, як Слак реалізує свою функцію "магічного посилання", ви можете помітити, що:

  • Він надсилає електронний лист звичайним http-посиланням (нормально з Gmail)
  • На веб-сторінці є велика кнопка, яка посилається на appScheme: // (нормально з Chrome)

9

Ви можете перевірити цей плагін, який намагається вирішити проблему. Він заснований на тому ж підході, що описаний у missemisa та Alastair тощо, але натомість використовує прихований кадр.

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


Я додав це, але він переспрямовує до Appstore навіть після того, як я встановив додаток.
Касим

9

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

Замість того, щоб використовувати довільний поріг різниці у часі, щоб визначити, чи повернулись ми до браузера, має сенс виявити події "pagehide" та "showhow".

Я розробив наступну веб-сторінку, щоб допомогти діагностувати, що відбувається. Він додає діагностику HTML, коли події розгортаються, головним чином тому, що використання таких методів, як консольний журнал, оповіщення або веб-інспектор, jsfiddle.net тощо, всі мали свої недоліки в цьому робочому процесі. Замість того, щоб використовувати поріг часу, Javascript підраховує кількість подій "pagehide" та "showhow", щоб побачити, чи відбулися вони. І я виявив, що найбільш надійною стратегією було використання початкового тайм-ауту 1000 (а не 25, 50 або 100, про які повідомили / запропонували інші).

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

Щоб грати з ним, натисніть посилання "Відкрити встановлений додаток" або "Додаток не встановлено". Ці посилання повинні спричинити відкриття відповідно програми "Карти" або магазину додатків. Потім ви можете повернутися до 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>

2

Мені потрібно щось подібне зробити, я закінчився наступним рішенням.

У мене є конкретна URL-адреса веб-сайту, яка відкриє сторінку з двома кнопками

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

2) Кнопка друга перейдіть до програми (iphone / android phone / tablet), звідси ви можете повернутися до місця за замовчуванням, якщо додаток не встановлено (як-от інший 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>

Мені потрібен цей тип коду для моєї вимоги, але не в змозі розмістити свої посилання. Вимога: Якщо встановлено програму1, перейдіть до Посилання 1, інакше перейдіть до Link2. Може хтось, будь ласка, допоможе?
SFDC_Learner

Потрібно зняти файл cookie під час встановлення програми, якщо користувач 1-й обрав Інтернет.
Charlie

1

Склавши кілька відповідей, я придумав наступний код. Мене здивувало те, що таймер не застигає на ПК (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


-2

Рішення щодо дати набагато краще, ніж інші, мені довелося збільшити час на 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 показує попередження про автоматичне відхилення, коли новий URL відкриється, все одно є хорошим рішенням на даний момент!


1
@AkshatAgarwal тому, що це те саме рішення, що і alastair, опублікований через 7 днів
albanx

-5

Чи не перечитав усе це, але, можливо, використовуйте iframe та додайте джерело до "мого додатку: // що завгодно".

Потім регулярно перевіряйте встановлений інтервал сторінки 404 чи ні.

Ви також можете використовувати дзвінок Ajax. Якщо відповідь 404, програма не встановлена.


Це не вокей рішення.
Андрій М.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.