ABAddressBook внешний вызов не вызывается в iOS - PullRequest
2 голосов
/ 02 февраля 2012

У меня есть класс, содержащий список контактов моего пользователя в приложении для iPhone.

Суть его реализована следующим образом.

//file Contacts.m
//imports here
    void MyAddressBookExternalChangeCallback (
                                              ABAddressBookRef addressBook,
                                              CFDictionaryRef info,
                                              void *context
                                              )
    {
        NSLog(@"callback called ");
        [[Contacts sharedInstance] refresh];
    }

@implementation Contacts
@synthesize addressBook;

+ (Contacts*)sharedInstance
{
    @synchronized(self)
    {
        if (sharedInstance == nil)
        {
            sharedInstance = [[Contacts alloc] init];
        }
    }
    return sharedInstance;
}

- (void)refresh
{
    ABAddressBookRevert(addressBook); /*refreshing the address book in case of changes*/
   [people release];
    people = (NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

}

- (id)init
{
    if ((self = [super init]))
    {
        sharedInstance = self;
        addressBook = ABAddressBookCreate();;
        people = nil;                                                               
        [self refresh];
        ABAddressBookRegisterExternalChangeCallback (      addressBook,
                                                           MyAddressBookExternalChangeCallback,
                                                          self
                                                          );
    }
    return sharedInstance;
}

В init я настраиваю внешний обратный вызов MyAddressBookExternalChangeCallback, чтобы получать уведомления об изменениях в списке контактов.У меня проблема в том, что внешний обратный вызов не вызывается (я никогда не вижу результат сообщения nslog), когда я добавляю контакт в приложение для телефона iPhone.

Что я сделал не так?

Добавлено примечание: даже странно, если я делаю

ABAddressBookRevert(addressBook);

каждый раз, когда мое приложение выходит на передний план и изменяется адресная книга, тогда вызывается обратный вызов.

Ответы [ 2 ]

8 голосов
/ 09 февраля 2012

Я проверил это на своем iPhone и убедился, что обратный вызов был вызван:

Contacts.h:

#import <Foundation/Foundation.h>
#import <AddressBook/AddressBook.h>

@interface Contacts : NSObject
{
    ABAddressBookRef addressBook;
    NSArray *people;
}

+ (Contacts*)sharedInstance;
- (void)refresh;

void MyAddressBookExternalChangeCallback (
                                          ABAddressBookRef addressBook,
                                          CFDictionaryRef info,
                                          void *context
                                          );

@end

Contacts.m:

#import "Contacts.h"

void MyAddressBookExternalChangeCallback (
                                          ABAddressBookRef addressBook,
                                          CFDictionaryRef info,
                                          void *context
                                          )
{
    NSLog(@"callback called ");
    [[Contacts sharedInstance] refresh];
}

@implementation Contacts

+ (Contacts*)sharedInstance
{
    static Contacts *sharedInstance = nil;

    @synchronized(self)
    {
        if (sharedInstance == nil)
        {
            sharedInstance = [[Contacts alloc] init];
        }
    }
    return sharedInstance;
}

- (void)refresh
{
    ABAddressBookRevert(addressBook); /*refreshing the address book in case of changes*/
    [people release];
    people = (NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

}

- (id)init
{
    if ((self = [super init]))
    {
        //sharedInstance = self;
        addressBook = ABAddressBookCreate();
        people = nil;                                                               
        [self refresh];
        ABAddressBookRegisterExternalChangeCallback (addressBook,
                                                     MyAddressBookExternalChangeCallback,
                                                     self
                                                     );
    }
    return self;
}

@end
1 голос
/ 17 июня 2016

Welp, я опаздываю на вечеринку примерно на четыре года, и этот интерфейс устарел ... но на тот случай, если кому-то все равно, в моем случае я обнаружил, что вам нужно зарегистрироваться для обратного вызова в главном потоке.Если я зарегистрировался в другом потоке, он никогда не вызывался.Не вижу этого в документах (хотя, может быть, с моей стороны это не совсем понятно).

В любом случае, попробуйте.

...