2012-02-02 44 views
2

我有一个类在iPhone应用程序中持有我的用户的联系人列表。在iOS中未调用ABAddressBook外部回调

它的核心实现如下。

//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通知更改联系人列表。 我遇到的问题是当我在iPhone手机应用程序中添加联系人时,外部回调未被调用(我永远不会看到nslog消息的结果)。

我做错了什么?

补充说明:即使陌生人,如果我做

ABAddressBookRevert(addressBook); 

每次我的应用程序走到前面和地址簿时已被修改,然后调用回调。

+0

相似的问题:http://stackoverflow.com/questions/2706641/address-book-callback-not-called – pojo 2012-02-02 13:11:59

+0

是的,看到,但我不会释放我的地址簿在这个问题,所以我不不认为这是问题。 – madewulf 2012-02-02 13:18:36

回答

8

我测试了我的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 
+0

你只是把代码没有评论。我想你写了这个,运行它,并验证回调被称为?我对么 ? – madewulf 2012-02-09 11:21:54

+0

正确。我在iPhone上进行了测试,并确认回调被调用。 – Marco 2012-02-09 12:16:25

+0

@Marco是否要求此地址簿代码保留在应用程序委托文件或任何其他总是被调用的控制器文件中,以便调用回调? – meteors 2015-05-05 14:08:05

1

韦尔普,我对晚了四年,这个界面现在已经被弃用了...但是如果有人仍然在意,就我而言,我发现你需要在主线程上注册回调。如果我在另一个线程上注册,它就不会被调用。不要在文档中看到这些(尽管也许这只是阅读理解失败)。

无论如何,尝试一下。