Estamos creando aplicaciones web para el iPhone que funcionan sin conexión. Pero estamos teniendo dificultades para almacenar imágenes dinámicas en caché. Siga leyendo y mostraré con ejemplos exactamente lo que quiero decir y lo que hemos hecho hasta ahora.HTML5 iPhone caché dinámico de imágenes
Por ejemplo, digamos que estamos construyendo una aplicación de lista simple con solo 1 página. El único propósito de la aplicación es enumerar 5 elementos, cada elemento que contiene texto y 1 imagen.
La aplicación tiene un logotipo simple y algunos códigos JavaScript y CSS separados. Estos recursos estáticos se almacenan en caché utilizando el archivo de manifiesto de caché.
hay 2 escenario de:
Escenario 1: Estoy en línea y abro la aplicación web
Cuando cargo la aplicación de lista en Safari se ha podido ir a 5 nuevos artículos al azar de cada una base de datos que contiene 1000 de artículos. Todos son servidos por backend simple a través de una llamada AJAX (formato JSON).
Todo el objeto JSON que contiene los 5 elementos se almacena inmediatamente en el almacenamiento local HTML5 y se almacena en caché para su uso sin conexión.
Estructura del objeto JSON es un poco como esto:
{
"0" : {
id: "3",
text: "Some text about item #3",
image_url: "http://www.domain.com/image22341.png"
},
"1" : {
id: "23",
text: "Some text about item #23",
image_url: "http://www.domain.com/image442321.png"
},
"2" : {
id: "4",
text: "Some text about item #4",
image_url: "http://www.domain.com/image2321.png"
},
"3" : {
id: "432",
text: "Some text about item #432",
image_url: "http://www.domain.com/image2441.png"
},
"4" : {
id: "43",
text: "Some text about item #43",
image_url: "http://www.domain.com/image221.png"
}
}
Como se puede ver, muy simple (puede haber algunos errores en que JSON), todo el objeto JSON se almacena en el almacenamiento local.
Ahora los 5 elementos se representan con JavaScript inyectado HTML (estilo con CSS), nada sofisticado. Las etiquetas de expansión que contienen las etiquetas de texto e imagen que apuntan al recurso de imagen se crean, etc.
En el modo en línea, todo funciona muy bien.
Escenario 2: No estoy conectado y abro la aplicación web
Las página se carga (se muestra el logotipo, ya que se almacena en caché como un recurso estático mediante el manifiesto de caché), algo de JavaScript que detecta de hecho estamos fuera de línea y la aplicación como resultado no intenta contactar al back-end. En su lugar, lee el objeto JSON previamente almacenado del almacenamiento local y comienza a renderizar los 5 elementos. Todo como se anticipó.
El texto se muestra bien, pero esta vez, las imágenes no se muestran, razón por la cual es simple, las etiquetas de imagen apuntan a recursos de imágenes que no están disponibles. Por lo tanto, muestra ese pequeño icono de imagen no disponible.
Ahora mi pregunta es, ¿hay alguna forma de almacenar en caché esos recursos de imágenes de alguna manera? Para que la próxima vez que los necesitemos, se obtengan de la memoria caché.
Esto es lo que he intentado:
- Base64 codificar las imágenes y suministrarlos a través de JSON. Esto funciona, PERO, aumenta drásticamente tanto el tiempo de búsqueda como el de renderizado (estamos hablando de un aumento de 30 segundos, muy lento)
- Caché de manifiesto de algunos caché/prueba y error.no pude encontrar nada que funcione (idealmente necesito una política que 'cache todos los recursos en el dominio tal como se solicitan', pero que yo sepa esto no existe)
Literalmente he pasado horas en esto y puedo no encuentras una solución ... ¿Alguien tiene una pista? Sé que esto es posible porque si miras la aplicación HTML5 de Google Mail para el iPhone, de alguna manera pueden almacenar en caché los archivos adjuntos y puedes recuperarlos incluso sin conexión.
Lo único que no hemos intentado es utilizar las bases de datos SQLite que son compatibles con Safari ... ¿tal vez podría almacenar las imágenes como BLOB (todavía significa recuperarlo de la fuente y por lo tanto ralentizar?) Y luego de alguna manera mágicamente convirtiendo eso en una imagen en la pantalla ... pero no tengo idea de cómo hacer esto.
Se agradece cualquier ayuda, gracias.
Gracias por su respuesta - que hacen un buen punto allí no había pensado en hacer eso. Estoy familiarizado con el elemento canvas, así que debería poder probarlo pronto. Ahora esperemos que los lienzos múltiples funcionen de forma aceptable en el iPhone. Informaré aquí con resultados más adelante. –
he actualizado mi publicación con otra información sobre esto. – RobertPitt
Gracias, el segundo enlace era exactamente lo que quería ...parece que almacenan el elemento canvas en serie generando una representación base64. Y para mostrar imágenes almacenadas en caché, crean un objeto Imagen que apunta a la cadena base64 (del DB) preestablecida por "data: base64", este objeto Image se dibuja en el lienzo. Muchas gracias por tu ayuda otra vez. –