2012-09-19 42 views
24

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 y como una aplicación web (usando la metaetiqueta compatible con apple-mobile-web-app).iOS 6 rompe GeoLocation en webapps (apple-mobile-web-app-capable)

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.

+0

Acabo de actualizar a iOS 6.1.1 y esto todavía parece ser un problema. – bjudson

Respuesta

0

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.

El uso de estas muestras: http://www.w3schools.com/html/html5_geolocation.asp

puedo obtener los resultados esperados en IOS5 pero iOS6 dejará caer el balón con watchPosition.

+0

Estoy planteando el problema en el foro de Apple Dev para ver si alguien tiene alguna buena información. – Morgan

+0

Acabo de visitar la URL anterior de mi dispositivo. Se está ejecutando iOS 6 y cuando hice clic en "Pruébalo" muestra un mapa. ¿Se suponía que debía hacer algo más? –

+0

Pruebe el objeto de Geolocalización - Otros métodos interesantes - y camine ... lo que debería ver es que los cordones de posición cambian ligeramente a medida que se mueve. – Morgan

13

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

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

Sí, esto significa que no va a ser una verdadera aplicación web y obtendrá la cabecera Safari y barras de pie de página. 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 al 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!

+1

Sí, eso es lo que hice por ahora. Acabo de eliminar la metaetiqueta apple-mobile-web-app-capable, por lo que aunque la geolocalización ahora funciona, no obtengo los beneficios visuales de una verdadera aplicación web sin Chrome de iOS. Sospecho que muchos otros tropezarán con esto en los próximos días. Gracias por tu sugerencia. –

0

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.

1

Parece que solo funciona una vez, y luego las llamadas secundarias fallan. 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.

1

Esto 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" />

iOS 6 Geolocation and Local Data Storage

"Datos en Inicio aplicaciones de pantalla se almacenan ahora como aplicaciones nativas. Las aplicaciones nativas cada uno tiene su propia caja de arena donde se almacena sus datos, copia de seguridad y restaurado a. Antes de iOS 6, las aplicaciones de la pantalla de inicio compartieron datos con la misma aplicación que se ejecuta en el navegador. Si el usuario borró la 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 guardado en un sandbox al igual que las aplicaciones nativas. Las copias de seguridad y restauraciones manejan los datos correctamente, y borrar el caché en el navegador no lo hará afectarlos ".

2

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 - IOS 6.1 Beta 3 pruebas muestran el fallo todavía no se ha resuelto ...

Actualización: 122012 - IOS 6.1 Beta 4 pruebas muestran el fallo todavía no se ha resuelto .. .


actualización: 031113 - Ejemplo de replicación

está bien, es un problema simple para 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. El uso de un dispositivo IOS entra aquí:

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

Haga clic en Inicio, reloj debe volver resultado casi cada segundo. Luego haga clic en el enlace de Google para salir de esta página. A continuación, botón de retroceso del navegador del usuario para devolver Haga clic en Inicio. El reloj devolverá de 1 a 3 registros y se bloqueará. Minimiza safari (botón de inicio) y luego restaura (icono de safari); deja de colgar

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

Marcos

ACTUALIZACIÓN:

IOS 7.1 ha solucionado el problema ...

+0

El enlace parece estar roto –

3

La buena noticia es: lo he hecho ... 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 tan consistentemente si la ejecución de este código se retrasa en algún momento después del lanzamiento inicial de 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í, tiene lugar después de la inicialización de varias otras clases/objetos literales), es verificar para los valores de latitud/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. Una vez dicho esto, he probado esto cientos de veces y esto recupera con éxito la ubicación de los usuarios en una aplicación web (navigator.standalone) en iOS 6.

+0

¡esto es excelente! ya que ioS 6.1 todavía tiene errores con la geolocalización ¿alguien tiene un ejemplo de lo anterior para ejecutar en modo watchPosition? – ajayel

0

¡Parece que esto está solucionado en iOS 6.1! No estaba en las versiones beta recientes, pero el lanzamiento final de 6.1 parece ser bueno con mis pruebas.

+0

Ok, no está 100% arreglado. Estoy obteniendo un evento de ubicación inicial que no estaba sucediendo antes de 6.1, pero no estoy obteniendo eventos posteriores de relocalización. Solo estoy obteniendo el primero. Trabajaré en soluciones alternativas y volveré a este hilo en breve (soy el póster original) –

+0

Con iOS 6.1 en mi iPhone 4s, puedo obtener watchPosition de manera confiable solo si Wi-Fi está apagado cuando inicio mi aplicación web . – ajayel

0

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

0

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

0

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