2009-03-27 20 views
27

Estoy buscando crear una aplicación que funcione tan bien fuera de línea como lo hace en línea. Dado que la aplicación no se puede comunicar con el servidor mientras está fuera de línea, hay un cierto nivel de sincronización que debe tener lugar.iPhone aplicación fuera de línea con sincronización

¿Cuáles son algunas buenas herramientas para leer y comenzar a pensar al planificar operaciones sin conexión con sincronización para su iPhone?

¿Qué herramientas tendría que crear yo solo, frente a las herramientas que Apple ya proporciona para ayudar con este problema en particular?

+3

Secundo esta pregunta, y añadir que me gustaría saber acerca de las estrategias para la fusión datos fuera de sincronización. Ponerse en contacto con un servidor para sincronizar es una obviedad. La parte difícil es descubrir cómo combinar los datos del servidor con los datos locales. – Alex

Respuesta

14

hay un montón de aplicaciones en la tienda de aplicaciones que se basan tanto en línea, así como los datos fuera de línea

lo que realmente debería estar haciendo es el comienzo de su aplicación, ejecute un subproceso de fondo (que se ejecuta en silencio para que su el usuario nunca ve ningún retraso). este hilo descarga los datos más recientes de su servidor y los introduce en su base de datos local (sqlite es la mejor opción)

asegúrese de implementar algún tipo de control de versiones de datos para que su aplicación solo descargue datos que realmente han cambiado desde la última descarga - De lo contrario, estaría descargando innecesariamente todo el conjunto de datos, que puede ser bastante grande (según los requisitos de su aplicación)

también asegúrese de probar la conectividad a Internet al hacerlo. si no hay internet disponible, alerta al usuario con seguridad

de esta manera obtienes lo mejor de ambos mundos. los usuarios cuando están lejos de Internet pueden usar su aplicación con sus datos sqlite locales

en iphone os 3.0 apple ha introducido servicios push - donde simplemente puede "PULSAR" sus datos en lugar de hacer un "PULL", pero esto no está disponible en el iPhone OS actual (2.xx)

+0

En el caso de dispositivos múltiples, terminas con un requisito de replicación maestro-maestro. Asegúrate de dar cuenta de los conflictos. Considere el uso de GUID para evitar colisiones de id en nuevos registros. – jchook

2

Me gustaría almacenar toda la información que reúno sin conexión en una base de datos SQLite. Luego, a petición del usuario, puede SINCRONIZAR toda la información almacenada con un servidor que use HTTP o un protocolo TCP/IP personalizado que pueda obtener.

He estado utilizando este enfoque en las aplicaciones de Palm OS durante casi 10 años, y funcionan muy bien.

Por lo que yo sé, la única "herramienta" que tendrá que lograr esto es simple viejo OBJECTIVE-C con Cocoa Touch. Aunque podría utilizar algunas bibliotecas TCP/IP C++ que le facilitarán la vida si decide implementar su propio protocolo.

+0

No sobrecapitalice "Objective-C". –

4

Push probablemente no sea una opción viable aquí, ya que la cantidad de datos que puede presionar es minúscula, y básicamente vuelve a "decirle a mi aplicación que haga una llamada al servidor". Usamos un modelo en línea/fuera de línea en Satchel. Cada vez que tenemos que comunicarnos con el servidor, agrupamos esa comunicación (una URL y posiblemente algunos datos POST) y la almacenamos en una base de datos. Si estamos en línea, lo retiramos, lo enviamos y cuando recibimos una respuesta válida, eliminamos el registro de la base de datos. Si no estamos conectados, esas filas se acumulan y la próxima vez que ESTAMOS en línea, se envían. Este no es un modelo factible en todas las situaciones, pero se puede adaptar a la mayoría.

En 3.0, tiene acceso a CoreData, que es una gran herramienta de administración de datos. Aparte de eso, la familia NSURLXXX es tu amiga.

3

http://blog.webscale.co.in/?p=159 Este artículo enumera los enfoques para manejar la sincronización de datos fuera de línea/en línea. Puede ayudarte, si quieres crear tu propio marco.

+1

No se encuentra la página –

16

He estado trabajando en una aplicación que maneja este comportamiento exacto durante los últimos 2 meses más o menos. Tiene un pequeño subconjunto de funciones que están solo en línea y un gran conjunto de funcionalidades fuera de línea/en línea.

Estoy usando sqlite para el almacenamiento local como se sugiere aquí con una versión modificada de la biblioteca sqlitepersistentobjects. La versión base de sqlitepersistentobjects no es segura para subprocesos, así que ten cuidado si la estás usando. (consulte el registro de objetivos en: objectivesync para obtener una alternativa segura para hilos, pero prepárese para profundizar en el código). Si está dispuesto a desarrollar para la sdk 3.0, entonces los datos centrales son otra posibilidad para una biblioteca sqlite.

La arquitectura general es lo suficientemente simple He modelado el almacenamiento local usando sqlite y la interacción remota usando objective resource en una aplicación de rieles y REST api. Puede usar xml o json para la serialización de datos.

Cuando un objeto se modifica localmente, el cambio se guarda primero en el registro de la base de datos sqlite para ese objeto y luego se agrega a una cola que se serializa y almacena también en el archivo sqlite local db. (La cola puede procesarse en cualquier momento)

Si hay una conexión disponible, los cambios locales en cola se deserializan y se agregan a un NSOperationQueue que luego los procesa en segundo plano.

Para hacer que todo esto funcione, he subclasificado NSOperation para que pueda admitir varios tipos de operaciones de cola remota: crear, actualizar, eliminar utilizando esencialmente el recurso objetivo para realizar las solicitudes remotas.

Lo bueno de utilizar NSOperationQueue y NSOperation es que manejan el subprocesamiento de fondo para usted, así que recomiendo echar un vistazo a los documentos de Apple para esas clases y también a la manzana threading guide.

Cuando se carga la aplicación, se realiza un poco de control remoto y se procesa en segundo plano para extraer los datos más recientes, aunque para ser honesto, todavía estoy cambiando la forma en que esto se comporta un poco.

Esa es una descripción rápida de lo que he tenido que enfrentar hasta ahora ... espero que ayude un poco.

1

Pregunte si ha considerado utilizar un Sync Framework para administrar la sincronización. Si eso le interesa, puede echarle un vistazo al proyecto de código abierto, el servicio Sync de OpenMobster. Puede realizar las siguientes operaciones de sincronización

  • dos vías
  • unidireccional cliente
  • unidireccional dispositivo
  • arranque

Además de eso, todas las modificaciones se registran automáticamente y se sincronizan con la nube Puede desconectar su aplicación cuando la conexión de red no funciona. Seguirá cualquier cambio y automáticamente en el fondo lo sincronizará con la nube cuando la conexión regrese. También proporciona sincronización como iCloud en varios dispositivos

Además, las modificaciones en la nube se sincronizan mediante notificaciones Push, por lo que los datos siempre están actualizados incluso si se almacenan localmente.

Aquí hay un enlace al proyecto de código abierto: http://openmobster.googlecode.com

Aquí hay un enlace a iPhone App de sincronización: http://code.google.com/p/openmobster/wiki/iPhoneSyncApp

Cuestiones relacionadas