2011-06-05 16 views
12

Me gustaría que mi aplicación pueda, por ejemplo, cada 12 horas, incluso si la aplicación no se está ejecutando o está en segundo plano, envíe una solicitud HTTP a un servidor, obtenga una pequeña archivo con un número de versión y si la versión en el servidor es más alta que la versión en el cliente, luego descargue algunos más archivos en el disco para que la próxima vez que se inicie la aplicación encontrará contenido nuevo en el disco.iOS procesado en segundo plano

¿Qué patrones de diseño son los más adecuados para tal tarea en iOS?

Algunos vienen a mi mente pero no tengo tanta experiencia.

  1. Quizás las notificaciones push, el servidor debe enviar un mensaje a todos los clientes cuando hay una nueva versión disponible.
  2. O, ¿Hay algo similar a Service de Android que puede ayudar?
  3. O, tal vez, cada vez que se inicia la aplicación (o va al primer plano) simplemente haga ping al servidor y vea si hay algo nuevo.
  4. O, cada vez que la aplicación comienza a hacer ping al servidor y agrega un temporizador para las próximas 12 h en caso de que esta aplicación aún esté en primer plano.
  5. O, cada vez que se inicia la aplicación, compruebe un valor de preferencia y si la última vez que se hizo ping al servidor fue hace más de 12 horas, haga ping ahora. Y luego guarde este tiempo de ping.

La opción 1 puede ser más pesada en el servidor y podría ser más complicada de implementar (considere un ios nuevo) pero puede ser la única opción para la actualización de fondo real. Pero aun así, todavía no quiero que el usuario tenga que reaccionar ante un cliente b/wa de actualización de bajo nivel y un servidor (y eso es lo que es), a menos que las notificaciones push puedan ir directamente a la aplicación y ejecutarse algo sin la intervención del usuario, entonces esta opción no vuela.
Las opciones 3-5 son todas posibles y no suenan demasiado pero solo funcionarían si la aplicación está en primer plano.

Por lo que sé, las aplicaciones en segundo plano solo pueden reproducir música, obtener actualizaciones de ubicación o actualizaciones de VoIP. Incluso hay this hack con el sonido silencioso que intentaba escapar de esta limitación. (y no fue aprobado para la tienda).

Tal vez las limitaciones son buenas, por lo tanto, ¿cómo puedo cumplir las reglas y lograr un ping de servidor periódico (o más generalmente resolver el problema de los clientes y servidores de sincronización periódica b/n incluso cuando las aplicaciones están en bg)?

Gracias

+0

Yo sugeriría 4 o 5. Una aplicación puede hacer lo que quiera en el fondo, pero sólo durante 10 minutos. Las notificaciones push solo pueden ejecutar código si muestran un mensaje y el usuario elige abrirlas. – ughoavgfhw

Respuesta

2

mensaje más conveniente sería para notificar al usuario de una actualización con las notificaciones push y cuando su aplicación se inicia podría mostrar un poco de "actualización .." pantalla.

Uno de los principales conceptos de diseño dentro de iOs es que la aplicación hace lo que el usuario le pide que haga. por lo tanto, si necesita realizar actualizaciones intensivas de datos, debe instalar las notificaciones push. & actualización: el diálogo es el camino que debe seguir. Si sus actualizaciones son muy frecuentes (escribió acerca de 12h-cheques -> asumiendo un ciclo de actualización de 24-48h), es posible que desee cargar nuevos datos cada vez que se inicie la aplicación. Friendly para iPad es un buen ejemplo de esto: cargan toneladas de html/javascript/css para usar como un marco para mostrar contenido de Facebook en WebViews porque las estructuras de Facebook cambian rápidamente.

5

No tengo una respuesta definitiva para su pregunta, solo un grupo de comentarios que pueden ayudarle a decidir qué funcionará mejor para su situación. Lo siento, esto es lo mejor que puedo ofrecer.

Una cosa a tener en cuenta es que una aplicación no debe usar ninguna de las cuotas del plan de datos del teléfono sin que el usuario sepa que está descargando algo. Algunas aplicaciones se trata de descargar cosas tales como clientes de Twitter, por lo que la naturaleza de la aplicación le dice al usuario que la aplicación está usando el plan de datos. Otras aplicaciones, como un programa de dibujo, tienen poca necesidad explícita de descargar, por lo que deben notificar al usuario de la necesidad de una descarga.

Dado que Apple no permite a los desarrolladores la opción de descargar en segundo plano, las personas que usan iOS están capacitadas para esperar a que sus aplicaciones descarguen los datos actualizados. La forma típica de mejorar la experiencia del usuario mientras se espera una descarga es, como mínimo, mostrar un spinner, para que el usuario sepa que la aplicación está funcionando. Para mejorar aún más la interfaz, envíe la descarga a otro hilo y permita que las personas continúen utilizando el resto de la aplicación. Pueden interactuar con los datos antiguos o usar las partes de la aplicación que no necesitan una actualización.

Apple no ofrece a los programadores un mecanismo para descargar contenido nuevo en segundo plano para la mayoría de los tipos de aplicaciones. Según los anuncios de Apple, la función Quiosco de iOS 5 permitirá que las suscripciones se actualicen en segundo plano. Quizás en el futuro, los desarrolladores tendremos más opciones para la descarga en segundo plano.

Tengo una aplicación en la tienda de aplicaciones que utiliza el método 5, y otro en las obras que utiliza el método 3.

que haría uso de las notificaciones push (método 1) si las personas quieren saber tan pronto como sea posible que haya nuevos datos disponibles. Dependería del tema.

iOS no tiene nada como servicio de Android (método 2)

Tengo una aplicación que comprueba un canal RSS de noticias cada vez que se inicia la aplicación (método 3). Esta aplicación generalmente hace otras cosas, pero muestra el feed en la vista de inicio. Dado que la aplicación es una sencilla herramienta que ayuda a las personas a encontrar una solución específica, la fuente RSS es auxiliar.

Me gusta la idea del temporizador en el método 4. Si desea darle a la persona la oportunidad de aprobar la descarga, el temporizador podría mostrar una vista de alerta y luego esperar. De esta forma, la aplicación no descargará nada si el dispositivo se dejó sentado con su aplicación en primer plano.

Mi implementación del método 5 en mi aplicación actualmente disponible tiene una pequeña variación. Descarga los datos para solo una de muchas vistas. Cada vez que se visita esta vista, se compara con el tiempo almacenado para ver si debe descargar datos nuevos. Luego pide permiso.

3

Tal vez las limitaciones establecidas son de buena causa, por lo que ¿Cómo juego por las normas, ser capaz de lograr un ping del servidor periódica (o más general, resolver el problema de la sincronización periódica b/w clientes y servidores incluso cuando las aplicaciones están en bg)?

Cualquiera de las opciones 3, 4 o 5 es el camino correcto a seguir.

Las aplicaciones iOS normalmente ni siquiera crean sus vistas hasta que se necesitan para conservar recursos, por lo que definitivamente no tiene sentido encender la radio y descargar datos que el usuario nunca podría ver.

Si es fundamental que el usuario tenga los datos más actualizados para usar su aplicación (parece poco probable si solo está actualizando dos veces al día), debe diseñar su aplicación de tal manera que el usuario o bien no verá los datos antiguos, o sabe que los datos se están actualizando.Por lo tanto, supongamos que su aplicación es una calculadora de hipotecas que necesita saber cuáles son las tasas de interés disponibles actualmente. Usted podría:

  • Tome la entrada del usuario, pero no se presenten los resultados hasta que haya confirmado que los datos están al día (o descargado nuevos datos).

  • Tome la entrada de los usuarios y muestre el resultado usando los datos que tiene, pero muestre el resultado de tal manera que quede claro que el resultado puede cambiar. Eso podría significar que se muestre una rueda giratoria cerca de los números que podrían cambiar o tal vez mostrando los números cuestionables en un color diferente.

  • Muestra un mensaje de "datos actualizados por última vez en: ..." en algún lugar cercano.

usuarios normalmente no me importa esperar unos segundos para que una aplicación móvil para hacer su cosa, especialmente si: a) se entiende por qué el retraso que está sucediendo, y b) el dispositivo funciona muy bien en otros aspectos , como tener una duración de la batería apreciablemente más larga que otros dispositivos. Por ejemplo, estoy constantemente sorprendido de cuánto tiempo mi iPad se ejecutará antes de necesitar una recarga; si la compensación es que tengo que esperar unos minutos para que las aplicaciones lleguen a la red, estoy de acuerdo con eso.

0

Agregaría la cadena de modo de fondo voip en su archivo Info.plist. Luego puede llamar al setKeepAliveTimeout:handler: que le permite ejecutar periódicamente una tarea programada. Tenga en cuenta que usará más batería.

Más información: http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH5-SW15

+7

La implementación de una cadena de modo de fondo de VoIP para hacer algo diferente de VoIP probablemente no solo denegaría la aplicación de la tienda, sino que también cerraría su cuenta de desarrollador. –

Cuestiones relacionadas