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