如何从IOS中的通讯录中检索针对一个联系人保存的所有电话号码?
我正在构建一个iOS应用程序,尝试获取所有手机联系人并显示它们 现在的问题是,如果有两个电话号码是用一个名字储存的,那么在我的列表中只会显示第一个号码如何从IOS中的通讯录中检索针对一个联系人保存的所有电话号码?,ios,objective-c,uitableview,contacts,addressbook,Ios,Objective C,Uitableview,Contacts,Addressbook,我正在构建一个iOS应用程序,尝试获取所有手机联系人并显示它们 现在的问题是,如果有两个电话号码是用一个名字储存的,那么在我的列表中只会显示第一个号码 我需要检索针对一个特定联系人保存的两个号码。有关iOS通讯簿的良好教程可在此处找到: 请查看苹果标准通讯簿教程。它还将帮助你理解它的基本原理 您可以通过[PJRAddressBook getPersonContacts]获取所有类型的联系人;在我的示例中,您可以从中获得所有电话号码。就像手机一样, Main phone、iPhone phone
我需要检索针对一个特定联系人保存的两个号码。有关iOS通讯簿的良好教程可在此处找到:
请查看苹果标准通讯簿教程。它还将帮助你理解它的基本原理 您可以通过[PJRAddressBook getPersonContacts]获取所有类型的联系人;在我的示例中,您可以从中获得所有电话号码。就像手机一样,
Main phone、iPhone phone、Home FaxPhone、Work FaxPhone、Other FaxPhone、pagerPhone方法中的
应继续选择person
后,您可以获得所选人员的参考,您可以获得不同的电话号码,如
multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
for(i=0; i< ABMultiValueGetCount(multi);i++)
{
NSMutableString *numb = (__bridge NSMutableString*)ABMultiValueCopyValueAtIndex(multi, i);
//next 5 line will make numbers are clear digit, without symbols.
numb = [NSMutableString stringWithFormat:@"%@",[numb stringByReplacingOccurrencesOfString:@" " withString:@""]];
numb = [NSMutableString stringWithFormat:@"%@",[numb stringByReplacingOccurrencesOfString:@"(" withString:@""]];
numb = [NSMutableString stringWithFormat:@"%@",[numb stringByReplacingOccurrencesOfString:@")" withString:@""]];
numb = [NSMutableString stringWithFormat:@"%@",[numb stringByReplacingOccurrencesOfString:@"-" withString:@""]];
numb = [NSMutableString stringWithFormat:@"%@",[numb stringByReplacingOccurrencesOfString:@"." withString:@""]];
NSString *valAtIndex = (__bridge NSString *)ABMultiValueCopyLabelAtIndex(multi,i);
if([valAtIndex isEqualToString:@"_$!<Mobile>!$_"] || [valAtIndex isEqualToString:@"_$!<Other>!$_"])
mobileNumber = numb;
if ([valAtIndex isEqualToString:@"_$!<Home>!$_"])
homeNumber = numb;
if ([valAtIndex isEqualToString:@"_$!<Work>!$_"])
WorkNuimber = numb;
}
multi=ABRecordCopyValue(person,kABPersonPhoneProperty);
对于(i=0;i
//导入两个框架
#进口
#进口
//创建属性
@属性(非原子,赋值)ABAddressBookRef addressBookRef;
//考虑到你的负载
ABAddressBookRequestAccessWithCompletion(self.addressBookRef,^(bool-grated,CFErrorRef-error){
如果(授予){
dispatch\u async(dispatch\u get\u main\u queue()^{
[self-getContactsFromAddressBook];
});
}否则{
//TODO:显示警报
}
});
-(无效)getContactsFromAddressBook
{
CFErrorRef error=NULL;
ABAddressBookRef addressBook=ABAddressBookCreateWithOptions(NULL,错误(&R);
如果(通讯簿){
NSArray*所有联系人=(u_u桥u传输NSArray*)ABAddressBookCopyArrayFallPeople(addressBook);
整数i=0;
对于(i=0;i请提交此url:农场动物关闭的另一个有用的问题。请不要只发布一个链接,因为它可能过时。相反,请在答案中添加您需要说的内容。@trojanfoe ok,但请注意,原始问题要求“教程或博客链接”@Daniel谢谢,但此博客正在添加联系人,我想检索联系人并显示。请不要只发布一个链接,因为它可能会过时。相反,请在回答中添加您需要说的任何内容。@PJR谢谢,但此博客正在添加联系人,我想检索联系人并显示。@sofquestion我正在共享我的一个组件,其中将帮助您:@PJR感谢您共享代码,但我面临的问题与-我的姓名Hitesh联系人列表中有两个号码存储,但它只显示第一个号码。您能在这个问题上帮助我吗。@sofquestion请检查我的更新答案。@Ankit谢谢您-我在[arrContact addObject:dict]处收到错误信息;这是-使用未声明的未声明的'arrContat';您是指'allcontacts'吗?您能帮我解决这个问题吗?请先确定arrContact..像NSMutableArray*myArr
非常感谢还有一个错误-[tblContact reloadData];未声明抱歉,我几天前才开始使用IOS,所以我没有太多知识。如果您能帮助我解决最后一个错误,这将非常棒。非常感谢。您能给出完整的正确示例吗?因为我是IOS新手
// Import two framework
#import <AddressBookUI/AddressBookUI.h>
#import <AddressBook/AddressBook.h>
// create a property
@property (nonatomic, assign) ABAddressBookRef addressBookRef;
// in view didLoad
ABAddressBookRequestAccessWithCompletion(self.addressBookRef, ^(bool granted, CFErrorRef error) {
if (granted) {
dispatch_async(dispatch_get_main_queue(), ^{
[self getContactsFromAddressBook];
});
} else {
// TODO: Show alert
}
});
-(void)getContactsFromAddressBook
{
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
if (addressBook) {
NSArray *allContacts = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSUInteger i = 0;
for (i = 0; i<[allContacts count]; i++) {
// myClass *shrObj = [[myClass alloc] init];
ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
// Get first and last names
NSString *firstName = (__bridge_transfer NSString*)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
NSString *lastName= (__bridge_transfer NSString*)ABRecordCopyValue(contactPerson, kABPersonLastNameProperty);
if (!lastName) {
lastName=@"";
}
NSString *fullName = [NSString stringWithFormat:@"%@ %@",firstName,lastName];
NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
[dict setValue:fullName forKey:@"name"];
// Get mobile number
ABMultiValueRef phonesRef = ABRecordCopyValue(contactPerson, kABPersonPhoneProperty);
if ([self getMobilePhoneProperty:phonesRef]!=nil) {
[dict setValue:[self getMobilePhoneProperty:phonesRef] forKey:@"mobile"];
[arrContact addObject:dict];
}
if(phonesRef) {
CFRelease(phonesRef);
}
}
[tblContact reloadData];
}
else
{
NSLog(@"Error");
}
}
- (NSString *)getMobilePhoneProperty:(ABMultiValueRef)phonesRef {
for (int i=0; i < ABMultiValueGetCount(phonesRef); i++) {
CFStringRef currentPhoneLabel = ABMultiValueCopyLabelAtIndex(phonesRef, 0);
CFStringRef currentPhoneValue = ABMultiValueCopyValueAtIndex(phonesRef, 0);
if(currentPhoneLabel) {
if (CFStringCompare(currentPhoneLabel, kABPersonPhoneMobileLabel, 0) == kCFCompareEqualTo) {
return (__bridge NSString *)currentPhoneValue;
}
if (CFStringCompare(currentPhoneLabel, kABHomeLabel, 0) == kCFCompareEqualTo) {
return (__bridge NSString *)currentPhoneValue;
}
}
if(currentPhoneLabel) {
CFRelease(currentPhoneLabel);
}
if(currentPhoneValue) {
CFRelease(currentPhoneValue);
}
}
return nil;
}