如何使用Grant Access以编程方式从通讯录中读取电子邮件地址?我知道可以通过ABPeoplePicker的帮助来实现,但是我正在寻找一种不涉及任何GUI的方法。

有人可以帮我解决这个问题吗?

最佳答案

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

    __block BOOL accessGranted = NO;

    if (ABAddressBookRequestAccessWithCompletion != NULL)
    {
        // we're on iOS 6
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);

        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
                                                 {
                                                     accessGranted = granted;
                                                     dispatch_semaphore_signal(sema);
                                                 });

        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    }
    else
    { // we're on iOS 5 or older
        accessGranted = YES;
    }


    if (accessGranted)
    {
        NSArray *allContacts = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

        NSLog(@"People Count :- %d", (int)[allContacts count]);

        for (int i = 0 ; i < [allContacts count] ; i++)
        {
            ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];

            ABMultiValueRef emails = ABRecordCopyValue(contactPerson, kABPersonEmailProperty);

            NSUInteger j = 0;
            for (j = 0; j < ABMultiValueGetCount(emails); j++)
            {
                NSString *email = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(emails, j);
                if (j == 0)
                    NSLog(@"Person Home Email = %@ ", email);
                else if (j==1)
                    NSLog(@"Person Work Email = %@ ", email);

                emailAddressList = [[EmailAddressList alloc] init];

                emailAddressList.strEmailAddress = email;
                emailAddressList.strEmailAddressType = @"AddressBook";

                [emailAddressList InsertRecordForEmailAddress:emailAddressList];
            }
        }
    }

10-08 17:48