2011-11-02 13 views
10

He creado una aplicación de Internet que se puede guardar en la "Pantalla de inicio" en el iPhone. La aplicación usa un lienzo y es bastante interactiva con el cambio de estado.iPhone WebApp en Persistencia de pantalla de inicio

Cada vez que se minimiza la aplicación y se vuelve a abrir, se restablece al estado inicial. Lo mismo (como se esperaba) al cerrar la aplicación y volver a cargarla.

  1. ¿Cómo puedo evitar que la aplicación se vuelva a cargar cuando se reduce al mínimo?

  2. ¿Cuál es la mejor manera de conservar los datos de estado para que cuando la aplicación se cierre y se vuelva a abrir , continúe sin interrupciones?

  3. ¿Qué eventos necesitaría usar para garantizar que no se pierdan los datos de estado?

Si es posible una solución multiplataforma sería preferible iPhone + Android ...

Respuesta

8

TL; DR Deberá diseñar su aplicación para usar almacenamiento local o cookies o algún otro mecanismo con el que pueda preservar el estado. Tendrá que mirar este almacenamiento local y reconstruir su interfaz cada vez que se lance. Al usar almacenamiento local o webdb (depreciado pero admitido), deberá guardar cada cambio de estado y asegurarse de volver a cargarlos cuando su página se cargue en el navegador.

  1. ¿De definir minimiza? Corriendo en el fondo?

    Su webapp, independientemente de su estado en la pantalla de inicio, es simplemente otra página cargada en el navegador. Debido a a) la falta de memoria en el dispositivo yb) cómo funciona la multitarea, el sistema operativo puede solicitar a las aplicaciones que liberen memoria o incluso que se desconecten en cualquier momento.

    Esta es la razón cuando se está construyendo una aplicación para iOS que tenga:

    - (void)applicationWillTerminate:(UIApplication *)application

    Este método le permite, como el desarrollador, para especificar un comportamiento a utilizar (como guardar los datos del usuario) antes su aplicación termina cuando recibe la señal de terminación del sistema operativo. Esta es también la razón por la que las guías para desarrolladores de iOS le piden que conserve el estado y siempre se asegura de que su estado se restaure cuando una aplicación se pone en primer plano. (Es posible que los usuarios no sepan que una aplicación ha finalizado, ya que aún aparecerá en la lista de "aplicaciones en ejecución" cuando haga doble clic en la página de inicio).

    Ahora entiendo que estás hablando de una aplicación web, pero esto es importante.Las páginas web, y estoy seguro de que también son suyas, ocupan algo de memoria en el teléfono: tienen el DOM, todos los recursos, información sobre el estado en cuanto a dónde está la página y qué widgets están configurados para qué. Usted dice que su aplicación es bastante interactiva usando el lienzo y esas cosas, estoy seguro de que ocupa mucha memoria.

    Así que cuando pone Safari en segundo plano, lo más probable es que Safari destruya su caché en memoria.

  2. Safari tiene acceso tanto al almacenamiento local como a los datos de cookies. iOS5 también tiene acceso a WebSQL (pero no IndexedDB, lo cual es triste porque WebSQL está depreciado). Elige tu veneno

  3. Deberá guardar siempre el estado. Como no tiene acceso a los métodos UIApplicationDelegate a través de JS, cada vez que el usuario haga algo, deberá guardar ese cambio de estado. Y cada vez que su página se vuelve a cargar, necesita verificar si hay un estado persistente y volver a cargar desde la opción de almacenamiento que ha elegido.

+0

yep, minimized = ejecutándose en segundo plano. Si tuviera que crear una aplicación nativa para iPhone, ¿es posible que JavaScript se comunique con ObjectiveC nativo (y viceversa)? Por ejemplo, si tuviera que usar 'UIWebView'. Pensé que se suponía que era fácil crear aplicaciones web para iphone + Android, pero parece que hay algunas trampas bastante importantes. –

+0

Si se está ejecutando en un sitio web, no es una aplicación nativa, lo que significa que tiene que manejar cosas fuera del contexto del marco de aplicaciones nativas. Es "fácil" pero requiere atención específica sobre cómo los teléfonos manejan las vistas web dentro de las aplicaciones. – tkone

+0

Presumiblemente 'stringByEvaluatingJavaScriptFromString' se puede usar para ejecutar funciones desde el contexto de UIWebView? Entonces, si tuviera que invocar esa función una vez por segundo podría recuperar un nombre de acción/params como una cadena codificada y luego responder al usuario según sea necesario. ¿Qué permitiría que JavaScript desde la vista web notifique el código de la aplicación nativa ... o hay un mejor enfoque? Aprecio tu comprensión gracias –

1

Si guarda el estado actual mediante la API de almacenamiento local y restauración de esta API de la carga, usted debería ser capaz de recrear el estado de la aplicación.

recomiendo esta página para una visión general de la API de almacenamiento local: http://diveintohtml5.info/storage.html

Me temo que tendrá problemas para la prevención de la aplicación/página web en la memoria cuando se está en el fondo, pero el almacenamiento de forma continua el estado de localStorage y recuperar el estado cuando se cargan las páginas (window.onload o $ (document) .ready()) sería una solución.

0
  1. No creo que se puede
  2. soporta WebKit almacenamiento de datos HTML 5 del lado del cliente, que se puede utilizar
  3. No sé acerca de cualquier manera su webApp conseguiría notificado el cierre, por lo Intente guardar el estado actual después de cada paso en su navegación, etc. (Background behavior for iOS Web App (so app doesn't restart)).
0

Si su aplicación sólo está utilizando la lona para rendir, entonces se podría obligar a una función al window.unload o evento pagehide que cada vez que se descarga la página de la función captura los datos de píxeles de la tela usando

ctx.getImageData() 
  • y almacena eso en el almacenamiento local, luego cuando la página se recarga puede enviar esos datos directamente al lienzo para una recarga casi instantánea y poner un giradiscos ontop mientras carga la aplicación real detrás de él.
Cuestiones relacionadas