2009-12-27 55 views
4

我只想通過收到的電話的電話號碼搜索我的IPhone的地址簿。在這種情況下,我該如何進一步處理?假設我接到的電話格式爲(ISD代碼)xxxxxxxxxx,如(+1 1234567890)或(001 1234567890)或(+11234567890)或(+1(123)456-7890)或(1234567890沒有ISD代碼)或別的東西。那麼,如何通過僅使用(ISD CODE)1234567890來搜索整個地址簿數據庫以獲取聯繫人信息?有人可以幫我嗎?如何使用電話號碼搜索地址簿?

Regards, Prathap。

+0

通過在互聯網上搜索和調查iPhone SDK API,我發現了這些,「直到現在還沒有辦法做到這一點」。 地址簿存儲電話號碼(如果您通過「聯繫人」添加電話號碼,則以其他格式存儲的電話號碼,如果電話號碼是從SIM卡中複製,則以另一種格式保存)以格式化的方式基於本地化設置。所以電話號碼應根據本地化設置進行格式化並搜索整個地址簿。 – prathumca 2009-12-29 06:30:42

回答

1

通過在互聯網上搜索並查看API,我遇到了這些,「現在有沒有辦法做到這一點」。 地址簿存儲電話號碼(如果您通過「聯繫人」添加電話號碼,則電話號碼將以其他格式存儲,如果電話號碼是從SIM卡中複製,則以不同的格式保存)基於本地化設置的格式化方式。因此,要與電話號碼聯繫,電話號碼應根據本地化設置進行格式化並搜索整個地址簿。

0

您可以刪除所有的空格和括號,只比較數字,最長的後綴匹配。

由於SDK沒有提供ABAddressBookCopyPeopleWithNumber,因此只能通過ENTIRE地址簿進行搜索。我希望他們會提供一個。

4

這裏有一個有趣的事情,我學到了Android如何處理來電顯示(他們是如何快速,輕鬆地爲來電獲得的名稱)

而不是在地址簿數據庫+1內部存儲的電話號碼( 555)666-1234,以相反的順序存儲它們,例如43216665551.這樣,當一個呼叫來到時,反過來傳入的電話號碼(43216665551),只取前10位數字(4321666555),讓你的SQL看起來像「 WHERE phone_number LIKE「4321666555%」

這並不真正回答你的問題,但有人可能會覺得這有用

0

以下方法將返回一個數組,其中包含具有給定電話號碼的所有聯繫人。不要緊,如果phoneNumber只是數字或如果其格式和包含破折號等

此方法需要0.02秒來搜索我的iPhone 5運行iOS7上的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; 
}