182 votes

Comment vérifier si une application est installée à partir d'une page web sur un iPhone?

Je veux créer une page web, une page qui va rediriger un iPhone sur l'app-store si l'iPhone n'a pas installé l'application, mais si l'iPhone a l'application installée, je le veux pour ouvrir l'application.

J'ai déjà mis en place une url personnalisée dans l'application iPhone j'ai donc une url pour l'application qui est quelque chose comme:

myapp://

Et si cette url est invalide, je veux que la page de redirection vers l'app store. Est-ce possible?

Si je n'ai pas installé l'application sur le téléphone et écrire le myapp:// url de safari, tout ce que je reçois un message d'erreur.

Même si il en existe un vilain hack avec javascript je voudrais vraiment savoir?

247voto

missemisa Points 499

Comme je sais que vous ne pouvez pas, à partir d'un navigateur, de vérifier si une application est installée ou non.

Mais vous pouvez essayer de rediriger le téléphone à l'application, et si rien ne se passe rediriger le téléphone à une page donnée, comme ceci:

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

Si la deuxième ligne de code donne un résultat, alors la première ligne n'est jamais exécutée.

Espérons que cette aide!

Question similaire:

182voto

Alastair Points 998

Pour de plus amples accepté de répondre, vous avez parfois besoin d'ajouter du code pour gérer les personnes qui reprennent le navigateur après le lancement de l'app - que setTimeout fonction s'exécute chaque fois qu'ils le font. Donc, je fais quelque chose comme ceci:

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

De cette façon, si il y a eu un gel dans l'exécution de code (c'est à dire, au changement d'application), il ne s'exécute pas.

31voto

brainjam Points 11431

iOS Safari a une fonctionnalité qui vous permet d'ajouter un "smart" à la bannière de votre site web, qui permettra de relier à votre application, si elle est installée, ou à l'App Store.

Vous faites cela en ajoutant un meta balise de la page. Vous pouvez même spécifier détaillée URL d'application si vous souhaitez que l'application pour faire quelque chose de spécial quand il charge.

Les détails sont à Apple la Promotion d'Applications avec Smart App Banners page.

Le mécanisme a l'avantage d'être facile et la présentation normalisée de la bannière. L'inconvénient est que vous n'avez pas beaucoup de contrôle sur l'apparence ou de l'emplacement. Aussi, tous les paris sont éteints si la page est affichée dans un navigateur autre que Safari.

11voto

brainjam Points 11431

@Alistair a souligné dans cette réponse que, parfois, les utilisateurs seront de retour pour le navigateur après l'ouverture de l'application. Un intervenant la réponse à cette question ont indiqué que le temps de l'utilisation de valeurs a dû être modifiée en fonction de la version iOS. Lors de notre équipe a eu à faire face à cela, nous avons constaté que les valeurs de temps pour le délai d'attente initiale et dire que l'on avait renvoyé au navigateur a dû être à l'écoute, et souvent ne fonctionne pas pour tous les utilisateurs et les périphériques.

Plutôt que d'utiliser un arbitraire de la différence de temps de seuil pour déterminer si nous avions renvoyé au navigateur, il fait sens pour détecter les "pagehide" et "pageshow" des événements.

J'ai développé la page web suivante pour aider à diagnostiquer ce qui se passait. Il ajoute du code HTML de diagnostic comme les événements se déroulent, principalement parce que l'utilisation de techniques comme la console de journalisation, alertes, ou de l'Inspecteur Web, jsfiddle.net etc tous avaient leurs inconvénients dans ce flux de travail. Plutôt que d'utiliser un seuil de temps, le Javascript compte le nombre de "pagehide" et "pageshow" des événements pour voir si elles ont eu lieu. Et j'ai trouvé que le plus robuste de la stratégie est d'utiliser un délai d'attente initiale de 1000 (plutôt que le 25, 50, ou 100 déclarés/suggéré par d'autres).

Cela peut être servi sur un serveur local, par exemple, python -m SimpleHTTPServer et visualisés sur iOS Safari.

De jouer avec elle, appuyez sur le bouton "Ouvrir une application installée" ou "Application non installée" des liens. Ces liens devraient entraîner respectivement l'application Maps ou l'App Store pour l'ouvrir. Vous pouvez ensuite revenir à Safari pour voir la séquence et le calendrier des événements.

(Note: cela fonctionne pour Safari. Pour les autres navigateurs (Chrome), vous auriez à installer des gestionnaires pour les pagehide/show-événements équivalents).

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

2voto

nate_weldon Points 1334

J'ai besoin de faire quelque chose comme cela, j'ai fini par aller avec la solution suivante.

J'ai un site web spécifique de l'URL qui permet d'ouvrir une page avec deux boutons

1) Bouton d'Un site internet

2) Bouton Deux vont à l'application (iphone / android téléphone / tablette), vous pouvez revenir à un emplacement par défaut à partir d'ici, si l'application n'est pas installée (comme une autre url ou un app store)

3) cookie pour mémoriser les choix des utilisateurs

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X