2012-02-02 41 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

韋爾普,我對晚了四年,這個界面現在已經被棄用了...但是如果有人仍然在意,就我而言,我發現你需要在主線程上註冊回調。如果我在另一個線程上註冊,它就不會被調用。不要在文檔中看到這些(儘管也許這只是閱讀理解失敗)。

無論如何,嘗試一下。