Jak sprawdzić, czy aplikacja jest zainstalowana ze strony internetowej na iPhonie?

Chcę utworzyć stronę internetową, stronę, która przekieruje iPhone ' a do sklepu z aplikacjami, Jeśli iPhone nie ma zainstalowanej aplikacji, ale jeśli iPhone ma zainstalowaną aplikację, chcę, aby otworzyła aplikację.

Zaimplementowałem już niestandardowy adres url w aplikacji na iPhone ' a, więc mam adres URL aplikacji, który jest czymś w stylu:

myapp://

A jeśli ten adres url jest nieprawidłowy, chcę, aby Strona przekierowała do app store. Czy to w ogóle możliwe?

If I don ' t zainstaluj aplikację na telefonie i napisz adres URL myapp: / / w safari, wszystko, co dostaję, to Komunikat o błędzie.

Nawet jeśli istnieje brzydki hack z javascript naprawdę chciałbym wiedzieć?

Author: Joakim Engstrom, 2012-10-24

10 answers

Z tego, co wiem, nie można, z przeglądarki, sprawdzić, czy aplikacja jest zainstalowana, czy nie.

Ale możesz spróbować przekierować telefon do aplikacji, a jeśli nic się nie stanie, przekieruj telefon na określoną stronę, Jak to:

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

Jeśli druga linia kodu daje wynik, to pierwszy wiersz nigdy nie jest wykonywany.

Mam nadzieję, że to pomoże!

Podobne pytanie:

 163
Author: missemisa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:55

Aby uzyskać akceptowaną odpowiedź, czasami trzeba dodać dodatkowy kod do obsługi osób zwracających przeglądarkę po uruchomieniu aplikacji-funkcja setTimeout będzie działać, gdy tylko to zrobią. Więc robię coś takiego:

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

W ten sposób, jeśli zostało zamrożone wykonywanie kodu (np. przełączanie aplikacji), nie będzie działać.

 138
Author: Alastair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-23 17:16:39

IOS Safari ma funkcję, która pozwala dodać" inteligentny " baner na swojej stronie internetowej, który będzie link do aplikacji, jeśli jest zainstalowana, lub do App Store.

Można to zrobić poprzez dodanie znacznika meta do strony. Możesz nawet określić szczegółowy adres URL aplikacji, Jeśli chcesz, aby aplikacja robiła coś specjalnego podczas ładowania.

[[1]}szczegóły znajdują się na stronie Apple promowanie aplikacji za pomocą banerów Smart App .

Mechanizm ma tę zaletę, że jest łatwy i prezentuje znormalizowany banner. Minusem jest to, że nie masz dużej kontroli nad wyglądem lub lokalizacją. Ponadto wszystkie zakłady są wyłączone, jeśli strona jest wyświetlana w przeglądarce innej niż Safari.

 25
Author: brainjam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-11 18:11:07

Możesz sprawdzić tę wtyczkę, która próbuje rozwiązać problem. Opiera się na tym samym podejściu, co opisane przez missemisa i Alastaira itp., ale zamiast tego używa ukrytego iframe.

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

 9
Author: hampusohlsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-19 03:06:52

@Alistair wskazał w tę odpowiedź , że czasami użytkownicy powrócą do przeglądarki po otwarciu aplikacji. Komentator tej odpowiedzi wskazał, że wartości czasów musiały zostać zmienione w zależności od wersji iOS. Kiedy nasz zespół musiał sobie z tym poradzić, stwierdziliśmy, że wartości czasu dla początkowego limitu czasu i informowanie, czy wróciliśmy do przeglądarki, musiały zostać dostrojone i często nie działały dla wszystkich użytkowników i urządzeń.

Zamiast używać arbitralnego czasu próg różnicy aby ustalić, czy wróciliśmy do przeglądarki, sensowne było wykrycie zdarzeń "pagehide" i "pageshow".

Opracowałem poniższą stronę internetową, aby pomóc zdiagnozować, co się dzieje. Dodaje diagnostykę HTML w miarę rozwoju zdarzeń, głównie dlatego, że za pomocą technik takich jak logowanie konsoli, alarmy lub Web Inspector, jsfiddle.net etc wszyscy mieli swoje wady w tym przepływie pracy. Zamiast korzystać z progu czasu, Javascript liczy liczbę "pagehide" i zdarzenia "pageshow", aby sprawdzić, czy miały miejsce. I odkryłem, że najbardziej solidną strategią było użycie początkowego limitu czasu 1000(zamiast 25, 50 lub 100 zgłaszanych / sugerowanych przez innych).

To może być serwowane na lokalnym serwerze, np. python -m SimpleHTTPServer i wyświetlane na iOS Safari.

Aby się nim bawić, naciśnij łącza" Otwórz zainstalowaną aplikację "lub" aplikacja nie zainstalowana". Łącza te powinny spowodować otwarcie aplikacji Maps lub App Store. Następnie możesz wrócić do Safari, aby zobaczyć Sekwencja i czas wydarzeń.

(uwaga: będzie to działać tylko dla Safari. Dla innych przeglądarek (np. Chrome) trzeba by zainstalować programy obsługi dla zdarzeń równorzędnych page / show).

Update: Jak zauważył @Mikko w komentarzach, zdarzenia pageshow / pagehide, których używamy, najwyraźniej nie są już obsługiwane w 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>
 9
Author: brainjam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:13

Od 2017 roku wydaje się, że nie ma niezawodnego sposobu na wykrycie zainstalowanej aplikacji, a sztuczka przekierowania nie będzie działać wszędzie.

Dla takich jak ja, którzy potrzebują głębokiego linku bezpośrednio z maili (dość często), warto zwrócić uwagę na:

  • Wysyłanie e-maili z appScheme: / / nie będzie działać dobrze, ponieważ linki będą filtrowane w Gmailu

  • Automatyczne przekierowanie do appScheme: / / jest zablokowane przez Chrome: podejrzewam, że Chrome wymaga przekierowania do bądź synchroniczny z interakcją użytkownika (jak kliknięcie)

  • Możesz teraz Głębokie łącze bez appScheme: / / i jest lepiej, ale wymaga nowoczesnej platformy i dodatkowej konfiguracji. Android iOS


Warto zauważyć, że inni ludzie już o tym dogłębnie myśleli. Jeśli spojrzysz, jak Slack implementuje swoją funkcję "magicznego łącza", możesz zauważyć, że:

  • wysyła e-mail ze zwykłym linkiem http (ok z Gmail)
  • [[5]} strona ma duży przycisk, który łączy się z appScheme:// (ok z Chrome)
 6
Author: Sebastien Lorber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-21 08:43:48

Muszę zrobić coś takiego, skończyło się na następującym rozwiązaniu.

Mam konkretny adres URL strony, który otworzy stronę z dwoma przyciskami

1) Button One go to website

2) Przycisk drugi przejdź do aplikacji (iphone / telefon z Androidem / tablet) możesz wrócić do domyślnej lokalizacji stąd, Jeśli aplikacja nie jest zainstalowana (jak inny adres url lub sklep z aplikacjami)

3) plik cookie do zapamiętania wyboru użytkownika

<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>
 2
Author: nate_weldon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-17 19:50:08

Po zebraniu kilku odpowiedzi, wymyśliłem następujący kod. Zaskoczyło mnie to, że timer robi a nie zamrozić na PC (Chrome, FF) lub Android Chrome - WYZWALACZ działał w tle, a sprawdzanie widoczności było jedyną wiarygodną informacją.

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

 1
Author: ptrk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-30 12:32:28

Rozwiązanie daty jest znacznie lepsze niż inne, musiałem zwiększyć czas na 50 w ten sposób to jest przykład głośnika wysokotonowego:

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

Jedynym problemem na urządzeniach mobilnych iOS Safari jest to, że nie masz zainstalowanej aplikacji na urządzeniu, a więc Safari pokazuje alert, że autodismiss po otwarciu nowego adresu url jest dobrym rozwiązaniem na razie!

 -2
Author: Magico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-30 11:06:48

Nie przeczytałem tych wszystkich, ale może być użycie iframe i dodanie źródła do, "moja aplikacja: / / cokolwiek".

Następnie Regularnie sprawdzaj na ustawionym interwale strony jest 404 lub nie.

Możesz również użyć połączenia Ajax. Jeśli odpowiedź 404 to aplikacja nie jest zainstalowana.

 -2
Author: 1.21 gigawatts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-29 02:00:31