【问题标题】:find ios ABRecordRef contact in AddressBook by phone, email, name通过电话、电子邮件、姓名在 AddressBook 中查找 ios ABRecordRef 联系人
【发布时间】:2015-03-20 03:51:49
【问题描述】:

我需要在 AdreesBook 中找到一个联系人才能添加一个新的社交网络。 有时我必须通过电话和电子邮件或电话(名字和姓氏)查找联系人,是否有任何查询来获取 ABRecordRef 联系人而不是做 while?

我的许多用户有超过 1000 个联系人,我需要更新其中的许多人,所以如果我唯一的解决方案是做这么多时间,那效率不高...

有什么想法吗??

谢谢!

【问题讨论】:

    标签: ios contacts abaddressbook abrecord


    【解决方案1】:

    以下方法可以帮助您使用电话号码获取联系方式。为此它使用了kABPersonPhoneProperty,同样你可以编写另一个函数来搜索emailname

    • 对于 email,使用属性: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;
    }
    

    【讨论】:

    • 非常感谢!我要试试。这仅适用于我只有一个正确的电话号码吗?我可以在 rangeOfString 中使用数组吗?
    • 这是我用来搜索手机号码作为字符串的方法。对于您的情况,您可能需要稍微修改该方法,并且如果它的数字数组也循环该函数。
    • 至少首先尝试使用单个联系人号码搜索。然后逐步更新代码。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2018-03-16
    • 2014-02-12
    • 2012-03-09
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多