Je développe une application Web qui utilise PhoneGap: Build pour une version mobile et je souhaite avoir une base de code unique pour les versions «bureau» et mobile. Je veux pouvoir détecter si les appels PhoneGap fonctionneront (c'est-à-dire si l'utilisateur sur un appareil mobile prend en charge PhoneGap).
J'ai cherché et je ne peux pas croire qu'il n'y ait pas de moyen simple de faire cela. De nombreuses personnes ont offert des suggestions;
- http://www.sencha.com/forum/showthread.php?144127-Checking-if-running-in-PhoneGap-or-Mobile-Web-Browser
- http://groups.google.com/group/phonegap/browse_thread/thread/322e80bd41bb1a54/a421300eb2a2029f?lnk=gst&q=detect+desktop#a421300eb2a2029f
- http://groups.google.com/group/phonegap/browse_thread/thread/8a95dfeb0f313792/3ff10d8f35211739?lnk=gst&q=detect+desktop+browser#3ff10d8f35211739
Rien de tout cela ne fonctionne, à moins que vous ne supprimiez le fichier Javascript PhoneGap de la version de bureau de l'application, ce qui va à l'encontre de mon objectif d'avoir une base de code.
Jusqu'à présent, la seule solution que j'ai trouvée est le reniflement du navigateur / agent utilisateur, mais ce n'est pas robuste pour dire le moins. Toutes les meilleures solutions sont les bienvenues!
EDIT: Une solution légèrement meilleure consiste à essayer d'appeler une fonction PhoneGap après un petit délai d'expiration - si cela ne fonctionne pas, supposez que l'utilisateur est sur un navigateur Web de bureau.
la source
Réponses:
J'utilise ce code:
METTRE À JOUR
Il existe de nombreuses autres façons de détecter si phonegap fonctionne ou non sur un navigateur, voici une autre excellente option:
comme vu ici: Détecter entre un navigateur mobile ou une application PhoneGap
la source
J'ai écrit un post à ce sujet il y a quelques jours. C'est la meilleure solution que vous puissiez trouver (jusqu'à ce que PhoneGap publie quelque chose, peut-être ou peut-être pas), c'est court, simple et parfait (je l'ai vérifié de toutes les manières et de toutes les plates-formes possibles).
Cette fonction fera le travail dans 98% des cas.
Pour compléter les 2% restants des cas, suivez ces étapes (cela implique une légère modification du code natif):
Créez un fichier appelé __phonegap_index.html , avec la source:
Désormais, en mode natif, changez simplement la page de démarrage de index.html en __phonegap_index.html sur toutes vos plates-formes PhoneGap. Disons que le nom de mon projet est un exemple , les fichiers que vous devez modifier sont (comme pour PhoneGap version 2.2.0):
CordovaLibApp/AppDelegate.m
src/org/apache/cordova/example/cordovaExample.java
example/package.appxmanifest
www/config.xml
framework/appinfo.json
src/WebForm.cpp
(ligne 56)Enfin, vous pouvez l'utiliser n'importe où sur votre site, qu'il fonctionne sur PhoneGap ou non:
J'espère que ça aide. :-)
la source
/^file:\/{3}[^\/]/i.test(window.location.href)
mais nous utilisons PhoneGap, par exemple lors du chargement de l'index.html à partir d'une autre page, sur config.xml quelque chose comme ça<content src="http://10.100.1.147/" />
(cordova || PhoneGap || phonegap)
lèvera une ReferenceError si l'une de ces variables n'est pas définie. Vous devriez tester avectypeof cordova !== undefined
, non?return ( typeof cordova !== undefined || typeof PhoneGap !== undefined || typeof phonegap !== undefined )
ReferenceError
plus un à cause duwindow
préfixe). Je pensais juste que je le soulignerais, car cela rend la chaîne de commentaires obsolète (et donc incorrecte).Je sais que cela a été répondu il y a un certain temps mais "PhoneGap.available" n'existe plus. Tu devrais utiliser:
ou depuis 1.7, préférez:
EDIT 2019: comme indiqué dans les commentaires, cela ne fonctionne que si vous n'incluez pas cordova lib dans la version de votre navigateur de bureau. Et bien sûr, il est recommandé d'inclure uniquement les fichiers javascript / html / css minimum stricts pour chaque appareil que vous ciblez
la source
Le moyen le plus fiable que nous ayons trouvé pour savoir si nous sommes dans une application cordova / phonegap est de modifier l'agent utilisateur de l'application cordova à l' aide de cette configuration AppendUserAgent .
En
config.xml
plus:Puis appelez:
Pourquoi?
window.cordova
etdocument.addEventListener('deviceready', function(){});
sont soumis aux conditions de coursenavigator.standalone
ne fonctionne pas quand<content src="index.html" />
est un site Web (Ex:<content src="https://www.example.com/index.html" />
ou avec cordova-plugin-remote-injection )la source
Cordova AppName/v0.0.1
<3 Donc, de cette façon, vous pouvez même l'utiliser pour le suivi (mais notez que n'importe qui peut modifier son useragent, alors ne vous fiez pas à cela pour les vérifications critiques de sécurité)Je pense que c'est le plus simple:
var isPhoneGap = (location.protocol == "file:")
EDIT Pour certaines personnes, cela n'a pas fonctionné. Ensuite, vous pourriez essayer (pas testé)
la source
var isPhoneGap = ! /^http/.test(document.location.protocol)
Cela fonctionne pour moi (exécutant 1.7.0)
Testé sur les ordinateurs de bureau Chrome et Safari.
la source
Comme l'affiche originale, j'utilise le service de build phonegap. Après deux jours et près de 50 versions de test, j'ai trouvé une solution élégante qui fonctionne très bien pour moi.
Je ne pouvais pas utiliser UA sniffing car je voulais tester et exécuter dans des navigateurs mobiles. J'avais initialement opté pour la technique assez fonctionnelle de Cobberboy. Cela n'a pas fonctionné pour moi car le délai / délai d'expiration «howPatientAreWe: 10000» était trop gênant pour le développement dans le navigateur. Et le régler plus bas échouerait parfois le test en mode application / appareil. Il devait y avoir un autre moyen ...
Le service de build phonegap nécessite que le
phonegap.js
fichier soit omis de votre référentiel de code avant de soumettre les fichiers de votre application au service. Par conséquent, je suis en mesure de tester son existence pour déterminer si elle fonctionne dans un navigateur par rapport à une application.Une autre mise en garde, j'utilise également jQueryMobile, donc jQM et phonegap ont dû s'initialiser avant de pouvoir commencer un script personnalisé. Le code suivant est placé au début de mon fichier index.js personnalisé pour l'application (après jQuery, avant jQM). Les documents de construction de phonegap indiquent également qu'il faut placer
<script src="phonegap.js"></script>
quelque part dans le HTML. Je le laisse complètement de côté et le charge en utilisant $ .getScript () pour tester son existence.la source
Fait intéressant, de nombreuses réponses, mais elles n'incluent pas ces trois options:
1 - Le cordova.js définira l'objet cordova dans la portée globale. Si c'est le cas, vous utilisez probablement une lunette Cordova.
2 - Cordova exécutera votre application comme vous ouvririez un document HTML depuis votre bureau. Au lieu du protocole HTTP, il utilisera FILE. Détecter cela vous donnera une chance de supposer que votre application a été chargée localement.
3 - Utilisez l'événement load du script cordova pour détecter le contexte. Le script include peut être facilement supprimé dans le processus de construction ou le chargement du script échouera simplement dans un navigateur. Pour que cette variable globale ne soit pas définie.
Le crédit revient à Damien Antipa d'Adobe
la source
J'utilise cette méthode:
debug
seratrue
sur l'environnement du navigateur,false
sur l'appareil.la source
Cela semble viable et je l'ai utilisé en production:
Source: http://tqcblog.com/2012/05/09/detecting-phonegap-cordova-on-startup/
la source
L'essence du problème est que tant que cordova.device n'est pas défini, votre code ne peut pas être sûr si c'est parce que cordova a établi que votre appareil n'est pas pris en charge, ou si c'est parce que cordova se prépare toujours et que deviceready se déclenchera plus tard. (ou troisième option: cordova ne s'est pas chargé correctement).
La seule solution est de définir une période d'attente et de décider qu'après cette période, votre code doit supposer que l'appareil n'est pas pris en charge. Je souhaite que cordova définisse un paramètre quelque part pour dire "Nous avons essayé de trouver un périphérique pris en charge et avons abandonné", mais il semble qu'il n'y ait pas de tel paramètre.
Une fois que cela est établi, vous voudrez peut-être faire quelque chose de spécifique précisément dans les situations où il n'y a pas de périphérique pris en charge. Comme cacher des liens vers le marché des applications de l'appareil, dans mon cas.
J'ai reconstitué cette fonction qui devrait couvrir à peu près toutes les situations. Il vous permet de définir un gestionnaire deviceready, un gestionnaire de périphérique jamais prêt et un temps d'attente.
la source
La façon dont je le fais est d'utiliser une variable globale qui est écrasée par une version de cordova.js réservée au navigateur. Dans votre fichier html principal (généralement
index.html
), j'ai les scripts suivants qui dépendent de l'ordre:Et à l'intérieur
cordova.js
j'ai simplement:Lors de la construction pour un appareil mobile, le cordova.js ne sera pas utilisé (et à la place le fichier cordova.js spécifique à la plate-forme sera utilisé), donc cette méthode a l'avantage d'être 100% correcte quels que soient les protocoles, userAgents ou bibliothèque variables (qui peuvent changer). Il y a peut-être d'autres choses que je devrais inclure dans cordova.js, mais je ne sais pas encore ce qu'elles sont.
la source
if ( typeof __cordovaRunningOnBrowser__ !== 'undefined' ) { stuff(); }
.. d'accord?Une autre façon, basée sur la solution SlavikMe:
Utilisez simplement un paramètre de requête transmis à
index.html
partir de votre source PhoneGap. Ie, sous Android, au lieu deutilisation
SlavikMe a une excellente liste sur où faire cela sur d'autres plates-formes.
Ensuite, vous
index.html
pouvez simplement faire ceci:la source
<content src="index.html" />
option dans le fichier config.xml en<content src="index.html?cordova=1" />
. Jusqu'à présent, cela semble fonctionner et est de loin la meilleure solution suggérée ici.Pour garder une base de code, ce qui est intéressant, c'est la «plate-forme» sur laquelle le code s'exécute. Pour moi, cette «plateforme» peut être trois choses différentes:
La façon de vérifier la plate-forme:
Remarque:
Cela ne doit être exécuté qu'après le chargement de cordova.js (body onload (...), $ (document) .ready (...))
'ontouchstart' dans document.documentElement sera présent dans les ordinateurs portables et les moniteurs de bureau qui ont un écran tactile afin de signaler un navigateur mobile même s'il s'agit d'un ordinateur de bureau. Il existe différentes manières de faire un contrôle plus précis mais je l'utilise car il prend toujours en charge 99% des cas dont j'ai besoin. Vous pouvez toujours remplacer cette ligne par quelque chose de plus robuste.
la source
typeof cordova !== 'undefined'
au lieu de pêcher une exception.Aarons, essayez
la source
La solution de GeorgeW est correcte, mais même sur un appareil réel, PhoneGap.available n'est vrai qu'après le chargement des éléments de PhoneGap, par exemple onDeviceReady dans document.addEventListener ('deviceready', onDeviceReady, false) a été appelé.
Avant cette heure, si vous voulez savoir, vous pouvez faire comme ceci:
Cette solution suppose que la plupart des développeurs développent en utilisant Chrome ou Firefox.
la source
J'ai le même problème.
Je me penche pour ajouter # cordova = true à l'URL chargée par le client cordova et tester location.hash.indexOf ("cordova = true")> -1 dans ma page Web.
la source
Ce qui suit fonctionne pour moi avec le plus récent PhoneGap / Cordova (2.1.0).
Comment ça fonctionne:
Avantages:
Désavantages:
==
Créez un tout nouveau projet PhoneGap vierge. Dans l'exemple d'index.js fourni, remplacez la variable "app" en bas par ceci:
la source
Je suis tombé sur ce problème il y a plusieurs mois au début de notre application, car nous voulions que l'application soit "
browser-compatible
" également (étant entendu que certaines fonctionnalités seraient bloquées dans ce scénario: enregistrement audio, boussole, etc.).La seule
100%
solution (et j'insiste sur la condition 100-cent-cent) pour PRE-déterminer le contexte d'exécution de l'application était la suivante:initialisez une variable JS "flag" à true et changez-la en false dans un contexte entièrement Web;
donc vous pouvez utiliser un appel comme "
willIBeInPhoneGapSometimesInTheNearFuture()
" (c'est PRE-PG, bien sûr vous avez toujours besoin d'une méthode POST-PG pour vérifier si vous pouvez appeler des API PG, mais celle-ci est triviale).Ensuite, vous dites: "
but how do you determine the execution context
?"; la réponse est: "vous ne le faites pas" (parce que je ne pense pas que vous puissiez le faire de manière fiable, à moins que ces brillants gens de PG ne le fassent dans leur code API);vous écrivez un script de construction qui le fait pour vous: une base de code avec deux variantes.
la source
Ce n'est pas vraiment une réponse à la question, mais lorsque je teste dans un navigateur de bureau, je viens de définir une valeur de stockage local pour que le navigateur charge l'application malgré le périphérique prêt à ne pas se déclencher.
la source
Une autre option serait d'utiliser des fusions dossier de , voir capture d'écran ci-dessous.
Vous pouvez ajouter des fichiers spécifiques à la plate-forme / remplacer ceux par défaut.
(cela devrait faire l'affaire dans certains scénarios)
En d'autres termes: plutôt que de détecter le navigateur, vous n'incluez tout simplement pas certains fichiers pour la création de bureau / attachez certains fichiers pour iOS uniquement.
la source
Détecter le navigateur de bureau même si le périphérique d'émulation est actif
Fonctionne sur les machines Windows et Mac. Besoin de trouver une solution pour Linux Voir les détails
la source
En fait, j'ai trouvé qu'une combinaison de deux des techniques énumérées ici fonctionnait le mieux, tout d'abord, vérifiez que cordova / phonegap est accessible, vérifiez également si l'appareil est disponible. Ainsi:
la source
Essayez cette approche:
la source
J'utilise une combinaison de ce que GeorgeW et mkprogramming ont suggéré:
la source
Je suppose que d'une certaine manière, ils ne sont pas si différents que ça? Ha Ha ... pas drôle. Qui ne pensait pas que ce ne serait pas un problème? Voici la solution la plus simple pour vos considérations. Poussez différents fichiers sur votre serveur, puis sur PhoneGap. J'irais aussi temporairement avec le http: check suggéré ci-dessus.
Mon intérêt est de pousser la barre de navigation des navigateurs vers le haut, donc vraiment je peux simplement supprimer la balise du script isolé et appuyer sur la reconstruction [dans DW] (ils seront de toute façon un nettoyage pour le déploiement donc cela peut être l'une de ces tâches.) Quoi qu'il en soit, je pense c'est une bonne option (étant donné qu'il n'y a pas grand chose d'autre disponible) pour commenter efficacement les choses manuellement avec isMobileBrowserAndNotPhoneGap lors du transfert vers PG). Encore une fois pour moi, dans ma situation, je supprimerai simplement la balise du fichier (code isolé) qui fait monter la barre de navigation lorsqu'il s'agit d'un navigateur mobile (ce sera beaucoup plus rapide et plus petit). [Alors si vous pouvez isoler le code de cette solution optimisée mais manuelle.]
la source
Légèrement modifié, mais fonctionne parfaitement pour moi sans aucun problème.
L'intention est de charger Cordova uniquement sur un périphérique intégré, pas sur un bureau, donc j'évite complètement cordova sur un navigateur de bureau. Le test et le développement de l'interface utilisateur et MVVM sont donc très confortables.
Mettez ce code par exemple. dans le fichier cordovaLoader.js
Ensuite, au lieu d'inclure cordova javascript lui-même, incluez cordovaLoader.js
Facilitez votre travail! :)
la source
la source
Juste pour info le chemin dans PhoneGap 3.x Mobile Application Development Hotshot
et dans le cadre YASMF
https://github.com/photokandyStudios/YASMF-Next/blob/master/lib/yasmf/util/core.js#L152
la source
J'essayais avec les objets de la fenêtre mais cela n'a pas fonctionné car j'ouvrais l'url distante dans InAppBrowser. Impossible de le faire. Le moyen le meilleur et le plus simple d'y parvenir était donc d'ajouter une chaîne à l'url que vous devez ouvrir à partir de l'application phonegap. Vérifiez ensuite si l'emplacement du document a une chaîne ajoutée.
Vous verrez qu'une chaîne est ajoutée à l'url "#phonegap" .Alors, dans l'URL du domaine, ajoutez le script suivant
la source