获取 ios 申请中的所有 iphone 联系人 iOS 7

get all iphone Contact in ios Application with iOS 7

我正在开发一个应用程序,我想在其中从我的 iphone 中获取所有联系人,包括详细信息(名字、姓氏、电子邮件和手机号码)。应用程序的部署目标是 iOS 7 及更高版本。

我试过下面的代码,但它根本不起作用。

My code is here

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

    CFErrorRef error = NULL;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

    __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);
            if (addressBook!=nil)
            {
                NSArray *allContacts = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

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


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

            }
            else
            {
                NSLog(@"Error");

            }
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    }
    else
    {
        if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied ||
            ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted )
        {
            NSLog(@"denied");
            // Display an error.
        }
    }

    NSLog(@"%@", myContacts);

您的代码几乎完全正确。您只需在地址簿请求的完成块中打印出 myContacts 数组。

我已经为您做了一些代码更改:

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

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

__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);
     if (addressBook!=nil)
     {
         NSArray *allContacts = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

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

             // you need to do a nil check before adding a firstName to the array
             //
             // some contacts won't have first names, after all
             if([firstName length] > 0)
             {
                 [myContacts addObject:firstName];
             }
         }
         CFRelease(addressBook);
     }
     else
     {
         NSLog(@"Error");
     }

     // *** HERE is where to print out the myContacts array***
     NSLog(@"addresses are %@", myContacts);
    });
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else
{
    if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied ||
        ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted )
    {
        NSLog(@"denied");
        // Display an error.
    }
}

// don't NSLog here, as myContacts array likey won't be filled out here...
// print it out in the completion block instead
// NSLog(@"%@", myContacts);

B.T.W.,如果您的代码仅在 iOS 9 和更新版本上 运行,请考虑改用 CNContactStore,因为地址簿 API 是已弃用,最终可能会从 iOS.

中删除