Estoy desarrollando una aplicación web que usa PhoneGap: Build para una versión móvil y quiero tener una única base de código para las versiones de 'escritorio' y móviles. Quiero poder detectar si las llamadas de PhoneGap funcionarán (es decir, si el usuario de un dispositivo móvil admitirá PhoneGap).
He buscado y no puedo creer que no haya una forma sencilla de hacer esto. Mucha gente ha ofrecido sugerencias;
- 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
Ninguno de los cuales funciona, a menos que elimine el archivo PhoneGap Javascript de la versión de escritorio de la aplicación, lo que frustra mi objetivo de tener una base de código.
Hasta ahora, la única solución que he encontrado es el rastreo del agente de usuario / navegador, pero esto no es robusto por decir lo menos. ¡Cualquier solución mejor bienvenida!
EDITAR: Una solución ligeramente mejor es intentar llamar a una función PhoneGap después de un pequeño tiempo de espera; si no funciona, suponga que el usuario está en un navegador web de escritorio.
fuente
Respuestas:
Yo uso este código:
ACTUALIZAR
Hay muchas otras formas de detectar si phonegap se está ejecutando en un navegador o no, aquí hay otra gran opción:
como se ve aquí: Detecta entre un navegador móvil o una aplicación PhoneGap
fuente
Escribí una publicación al respecto hace unos días. Esta es la mejor solución que puede encontrar (hasta que PhoneGap lance algo, tal vez o no), es breve, simple y perfecta (la he comprobado de todas las formas y plataformas posibles).
Esta función hará el trabajo en el 98% de los casos.
Para completar el otro 2% de los casos, siga estos pasos (implica un ligero cambio en el código nativo):
Cree un archivo llamado __phonegap_index.html , con la fuente:
Ahora, en nativo, simplemente cambie la página de inicio de index.html a __phonegap_index.html en todas sus plataformas PhoneGap. Digamos que el nombre de mi proyecto es un ejemplo , los archivos que necesita cambiar son (como para PhoneGap versión 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
(línea 56)Finalmente, puede usarlo en cualquier lugar de su sitio, si se ejecuta en PhoneGap o no:
Espero eso ayude. :-)
fuente
/^file:\/{3}[^\/]/i.test(window.location.href)
pero estamos usando PhoneGap, por ejemplo, cuando cargamos el index.html desde otra página, en config.xml algo como esto<content src="http://10.100.1.147/" />
(cordova || PhoneGap || phonegap)
arrojará un ReferenceError si alguna de esas variables no está definida. Deberías probartypeof cordova !== undefined
, ¿verdad?return ( typeof cordova !== undefined || typeof PhoneGap !== undefined || typeof phonegap !== undefined )
ReferenceError
más debido alwindow
prefijo). Solo pensé en señalar esto, ya que esto en realidad hace que la cadena de comentarios esté desactualizada (y por lo tanto, incorrecta).Sé que ha sido respondida hace un tiempo, pero "PhoneGap.available" ya no existe. Deberías usar:
o desde 1.7, prefiera:
EDITAR 2019: como se dijo en los comentarios, esto solo funciona si no incluye cordova lib en la compilación de su navegador de escritorio. Y, por supuesto, es una buena práctica incluir solo los archivos javascript / html / css mínimos estrictos para cada dispositivo al que se dirija
fuente
La forma más confiable que encontramos para saber si estamos en una aplicación cordova / phonegap es modificar el agente de usuario de la aplicación cordova usando esta configuración AppendUserAgent .
Además
config.xml
:Luego llame:
¿Por qué?
window.cordova
ydocument.addEventListener('deviceready', function(){});
están sujetos a condiciones de carreranavigator.standalone
no funciona cuando<content src="index.html" />
es un sitio web (ej .:<content src="https://www.example.com/index.html" />
o con cordova-plugin-remote-injection )fuente
Cordova AppName/v0.0.1
<3 Entonces, de esta manera, incluso puede usar esto de alguna manera para el seguimiento (pero tenga en cuenta que cualquiera puede modificar su agente de usuario, así que no confíe en esto para verificaciones críticas de seguridad)Creo que esto es lo más simple:
var isPhoneGap = (location.protocol == "file:")
EDITAR Para algunas personas que no funcionó. Entonces podrías intentarlo (no lo he probado)
fuente
var isPhoneGap = ! /^http/.test(document.location.protocol)
Esto funciona para mí (ejecutando 1.7.0)
Probado en Chrome y Safari de escritorio.
fuente
Al igual que el póster original, estoy usando el servicio de compilación de phonegap. Después de dos días y casi 50 compilaciones de prueba, he encontrado una solución elegante que funciona muy bien para mí.
No pude usar UA sniffing porque quería probar y ejecutar en navegadores móviles. Originalmente me había decidido por la técnica bastante funcional de cobberboy. Esto no funcionó para mí porque el retraso / tiempo de espera de "howPatientAreWe: 10000" era demasiado molesto para el desarrollo en el navegador. Y configurarlo más bajo ocasionalmente fallaría la prueba en el modo de aplicación / dispositivo. Tenía que haber otra manera...
El servicio de compilación de phonegap requiere que el
phonegap.js
archivo se omita de su repositorio de código antes de enviar los archivos de su aplicación al servicio. Por lo tanto, puedo probar su existencia para determinar si se ejecuta en un navegador o en una aplicación.Otra advertencia, también estoy usando jQueryMobile, por lo que tanto jQM como phonegap tuvieron que inicializarse antes de que pudiera comenzar cualquier script personalizado. El siguiente código se coloca al comienzo de mi archivo index.js personalizado para la aplicación (después de jQuery, antes de jQM). Además, los documentos de compilación de phonegap dicen que se coloque
<script src="phonegap.js"></script>
en algún lugar del HTML. Lo dejo completamente y lo cargo usando $ .getScript () para probar su existencia.fuente
Curiosamente, muchas respuestas, pero no incluyen estas tres opciones:
1: cordova.js establecerá el objeto cordova en el ámbito global. Si está allí, lo más probable es que se esté ejecutando en un ámbito de Cordova.
2 - Cordova ejecutará su aplicación como abriría un documento HTML desde su escritorio. En lugar del protocolo HTTP, utilizará FILE. Detectar esto le dará la oportunidad de asumir que su aplicación se cargó localmente.
3 - Utilice el evento de carga del script cordova para detectar el contexto. El script incluido se puede eliminar fácilmente en el proceso de compilación o la carga del script simplemente fallará en un navegador. Para que no se establezca esta variable global.
El crédito es para Damien Antipa de Adobe
fuente
Yo uso este método:
debug
estarátrue
en el entorno del navegador,false
en el dispositivo.fuente
Esto parece ser viable y lo he usado en producción:
Fuente: http://tqcblog.com/2012/05/09/detecting-phonegap-cordova-on-startup/
fuente
La esencia del problema es que mientras cordova.device no esté definido, su código no puede estar seguro si es porque cordova ha establecido que su dispositivo no es compatible, o si es porque cordova todavía se está preparando y deviceready se activará más tarde. (o tercera opción: cordova no se cargó correctamente).
La única solución es definir un período de espera y decidir que después de este período su código debe asumir que el dispositivo no es compatible. Me gustaría que cordova estableciera un parámetro en algún lugar para decir "Intentamos encontrar un dispositivo compatible y nos rendimos", pero parece que no existe tal parámetro.
Una vez establecido esto, es posible que desee hacer algo específico precisamente en aquellas situaciones en las que no hay un dispositivo compatible. Como ocultar enlaces al mercado de aplicaciones del dispositivo, en mi caso.
He reunido esta función que debería cubrir prácticamente todas las situaciones. Le permite definir un controlador listo para el dispositivo, un controlador que nunca está listo y un tiempo de espera.
fuente
La forma en que lo estoy haciendo es usando una variable global que está sobrescrita por una versión de cordova.js solo para navegador. En su archivo html principal (normalmente
index.html
) tengo los siguientes scripts que dependen del orden:Y por dentro
cordova.js
tengo simplemente:Al compilar para un dispositivo móvil, no se usará cordova.js (y en su lugar se usará el archivo cordova.js específico de la plataforma), por lo que este método tiene la ventaja de ser 100% correcto independientemente de los protocolos, agentes de usuario o biblioteca variables (que pueden cambiar). Puede haber otras cosas que debería incluir en cordova.js, pero todavía no sé cuáles son.
fuente
if ( typeof __cordovaRunningOnBrowser__ !== 'undefined' ) { stuff(); }
... ¿verdad?Otra forma, basada en la solución de SlavikMe:
Simplemente use un parámetro de consulta pasado a
index.html
desde su fuente PhoneGap. Es decir, en Android, en lugar deutilizar
SlavikMe tiene una gran lista sobre dónde hacer esto en otras plataformas.
Entonces
index.html
puedes simplemente hacer esto:fuente
<content src="index.html" />
opción en el archivo config.xml a<content src="index.html?cordova=1" />
. Hasta ahora parece funcionar y es, con mucho, la mejor solución sugerida aquí.Para mantener una base de código, lo que interesa es la "plataforma" en la que se ejecuta el código. Para mí, esta "plataforma" puede ser tres cosas diferentes:
La forma de verificar la plataforma:
Nota:
Esto debe ejecutarse solo después de que se haya cargado cordova.js (body onload (...), $ (document) .ready (...))
'ontouchstart' en document.documentElement estará presente en las computadoras portátiles y monitores de escritorio que tienen una pantalla táctil, por lo que informará un navegador móvil aunque sea un escritorio. Hay diferentes formas de hacer una verificación más precisa, pero la uso porque todavía se ocupa del 99% de los casos que necesito. Siempre puedes sustituir esa línea por algo más robusto.
fuente
typeof cordova !== 'undefined'
lugar de pescar una excepción.Aarons, prueba
fuente
La solución de GeorgeW está bien, pero incluso en un dispositivo real, PhoneGap.available solo es verdadero después de que se hayan cargado las cosas de PhoneGap, por ejemplo, onDeviceReady en document.addEventListener ('deviceready', onDeviceReady, false) ha sido llamado.
Antes de ese momento, si quieres saber, puedes hacer así:
Esta solución asume que la mayoría de los desarrolladores desarrollan usando Chrome o Firefox.
fuente
Tengo el mismo problema.
Me inclino a agregar # cordova = true a la URL cargada por el cliente cordova y probar location.hash.indexOf ("cordova = true")> -1 en mi página web.
fuente
Lo siguiente funciona para mí con el PhoneGap / Cordova más reciente (2.1.0).
Cómo funciona:
Ventajas:
Desventajas:
==
Cree un nuevo proyecto PhoneGap en blanco. En el index.js de muestra proporcionado, reemplace la variable "aplicación" en la parte inferior con esto:
fuente
Me encontré con este problema hace varios meses al comenzar nuestra aplicación, porque queríamos que fuera "
browser-compatible
" (entendiendo que algunas funciones se bloquearían en ese escenario: grabación de audio, brújula, etc.).La única
100%
solución (e insisto en la condición del 100%) para PRE-determinar el contexto de ejecución de la aplicación fue esta:inicializar una variable de "bandera" JS a verdadero, y cambiarlo a falso cuando en un contexto de toda la web;
por lo tanto, puede usar una llamada como "
willIBeInPhoneGapSometimesInTheNearFuture()
" (eso es PRE-PG, por supuesto, todavía necesita un método POST-PG para verificar si puede llamar a las API de PG, pero ese es trivial).Entonces dices: "
but how do you determine the execution context
?"; la respuesta es: "tú no" (porque no creo que puedas hacerlo de manera confiable, a menos que esa gente brillante de PG lo hiciera en su código API);escribe un script de compilación que lo hace por usted: una base de código con dos variantes.
fuente
No es realmente una respuesta a la pregunta, pero cuando pruebo en un navegador de escritorio, simplemente establezco un valor de almacenamiento local para que el navegador cargue la aplicación a pesar de que el dispositivo ya no se enciende.
fuente
Otra opción sería usar fusiones carpeta de , vea la captura de pantalla a continuación.
Puede agregar archivos específicos de la plataforma / anular los predeterminados.
(debería funcionar en algunos escenarios)
En otras palabras: en lugar de detectar el navegador, simplemente no incluye ciertos archivos para la compilación de escritorio / adjunta ciertos archivos solo para iOS.
fuente
Detecta el navegador de escritorio incluso si el dispositivo de emulación está activo
Funciona en máquinas Windows y Mac. Necesito encontrar una solución para linux Ver detalles
fuente
De hecho, he encontrado que una combinación de dos de las técnicas enumeradas aquí ha funcionado mejor, en primer lugar, compruebe que se puede acceder a cordova / phonegap y compruebe si el dispositivo está disponible. Al igual que:
fuente
Prueba este enfoque:
fuente
Utilizo una combinación de lo que sugirieron GeorgeW y mkprogramming :
fuente
Supongo que de alguna manera no son tan diferentes, ¿verdad? Ja, ja ... no es gracioso. ¿Quién no pensó que esto no sería un problema? Aquí está la solución más simple para sus consideraciones. Envíe diferentes archivos a su servidor y luego a PhoneGap. También iría temporalmente con el http: check sugerido anteriormente.
Mi interés es subir la barra de navegación del navegador, así que realmente puedo eliminar la etiqueta del script aislado y presionar reconstruir [en DW] (de todos modos habrá una limpieza para la implementación, por lo que esta puede ser una de esas tareas). es una buena opción (considerando que no hay mucho más disponible) para comentar las cosas manualmente de manera eficiente con isMobileBrowserAndNotPhoneGap al presionar a PG). De nuevo, para mí, en mi situación, simplemente eliminaré la etiqueta del archivo (código aislado) que empuja hacia arriba la barra de navegación cuando es un navegador móvil (será mucho más rápido y más pequeño). [Entonces, si puede aislar el código para esa solución optimizada pero manual.]
fuente
Ligeramente modificado, pero me funciona perfectamente sin problemas.
La intención es cargar Cordova solo cuando esté en un dispositivo integrado, no en un escritorio, por lo que evito completamente Cordova en un navegador de escritorio. Probar y desarrollar la interfaz de usuario y MVVM es muy cómodo.
Pon este código, por ejemplo. en el archivo cordovaLoader.js
Luego, en lugar de incluir cordova javascript, incluya cordovaLoader.js
¡Facilita tu trabajo! :)
fuente
fuente
Solo para obtener información, en PhoneGap 3.x Hotshot de desarrollo de aplicaciones móviles
y en el marco YASMF
https://github.com/photokandyStudios/YASMF-Next/blob/master/lib/yasmf/util/core.js#L152
fuente
Estaba intentando con los objetos de la ventana pero no funcionó porque estaba abriendo la URL remota en el InAppBrowser. No pude hacerlo. Entonces, la mejor y más fácil forma de lograrlo fue agregar una cadena a la URL que debe abrir desde la aplicación phonegap. Luego, verifique si la ubicación del documento tiene una cadena adjunta.
Verá que se agrega una cadena a la URL "#phonegap". Por lo tanto, en la URL del dominio agregue el siguiente script
fuente