Уведомление о внешнем обратном вызове iPhone AddressBook?

В viewDidLoad я подписался на уведомления, чтобы получать уведомления о внешних обратных вызовах. Я не знаю, почему я не получаю уведомления в своем приложении, если я что-то изменил в своих контактах на iphone.

Я делаю так:

ab=ABAddressBookCreate();
ABAddressBookRegisterExternalChangeCallback(ab, MyAddressBookExternalChangeCallback, self);

И я определил это в том же контроллере

void MyAddressBookExternalChangeCallback ( ABAddressBookRef addressBook, CFDictionaryRef info, void *context ) {
 [((TGTextsInboxController *) context) addressBookHasChanged];
}

Как я могу это отладить? Я пробовал это в Симуляторе.

  1. Я открыл свое приложение до TGTextsInboxController viewController
  2. Я нажал кнопку "Домой", мое приложение перешло в фоновый режим
  3. nТеперь я открыл iPhone Контакты, поменял любой номер телефона любого человека.
  4. Снова откройте приложение из фона на передний план.
  5. Никаких уведомлений не отражено. Ни один указатель отладчика не попал в этот метод MyAddressBookExternalChangeCallback.

Что-то не так ?


person Tariq    schedule 15.07.2011    source источник
comment
Как это сделать в SWIFT?   -  person KarimIhab    schedule 07.06.2015


Ответы (2)


Проблема решена:

Выпустил CFRelease(ab); после уведомления. Как только я прокомментировал эту строку. Я могу получать уведомления.

person Tariq    schedule 15.07.2011
comment
У меня была такая же проблема - пытался удалить CFRelease, но это не помогло ... Есть идеи? Я тоже работаю с симулятором. - person Itay Levin; 13.09.2011
comment
вы не получаете вызовы уведомлений в делегате MyAddressBookExternalChangeCallback? - person Tariq; 14.09.2011
comment
нет, callabck вообще не вызывается. Я пробовал это как в симуляторе, так и на реальном устройстве. Должно ли мое приложение работать в фоновом режиме, чтобы оно работало? потому что у меня нет определенного ключа в списке. но я вижу, что мое приложение возвращается в ту же ситуацию, поэтому я предполагаю, что deufult должен работать в фоновом режиме ...? - person Itay Levin; 14.09.2011

Воспользуйтесь обратным звонком из адресной книги.

void ABAddressBookRegisterExternalChangeCallback (
   ABAddressBookRef addressBook,
   ABExternalChangeCallback callback,
   void *context
);

Мой образец - Зарегистрируйтесь (после создания addressBookRef)

ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, self);

My Smaple - Сделайте что-нибудь и отмените регистрацию

void addressBookChanged(ABAddressBookRef abRef, CFDictionaryRef dicRef, void *context) {

    NSLog(@"!!!!!Address Book Changed!");

    //Do Something You Need. (Recreate addressbook or Reload UITableView data.)

    ABAddressBookUnregisterExternalChangeCallback(abRef, addressBookChanged, context);
}

Мой ответ: Адресная книга для iPhone

person ChangUZ    schedule 08.08.2011
comment
Вы уверены, что это актуально, когда адресная книга обновляется из адресной книги iPhone? будет ли вызываться этот обратный вызов? - person Itay Levin; 13.09.2011
comment
Да, этот код является частью моего приложения. Я проверил, что он работает нормально. - person ChangUZ; 14.09.2011
comment
В моем примере @property (non-, ret-) ABAdressNookRef addrssbook; - person ChangUZ; 14.09.2011
comment
Я использовал CFRelase (адресную книгу) в (void) dealloc {} - person ChangUZ; 14.09.2011
comment
когда я пытался добавить свойство, я получаю сообщение об ошибке, в котором говорится, что это не объект и его нельзя использовать с параметрами Nonatomic / keep. Что-то вроде новенького здесь - но все функции получают ABAddressBookRef, а не указатель (ABAddressBookRef *), поэтому, если я определяю свойство как возвращающее указатель, что я должен передать другим методам? - person Itay Levin; 14.09.2011
comment
Хорошо, получил обратный вызов для вызова - проблема заключалась в том, что я ввел регистр в контроллере, а не в делегат приложения. Но теперь моя проблема в том, как анализировать значения обратного вызова - я получил ссылку на адресную книгу и ссылку на CFDictionary, которая будет содержать изменения, внесенные в адресную книгу? - person Itay Levin; 14.09.2011
comment
Ой, извините, не сохраняю ... @property (неатомарно, присваивать) ABAddressBookRef addressBook; - person ChangUZ; 15.09.2011
comment
Я не знаю, что изменилось. При обратном вызове я воссоздал адресную книгу. - person ChangUZ; 15.09.2011