通过电话,电子邮件,姓名在地址簿中找到ios ABRecordRef联系人

时间:2015-01-21 15:06:59

标签: ios contacts abaddressbook abrecord

我需要在AdreesBook中找到一个联系人才能添加新的社交网络。 有时我必须通过手机和电子邮件或手机查找联系人,firstName和lastName,是否有任何类型的查询来获取ABRecordRef联系而不是做什么?

我的许多用户拥有超过1000个联系人,我需要更新其中的许多联系人,因此如果我唯一的解决方案就是这么多,那就没有效率......

任何想法??

谢谢!

1 个答案:

答案 0 :(得分:3)

以下方法可帮助您使用电话号码获取联系人详细信息。对于它使用的kABPersonPhoneProperty,您可以使用相同的方式编写其他函数来搜索电子邮件名称

  • 对于电子邮件,请使用以下属性:kABPersonEmailProperty
  • 名字kABPersonFirstNameProperty

有关详细信息,请访问:ABPerson Reference

希望这有帮助。

#import <AddressBook/AddressBook.h>

-(NSArray *)contactsContainingPhoneNumber:(NSString *)phoneNumber {
    /*
     Returns an array of contacts that contain the phone number
     */

    // Remove non numeric characters from the phone number
    phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]] componentsJoinedByString:@""];

    // Create a new address book object with data from the Address Book database
    CFErrorRef error = nil;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
    if (!addressBook) {
        return [NSArray array];
    } else if (error) {
        CFRelease(addressBook);
        return [NSArray array];
    }

    // Requests access to address book data from the user
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {});

    // Build a predicate that searches for contacts that contain the phone number
    NSPredicate *predicate = [NSPredicate predicateWithBlock: ^(id record, NSDictionary *bindings) {
        ABMultiValueRef phoneNumbers = ABRecordCopyValue( (__bridge ABRecordRef)record, kABPersonPhoneProperty);
        BOOL result = NO;
        for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) {
            NSString *contactPhoneNumber = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(phoneNumbers, i);
            contactPhoneNumber = [[contactPhoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]] componentsJoinedByString:@""];
            if ([contactPhoneNumber rangeOfString:phoneNumber].location != NSNotFound) {
                result = YES;
                break;
            }
        }
        CFRelease(phoneNumbers);
        return result;
    }];

    // Search the users contacts for contacts that contain the phone number
    NSArray *allPeople = (NSArray *)CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
    NSArray *filteredContacts = [allPeople filteredArrayUsingPredicate:predicate];
    CFRelease(addressBook);

    return filteredContacts;
}