【问题标题】:How to simply retrieve list of Contacts in iOS7?如何在 iOS7 中简单地检索联系人列表?
【发布时间】:2013-10-29 10:10:45
【问题描述】:

我需要在iOS 中检索Contacts 的列表。

这是我的代码不起作用。

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的列表?

【问题讨论】:

  • 您遇到什么错误?您可以将联系人提取到 allContacts 数组中吗?
  • 当我尝试使用上述代码并使用 NSLog(@"Count : %i",contacts.count);它显示0兄弟。它不返回任何联系人。

标签: ios addressbook


【解决方案1】:

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

__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的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2012-03-12
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多