services pwa para espaƱol app iphone ipad ios6 geolocation iphone-standalone-web-app

iphone - pwa - iOS 6 rompe GeoLocation en webapps(apple-mobile-web-app-capable)



progressive web app ios (11)

Tengo una aplicación que hace un simple libro de texto navigator.geoLocation.watchPosition (...) que funciona muy bien en iOS 5.x tanto en Safari como en una aplicación web (usando la metaetiqueta compatible con Apple-mobile-web-app).

Sin embargo, en iOS6, GeoLocation no funciona en la aplicación web. Todavía funciona en safari como se esperaba, pero cuando ejecuto la aplicación web, me pide permiso de ubicación y luego falla silenciosamente. Veo el ícono de ubicación, pero no se lanzan eventos desde watchLocation. No recibo eventos de error ni eventos de ubicación.

¿Alguien ha topado con esto? ¿Alguna solución? Definitivamente es iOS6 específico y también específico para apple-mobile-web-app-capable / webapp.


¡Esto está FINALMENTE corregido en iOS7 beta (beta 2 es todo lo que he probado)!


¡Esto parece estar arreglado en iOS 6.1! No estaba en las versiones beta recientes, pero el lanzamiento final de 6.1 parece ser bueno con mis pruebas.


Debe ocuparse de cargar contenido no seguro. Para mí, cargar todo javascript, imágenes y css desde un contexto seguro resolvió el problema con Safari.


Esta no es exactamente una respuesta, ya que parece que las aplicaciones de la pantalla de inicio en ios6 tienen algunos errores relacionados con GeoLocation, pero el siguiente enlace me pareció muy útil. Explica que, como las aplicaciones de la pantalla de inicio ahora se almacenan como aplicaciones nativas, tienen su propio almacenamiento / almacenamiento en caché.

La geolocalización funciona en la primera iteración pero no se actualiza a partir de ese momento. La solución alternativa es eliminar la siguiente metaetiqueta para que la aplicación Home Screens se ejecute en modo Navegador (no estoy seguro de si se trata exactamente de llamar al modo Navegador). La aplicación se renderizará desafortunadamente con los encabezados y pies de página del navegador, pero GeoLocation funcionará nuevamente.

<meta content="yes" name="apple-mobile-web-app-capable" />

Geolocalización iOS 6 y almacenamiento de datos locales

"Los datos en las aplicaciones de la pantalla de inicio ahora se almacenan como aplicaciones nativas. Cada aplicación nativa tiene su propio espacio de pruebas donde almacenar, respaldar y restaurar datos. Antes de iOS 6, las aplicaciones de la pantalla de inicio compartían datos con la misma aplicación ejecutándose en el navegador Si el usuario borró el caché en el navegador, la versión de la pantalla de inicio de la aplicación también perdería sus datos. Con iOS 6, los datos de las aplicaciones de la pantalla de inicio se guardan en un entorno similar a las aplicaciones nativas. Las copias de seguridad y restauraciones manejan los datos correctamente y borrar el caché en el navegador no los afectará ".


Esto es definitivamente un error, pero encontré un trabajo alternativo. No te va a gustar esto, pero al menos hará que tu aplicación web vuelva a funcionar. Necesita examinar el encabezado Agente de usuario y si contiene "iPhone OS 6", entonces no use:

<meta content="yes" name="apple-mobile-web-app-capable" />

Sí, esto significa que no será una aplicación web verdadera y obtendrá las barras de encabezado y pie de página de Safari. Pero al menos hará que tu aplicación vuelva a funcionar desde la pantalla de inicio. Puede ver cómo funciona esto yendo a mi sitio www.nextbus.com .

Tenga en cuenta que parece que Google se encontró con este problema. Intenta ir a maps.google.com y luego agrega la aplicación web a tu pantalla de inicio. La geolocalización funcionará, pero verás las feas barras de encabezado y pie de página de Safari.

¡Por favor, quejarse en voz alta a Apple!


Estoy teniendo el mismo problema. Parece que watchPosition simplemente falla después de que se recibe la primera posición. Todavía no he encontrado una solución, pero quería confirmar que estaba teniendo problemas.

Usando estas muestras: http://www.w3schools.com/html/html5_geolocation.asp

Obtuve los resultados esperados en ios5 pero ios5 deja caer la bola con watchPosition.


La buena noticia es: lo he hecho ... lo he descubierto. La mala noticia es que alguien más inteligente que yo tendrá que decirte por qué funciona, mientras que cualquier otra variación de esta solución o cualquiera de las otras ofrecidas no funcionará. Esta fue una victoria muy reñida, pero estoy demasiado avergonzado para decir cuántas horas (días) me tomó resolver esto. Sin más preámbulos:

if (window.navigator.geolocation) { var accuracyThreshold = 100, timeout = 10 * 1000, watchID = navigator.geolocation.watchPosition(function(position) { $(''#latitude'').val(position.coords.latitude); // set your latitude value here $(''#longitude'').val(position.coords.longitude); // set your longitude value here // if the returned distance accuracy is less than your pre-defined accuracy threshold, // then clear the timeout below and also clear the watchPosition to prevent it from running continuously position.coords.accuracy < accuracyThreshold && (clearTimeout(delayClear), navigator.geolocation.clearWatch(watchID)) }, function(error) { // if it fails to get the return object (position), clear the timeout // and cancel the watchPosition() to prevent it from running continuously clearTimeout(delayClear); navigator.geolocation.clearWatch(watchID); // make the error message more human-readable friendly var errMsg; switch (error.code) { case ''0'': errMsg = ''Unknown Error''; break; case ''1'': errMsg = ''Location permission denied by user.''; break; case ''2'': errMsg = ''Position is not available''; break; case ''3'': errMsg = ''Request timeout''; break; } }, { enableHighAccuracy: true, timeout: timeout, maximumAge: 0 }), delayClear = setTimeout(function() { navigator.geolocation.clearWatch(watchID); }, timeout + 1E3); // make this setTimeout delay one second longer than your watchPosition() timeout } else { throw new Error("Geolocation is not supported."); }

Nota: por alguna razón, esto no parece funcionar de manera uniforme si la ejecución de este código se retrasó en algún momento después de iniciar inicialmente la aplicación. Entonces, esto es lo PRIMERO que ejecuto en mi método de inicialización.

Nota: La única otra cosa que agregué a mi aplicación es que, cuando necesito utilizar los datos de geolocalización (que, para mí, se lleva a cabo después de la inicialización de varias otras Clases / Literales de objetos), es verificar la latitud / valores de longitud. Si existen, continúa; De lo contrario, ejecute el método de geolocalización anterior nuevamente, luego continúe.

Nota: Una de las cosas que me causó mucho tiempo fue que solo necesitaba obtener la posición actual del usuario. No necesité seguir los movimientos de los usuarios. Seguí probando diferentes iteraciones de esto con el método getCurrentPosition (). Por alguna razón, no funciona. Entonces, esta es la solución que se me ocurrió. Ejecútelo como si fuera a rastrear la ubicación de los usuarios (para obtener su ubicación en primer lugar), luego, una vez que haya obtenido su ubicación, borre la ID de watchPosition para evitar que los rastree. Si necesita rastrear su ubicación ya que cambia con el tiempo, puede, por supuesto ... no borrar la ID de watchPosition.

HTH. De todo lo que he estado leyendo, hay muchos desarrolladores que necesitan esta funcionalidad para trabajar con sus aplicaciones de misión crítica. Si esta solución no funciona para usted, no estoy seguro de qué otra dirección pueda darle. Habiendo dicho eso, he probado esto varias cientos de veces y esto recupera con éxito la ubicación de los usuarios en una aplicación web (navigator.standalone) en iOS 6.


Parece que solo funciona una vez, luego cualquier llamada secundaria falla. Una alternativa es almacenar en caché el resultado y usar el resultado en caché si tiene uno, aunque esto significa que no puede tener una aplicación que siga la posición de alguien.


Puedo confirmar que tengo el mismo problema al ejecutar mi aplicación web en pantalla completa.

Curiosamente, cuando Safari en pantalla completa me pidió permiso para usar mi ubicación, el título del sitio web era ''web'' en lugar del título del sitio web, como en versiones anteriores de iOS.

La eliminación de la metaetiqueta "apple-mobile-web-app-capable" está bien, y funciona, pero solo si vuelve a "Agregar a la pantalla de inicio". Tenemos ~ 7000 usuarios diarios que ya han agregado nuestro ícono a su pantalla de inicio. Hacer que lo hagan de nuevo, y luego potencialmente cuando se implementa una solución no es genial.


aquí hay un video de mí replicando el error y demostrando una solución alternativa. Parece que este error existe si usa la metaetiqueta de la aplicación web o no.

http://youtu.be/ygprgHh6LxA

Actualización: 121212 - La prueba IOS 6.1 Beta 3 muestra que el error aún no se ha resuelto ...

Actualización: 122012 - La prueba IOS 6.1 Beta 4 muestra que el error aún no se ha resuelto ...

Actualización: 031113 - Ejemplo de replicación

De acuerdo, es un problema simple de replicar en solo unos segundos. Siento que no es un safari, sino un problema de IOS. Es casi como si Google escribiera la biografía del IOS para cumplir con la especificación de ubicación geográfica de WC3 html y la llevó consigo cuando IOS6 los echó del autobús. Usando un dispositivo IOS ve aquí:

http://uc.myaesc.com/geoloctestorig.htm

Haga clic en iniciar, el reloj debería devolver el resultado casi cada segundo. Luego haga clic en el enlace de Google para salir de esta página. Luego, el botón atrás del navegador del usuario para regresar Haga clic en Inicio. Watch devolverá de 1 a 3 registros y se colgará. Minimice safari (botón de inicio) y luego restaure (icono de safari); deja de colgar

Eso es. hasta que no cuelgue, el problema persiste.

marca

ACTUALIZAR:

IOS 7.1 solucionó el problema ...


parece estar arreglado en iOS 6.1, finalmente! Ver mi sitio www.slople.com donde funciona nuevamente en 6.1