AVISO: Cualquier pregunta que no cumpla ninguno de estos criterios podrá ser borrada sin previo aviso.

Explico el escenario: tengo una aplicación que trabaja con la agenda de contactos y me gustaría recibir notificación cuando el usuario cambia de aplicación (o sea, la mía se queda en background), realiza cambios en la agenda (cambiar datos, crear o borrar contatos, etc.) y finalmente vuelve a mi app, para actualizar convenientemente los datos dentro de mi aplicación.

Esto se supone que se hace del siguiente modo:

ABAddressBookRef addressBook = ABAddressBookCreate();
ABAddressBookRegisterExternalChangeCallback(addressBook, abChanged, self);

Teniendo un callback en C preparado (y que está en el mismo archivo .m) como este:

void abChanged (ABAddressBookRef addressBook, CFDictionaryRef info, void *context) {
    NSLog(@"Addressbook ha cambiado");
}

Pero no funciona. Hago pruebas tanto en simulador como en el dispositivo (iPhone4) y el callback nunca llega a ejecutarse... Sé que tiene que haber algún error ya que he comprobado en otras apps similares que se enteran cuando se realizan cambios en la agenda, pero no doy con la tecla.

preguntado 24 Feb '11, 19:53

xeleh's gravatar image

xeleh
1.3k21028

editó 25 Feb '11, 22:19

¿Puede ser que estés haciendo un CFRelease(addressBook) antes del momento en el que esperas que llame abChanged?

(25 Feb '11, 01:52) Iván Leider ♦

No, no lo estoy haciendo.

(25 Feb '11, 22:10) xeleh

Solucionado. He movido el código (registro y callback) a mi clase principal (aquella a la que hago referencia en main.m y que cumple con el protocolo UIApplicationDelegate) y por fin se está llamando al callback... Sinceramente no tengo claro el origen del problema (threads?) pero el caso es que de esta forma funciona :)

enlace permanente

respondido 26 Feb '11, 21:29

xeleh's gravatar image

xeleh
1.3k21028

editó 26 Feb '11, 21:44

En realidad esto no debería ser necesario. Si no liberabas en addressBook entonces quizás estuvieras liberando el objeto self de la llamada ABAddressBookRegisterExternalChangeCallback.

(27 Feb '11, 00:53) Iván Leider ♦

Estoy de acuerdo, no debería ser necesario pero el caso es que funciona. No tengo mucho tiempo ahora mismo para investigar el problema real, pero sí que te confirmo que seguro que no estoy liberando ese "self" porque es una instancia que uso continuamente durante toda la vida de la aplicación.

(27 Feb '11, 01:17) xeleh

Revisa que no hayas liberado "addressBook".

También puedes usar NSNotification para recibir las notificaciones de tipo: kABDatabaseChangedExternallyNotification

enlace permanente

respondido 25 Feb '11, 02:58

German%20Laullon's gravatar image

German Laullon
663310

No estoy liberando "addressBook".

El tipo de notificación que comentas serviría sólo para una app de Mac, pero aquí hablo de una app para iOS (he agregado un tag para que quede más claro). Te agradezco igualmente la respuesta.

(25 Feb '11, 22:22) xeleh
Tu respuesta:
Activar/desactivar vista previa

Sobre esta pregunta

Etiquetas de la pregunta:

×245
×5
×1

Pregunta realizada el: 24 Feb '11, 19:53

Pregunta visitada: 578 veces

Última modificación: 27 Feb '11, 01:17

Seguir esta pregunta

Por Email:

Una vez que entres podrás suscribirte desde aquí para recibir actualizaciones

Por RSS:

Respuestas

Respuestas y Comentarios

Realizar Donación