2013-09-27 7 views
2

Я использую ABAddressBookRegisterExternalChangeCallback для регистрации, если в базу данных AddressBook внесены изменения. У меня он работает отлично для меня и я могу получать уведомления, но они работают только тогда, когда приложение работает.Работает ли ABAddressBookRegisterExternalChangeCallback, даже когда приложение завершено

После того, как приложение было убито (завершено), а затем перезапущено, оно не распознает изменения в течение этого времени между kill и restart.

Есть ли способ обнаружить эти изменения или был разработан для работы таким образом?

Пример кода, который я использую -

в viewDidLoad -

CFErrorRef error = NULL; 

addressBook = ABAddressBookCreateWithOptions(NULL, &error); 

ABAddressBookRegisterExternalChangeCallback(addressBook,addressBookChanged,(__bridge void *)(self)); 

И обратного

void addressBookChanged(ABAddressBookRef reference, CFDictionaryRef dictionary, void *context) { 
NSLog(@"There was a change in the addressbook"); 

ответ

1

Нет, эти сигналы будут приниматься только тогда, когда ваше приложение активно.

Возможно, поддержка iOS7 для обработки фонового изображения позволит осуществлять некоторый мониторинг, но, вероятно, не использует этот обратный вызов.

0

Я пытаюсь подготовить некоторые решения для этой проблемы прямо сейчас, и я думаю об использовании этого обратного вызова, а также хранении размера адресной книги в другом месте и при запуске приложения, сравнивая их размеры, чтобы определить, произошло ли изменение , Я предполагаю, что большинство изменений, вероятно, вызовут небольшую разницу в размере так или иначе. Между этими двумя я думаю, что существует несовершенное, но приемлемое решение.

+0

Я сделал сильный мозговой штурм на этом. И сохранение размера не будет работать. Что, если это +1 и -1. Изменение размера будет нулевым, но будут изменения в контактах. То, как я обрабатываю это, - это использование основных данных. Храните все синхронизированные/используемые контакты в модели coredata, у каждого контакта есть идентификатор, а затем вы можете сравнить это с тем, что находится в ABAddressBook. – VaibhavAggarwal

+0

Да, это имеет смысл - но вы не можете измерить фактический размер файла адресной книги, а не просто количество контактов - что-то гораздо более тонкое. Несмотря на то, что это было бы теоретически несовершенным, это могло бы в значительной степени в любой мыслимой ситуации дать вам точную меру изменений. – Karoh

+0

Снова основная проблема заключается в том, что вы не можете быть уверены в размере. Такое же количество байтов можно удалить и записать. Подумайте о каждом контакте как сущности, вы должны иметь возможность находить разницу для каждого поля для каждого объекта. И вы можете сделать это только в том случае, если вы сохранили предыдущую версию данных, с которой можно сравнивать. – VaibhavAggarwal

Смежные вопросы