【问题标题】:How to search address book with a phone number?如何用电话号码搜索通讯录?
【发布时间】:2010-12-30 06:14:47
【问题描述】:

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

问候, 普拉塔普。

【问题讨论】:

  • 通过互联网搜索并查看 iPhone SDK API,我遇到了这些,“到目前为止,没有办法做到这一点”。地址簿以格式化方式存储电话号码(如果您通过“联系人”添加电话号码,则以不同格式存储的电话号码,否则如果电话号码是从 SIM 复制,则以不同格式保存)本地化设置。因此,电话号码应根据本地化设置格式化并搜索整个地址簿。

标签: iphone objective-c


【解决方案1】:

这是我学到的一件有趣的事情,关于 Android 如何处理呼叫者 ID(他们如何快速轻松地获取来电的名称)

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

这并不能真正回答您的问题,但有人可能会觉得这很有用

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以去掉所有的空格和括号,只比较数字,最长后缀匹配。

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

      【讨论】:

        【解决方案4】:

        以下方法将返回一个数组,其中包含具有给定电话号码的所有联系人。 phoneNumber 是否只是数字或者其格式是否包含破折号等都没关系。

        此方法在我运行 iOS7 的 iPhone 5 上搜索 250 个联系人需要 0.02 秒。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-15
          • 2012-12-10
          • 1970-01-01
          • 2013-11-14
          • 2012-10-27
          • 1970-01-01
          • 2015-11-11
          • 2011-07-19
          相关资源
          最近更新 更多