120 votes

PhoneGap: Détecter si en cours d'exécution sur votre ordinateur de bureau

Je suis le développement d'une application web qui utilise l'PhoneGap:Construire pour une version mobile et que vous voulez avoir une seule base de code pour le "bureau" et les versions mobiles. Je veux être en mesure de détecter si PhoneGap les appels du travail (c'est à dire, est l'utilisateur d'un appareil mobile qui permettra de soutenir PhoneGap).

J'ai cherché et ne peut pas croire il n'y a pas de façon simple de le faire. Beaucoup de gens ont offert des suggestions;

Aucun travail, à moins de supprimer le PhoneGap fichier à partir de la version de bureau de l'application, qui va à l'encontre de mon objectif d'avoir une seule base de code.

Jusqu'à présent, la seule solution que j'ai est un navigateur / user agent sniffing, mais ce n'est pas robuste pour dire le moins. Toutes les meilleures solutions sont les bienvenues!

EDIT: UN peu meilleure solution est d'essayer d'appeler un PhoneGap fonction après quelques petites délai d'attente - si cela ne fonctionne pas, alors supposons que l'utilisateur est sur un navigateur web de bureau.

116voto

mkprogramming Points 1630

J'utilise ce code:

if (navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|IEMobile)/)) {
  document.addEventListener("deviceready", onDeviceReady, false);
} else {
  onDeviceReady(); //this is the browser
}

Mise à JOUR

Il existe de nombreuses autres façons de détecter si phonegap est en cours d'exécution sur un navigateur ou pas, ici, est une autre grande option:

var app = document.URL.indexOf( 'http://' ) === -1 && document.URL.indexOf( 'https://' ) === -1;
if ( app ) {
    // PhoneGap application
} else {
    // Web page
}  

comme on le voit ici: Détecter entre un navigateur mobile ou une application PhoneGap

49voto

SlavikMe Points 1013

J'ai écrit un post à ce sujet il y a quelques jours. C'est la meilleure solution que vous pouvez trouver (jusqu'à ce que PhoneGap sortira quelque chose, peut-être ou peut-être pas), c'est court, simple et parfait (je l'ai vérifié dans toutes les manières possibles et plate-forme).

Cette fonction va faire le travail pour 98% des cas.

/**
 * Determine whether the file loaded from PhoneGap or not
 */
function isPhoneGap() {
    return (cordova || PhoneGap || phonegap) 
    && /^file:\/{3}[^\/]/i.test(window.location.href) 
    && /ios|iphone|ipod|ipad|android/i.test(navigator.userAgent);
}

if ( isPhoneGap() ) {
    alert("Running on PhoneGap!");
} else {
    alert("Not running on PhoneGap!");
}

Pour compléter les autres 2% des cas, suivez ces étapes (elle implique une légère modification sur le code natif):

Créez un fichier appelé __phonegap_index.htmlavec la source:

<!-- __phonegap_index.html -->
<script type="text/javascript">
    function isPhoneGap() {
        //the function's content is as described above
    }

    //ensure the 98% that this file is called from PhoneGap.
    //in case somebody accessed this file directly from the browser.
    if ( isPhoneGap() )
        localStorage.setItem("isPhoneGap","1");

    //and redirect to the main site file.
    window.location = "index.html";
</script>

Maintenant, sur les indigènes simplement changer la page de démarrage de index.html à __phonegap_index.html sur tous vos PhoneGap plates-formes. Disons que mon nom de projet est exemple, les fichiers dont vous avez besoin de changement (comme pour PhoneGap version 2.2.0):

  • iOS - CordovaLibApp/AppDelegate.m
  • Android - src/org/apache/cordova/example/cordovaExample.java
  • Windows 8 - example/package.appxmanifest
  • BlackBerry - www/config.xml
  • WebOS - framework/appinfo.json
  • Bada - src/WebForm.cpp (ligne 56)
  • Window Phone 7 - Aucune idée d'où (quelqu'un encore en développement sur cette plate-forme?!)

Enfin, vous pouvez l'utiliser n'importe où sur votre site, si il est en cours d'exécution sur PhoneGap ou pas:

if ( localStorage.getItem("isPhoneGap") ) {
    alert("Running on PhoneGap!");
} else {
    alert("Not running on PhoneGap!");
}

Espérons que cela aide. :-)

27voto

Zougi Points 201

Je sais que ça a été répondu tout à l'heure, mais "PhoneGap.disponible" n'existe plus. Vous devez utiliser:

if (window.PhoneGap) {
  //do stuff
}

ou depuis la 1.7, préférez:

if (window.cordova) {
  //do stuff
}

14voto

Yuval Points 902

Je pense que c'est plus simple: var isPhoneGap = (document.location.protocol == "file:")

MODIFIER Pour certaines personnes, cela ne fonctionne pas. Vous pouvez essayer (n'ai pas testé)

var isPhoneGap = ! /^http/.test(document.location.protocol);

8voto

Rob Points 22239

Cela fonctionne pour moi (l'exécution de la version 1.7.0)

if (window.device) {
  // Running on PhoneGap
}

Testé sur desktop, google Chrome et Safari.

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