如何使用电话号码搜索地址簿?

时间:2009-12-27 11:02:35

标签: iphone objective-c

我只想通过接听电话的电话号码搜索我的IPhone地址簿。在这种情况下如何进一步处理?假设我收到的电话的格式为(ISD代码)xxxxxxxxxx,如(+1 1234567890)或(001 1234567890)或(+11234567890)或(+1(123)456-7890)或(1234567890没有ISD代码)或别的。那么如何通过仅使用(ISD代码)1234567890搜索整个地址簿数据库以获取联系人信息?有人可以帮帮我吗?

此致 Prathap。

4 个答案:

答案 0 :(得分:4)

这是一个有趣的事情,我了解了Android如何处理来电显示(如何快速轻松地获取来电的名称)

不是将电话号码内部存储在地址簿数据库中,而是将其存储为+1(555)666-1234,而是以相反的顺序存储它们,例如43216665551.这样当来电时,拨打电话号码(43216665551) ,只取前10位数字(4321666555),让你的SQL看起来像“WHERE phone_number LIKE”4321666555%“

这并没有真正回答你的问题,但有人可能会发现这个有用的

答案 1 :(得分:1)

通过互联网搜索并查看API,我发现了这些,“现在就没有办法做到这一点”。 地址簿存储电话号码(如果您通过“联系人”添加电话号码,则电话号码将以不同的格式存储,如果电话号码从SIM卡复制,则以不同格式保存)格式化基于本地化设置的方式。因此,要接通电话号码,应根据本地化设置格式化电话号码并搜索整个地址簿。

答案 2 :(得分:0)

您可以删除所有空格和括号,只比较数字,后缀最长。

通过整个地址簿搜索是唯一的方法,因为SDK没有提供ABAddressBookCopyPeopleWithNumber。我希望他们能提供一个。

答案 3 :(得分:0)

以下方法将返回一个数组,其中包含具有给定电话号码的所有联系人。如果phoneNumber只是数字或格式化并包含破折号等,则无关紧要

这种方法花了0.02秒来搜索运行iOS7的iPhone 5上的250个联系人。

#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;
}