2012-09-17 12 views
9

Mi aplicación necesita almacenar los contactos de un usuario en nuestros servidores (dado el permiso del usuario, por supuesto). Uno de sus requisitos es reflejar cualquier cambio en la libreta de direcciones de los dispositivos (agregar/editar/eliminar) al servidor.Libreta de direcciones iOS - ¿Cómo saber qué contacto se agregó/editó/eliminó?

¿Existe alguna manera fácil/mejor práctica para determinar qué contactos de la libreta de direcciones se cambiaron antes de volver a iniciar una aplicación?

Todo lo que puedo ver son los métodos de devolución de llamada para notificar a una aplicación un cambio en la libreta de direcciones, pero parece que no hay formas documentadas de determinar qué contactos se agregaron, editaron o eliminaron.

Lo que estoy pensando ahora es comparar manualmente la nueva lista de contactos con una almacenada en el dispositivo, luego actualizar tanto la aplicación como el servidor de los cambios. Pero creo que podría ser demasiado si el usuario tiene una gran cantidad de contactos.

Gracias!

+0

creo que esto [respuesta Stackoverflow] (http://stackoverflow.com/questions/12348916/addressbook-synchronization-in-ios) podría ser útil para usted. –

Respuesta

1

Analice el uso de libsqlite3.dylib y la creación de una base de datos SQL que acceda a los archivos planos generados para todas las propiedades necesarias y luego compare periódicamente su base de datos con los dispositivos de los usuarios. Asegúrese de que ambas bases de datos solo adquieran las necesidades básicas que necesitará del marco de trabajo de abaddressbook.

proyecto IOS de la muestra con la biblioteca sqlite3 está aquí:

http://www.techotopia.com/index.php/An_Example_SQLite_based_iOS_7_Application

& Detalle de hacerlo con ABAddressbook para las propiedades de valores múltiples de contacto aquí:

http://linuxsleuthing.blogspot.com/2012/10/addressing-ios6-address-book-and-sqlite.html

+1

Esta no es la forma ideal de iterar cada vez los contactos .. Mejor es usar 'ABAddressBookRegisterExternalChangeCallback' – Mrug

2

Tienes que registre su clase con el ABAddressBookRegisterExternalChangeCallback pasando un ABAddressBookRef y la devolución de llamada ("addressBookDidChang e" en mi ejemplo)

ABAddressBookRef addressBook = //... 

ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookDidChange(__bridge_retained void *)self); 

void addressBookDidChange(ABAddressBookRef addressBook, CFDictionaryRef info, void *context) 
{ 
    //Something changed from last application launch, insert your logic here... 

    //If you want to handle it in a "Objective-C" method you can do something like: 
    [((__bridge ABManager*) context) yourObjectiveCMethod]; 

} 
+2

Cuenta que algo ha sucedido con la libreta de direcciones que aún no responde - ¿Qué contacto se agregó/editó/eliminó? –

+1

@VenuGopalTewari Puede guardar sus contactos antes y luego compararlos con los contactos extraídos en la dirección de devolución de llamadaBookDidChange – andreacipriani

+0

¿Puede sugerir alguna buena lógica o algún ejemplo o código de muestra? – Ayaz

Cuestiones relacionadas