Saltar al contenido

¿Alguna forma de actualizar automáticamente (o simplemente borrar el caché) un PWA en iOS?

Agradecemos tu ayuda para extender nuestras reseñas referente a las ciencias de la computación.

Solución:

Después de semanas y semanas de búsqueda, finalmente encontré una solución:

  1. Agrego una verificación de cadena de versión en el servidor y la devuelvo a la aplicación como se mencionó anteriormente.

  2. Lo busco en localtstorage (IndexedDB) y si no lo encuentro lo agrego. Si lo encuentro, comparo las versiones y, si hay una más nueva en el servidor, abro un cuadro de diálogo.

  3. Descartar este cuadro de diálogo (mi botón tiene la etiqueta “actualizar”) se ejecuta window.location.reload(true) y luego almacena la nueva cadena de versión en almacenamiento local

¡Voila! ¡Mi aplicación está actualizada! No puedo creer que se haya reducido a algo tan simple, no pude encontrar una solución en ningún lado. ¡Espero que esto ayude a alguien más!

ACTUALIZACIÓN DE SEPTIEMBRE DE 2019:

Hubo algunos problemas con la técnica anterior, en particular, que estaba pasando por alto los mecanismos de trabajador de servicio de PWA y que, a veces, la recarga no cargaba contenido nuevo de inmediato (porque el SW actual no liberaba la página). Ahora tengo una nueva solución para esto que parece funcionar en todas las plataformas:

forceSWupdate () 
  if ('serviceWorker' in navigator) 
    navigator.serviceWorker.getRegistrations().then(function (registrations) 
      for (let registration of registrations) 
        registration.update()
      
    )
  

Y dentro de mi serviceworker ahora lanzo el diálogo si hay una actualización, y hago mi location.reload(true) desde allí. Esto siempre da como resultado que mi aplicación se actualice de inmediato (con la importante advertencia de que he agregado skipWaiting y clientsClaim directivas a mi registro).

Esto funciona en todas las plataformas de la misma manera, y puedo verificar mediante programación la actualización o esperar a que el trabajador del servicio lo haga por sí mismo (aunque los tiempos de verificación varían mucho según la plataforma, el dispositivo y otros factores desconocidos. Por lo general, no más de 24 aunque horas).

Si alguien todavía tiene problemas con esto, registration.update() no funcionó para mí. Utilicé la solución exacta, pero cuando la versión de mi servidor no coincidía con mi versión local almacenada, tuve que anular el registro de los trabajadores del servicio para que funcionara.

  if ('serviceWorker' in navigator) 
   await this.setState( loadingMessage: 'Updating Your Experience' )
   navigator.serviceWorker.getRegistrations().then(function(registrations) 
    registrations.map(r => 
      r.unregister()
    )
   )
   await AsyncStorage.setItem('appVersion', this.state.serverAppVersion)
   window.location.reload(true)
   

Luego, cuando la aplicación se vuelve a cargar, el trabajador del servicio se vuelve a registrar y la versión actual de la aplicación es visible en los navegadores Safari de iOS y en las PWA ‘marcadas’.

Reseñas y valoraciones

Si eres capaz, eres capaz de dejar un post acerca de qué te ha parecido esta crónica.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *