2013-10-29 49 views
3

我需要检索iOS中的Contacts列表。如何在iOS7中简单检索联系人列表?

这是我的代码,不工作。

NSMutableArray *myContacts = [[NSMutableArray alloc]init]; 

    CFErrorRef error = NULL; 
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL); 
    if (addressBook!=nil) 
    { 
     NSArray *allContacts = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook); 

     NSUInteger i = 0; 
     for (i = 0; i<[allContacts count]; i++) 
     { 
      Person *person = [[Person alloc] init]; 
      ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i]; 
      NSString *firstName = (__bridge_transfer NSString*)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty); 

      person.firstName = firstName; 
      [myContacts addObject:person]; 
     } 
     CFRelease(addressBook); 

    } 
    else 
    { 
     NSLog(@"Error"); 

    } 

如何获得Contacts的列表?

+0

你得到了什么错误?你能否将联系人存入allContacts数组? –

+0

当我试着用上面的代码和NSLog测试(@“Count:%i”,contacts.count);它显示0 bro。它不返回任何联系人。 –

回答

6

您需要首先请求访问用户的地址簿。设置一个标志来检查用户是否允许/拒绝访问。

__block BOOL userDidGrantAddressBookAccess; 
CFErrorRef addressBookError = NULL; 

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined || 
    ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) 
{ 
    addressBook = ABAddressBookCreateWithOptions(NULL, &addressBookError); 
    dispatch_semaphore_t sema = dispatch_semaphore_create(0); 
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error){ 
     userDidGrantAddressBookAccess = granted; 
     dispatch_semaphore_signal(sema); 
    }); 
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
} 
else 
{ 
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied || 
     ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted) 
    { 
     // Display an error. 
    } 
} 

然后,您可以调用您写入的方法来获取联系人。请记得首先检查userDidGrantAddressBookAccess的值。

相关问题