这里不需要先获取所有的联系人自己做联系人列表,直接使用系统自带的AddressBookUI/ABPeoplePickerNavigationController.h就好。
首先需要引入如下三个文件
#import <AddressBookUI/ABPeoplePickerNavigationController.h>
#import <AddressBook/ABPerson.h>
#import <AddressBookUI/ABPersonViewController.h>
然后初始化ABPeoplePickerNavigationController。
ABPeoplePickerNavigationController *nav = [[ABPeoplePickerNavigationController alloc] init]; nav.peoplePickerDelegate = self; if(IOS8_OR_LATER){ nav.predicateForSelectionOfPerson = [NSPredicate predicateWithValue:false]; } [self presentViewController:nav animated:YES completion:nil];在iOS8之后,需要添加nav.predicateForSelectionOfPerson = [NSPredicate predicateWithValue:false];这一段代码,否则选择联系人之后会直接dismiss,不能进入详情选择电话。
最后设置代理
//取消选择 - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker { [peoplePicker dismissViewControllerAnimated:YES completion:nil]; }iOS8下
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); long index = ABMultiValueGetIndexForIdentifier(phone,identifier); NSString *phoneNO = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phone, index); if ([phoneNO hasPrefix:@"+"]) { phoneNO = [phoneNO substringFromIndex:3]; } phoneNO = [phoneNO stringByReplacingOccurrencesOfString:@"-" withString:@""]; NSLog(@"%@", phoneNO); if (phone && [ZXValidateHelper checkTel:phoneNO]) { phoneNum = phoneNO; [self.tableView reloadData]; [peoplePicker dismissViewControllerAnimated:YES completion:nil]; return; } } - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person { ABPersonViewController *personViewController = [[ABPersonViewController alloc] init]; personViewController.displayedPerson = person; [peoplePicker pushViewController:personViewController animated:YES]; }iOS7下
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { return YES; } - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); long index = ABMultiValueGetIndexForIdentifier(phone,identifier); NSString *phoneNO = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phone, index); if ([phoneNO hasPrefix:@"+"]) { phoneNO = [phoneNO substringFromIndex:3]; } phoneNO = [phoneNO stringByReplacingOccurrencesOfString:@"-" withString:@""]; NSLog(@"%@", phoneNO); if (phone && [ZXValidateHelper checkTel:phoneNO]) { phoneNum = phoneNO; [self.tableView reloadData]; [peoplePicker dismissViewControllerAnimated:YES completion:nil]; return NO; } return YES; }这里需要读取通讯录数据。首先引入头文件#import <AddressBook/AddressBook.h>
其次根据权限生成通讯录
- (void)loadPerson { ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error){ CFErrorRef *error1 = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error1); [self copyAddressBook:addressBook]; }); } else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized){ CFErrorRef *error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); [self copyAddressBook:addressBook]; } else { dispatch_async(dispatch_get_main_queue(), ^{ // 更新界面 [hud turnToError:@"没有获取通讯录权限"]; }); } }然后循环获取每个联系人的信息,建议自己建个model存起来。
- (void)copyAddressBook:(ABAddressBookRef)addressBook
{
CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
for ( int i = 0; i < numberOfPeople; i++){
ABRecordRef person = CFArrayGetValueAtIndex(people, i);
NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));
//读取middlename
NSString *middlename = (__bridge NSString*)ABRecordCopyValue(person, kABPersonMiddleNameProperty);
//读取prefix前缀
NSString *prefix = (__bridge NSString*)ABRecordCopyValue(person, kABPersonPrefixProperty);
//读取suffix后缀
NSString *suffix = (__bridge NSString*)ABRecordCopyValue(person, kABPersonSuffixProperty);
//读取nickname呢称
NSString *nickname = (__bridge NSString*)ABRecordCopyValue(person, kABPersonNicknameProperty);
//读取firstname拼音音标
NSString *firstnamePhonetic = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNamePhoneticProperty);
//读取lastname拼音音标
NSString *lastnamePhonetic = (__bridge NSString*)ABRecordCopyValue(person, kABPersonLastNamePhoneticProperty);
//读取middlename拼音音标
NSString *middlenamePhonetic = (__bridge NSString*)ABRecordCopyValue(person, kABPersonMiddleNamePhoneticProperty);
//读取organization公司
NSString *organization = (__bridge NSString*)ABRecordCopyValue(person, kABPersonOrganizationProperty);
//读取jobtitle工作
NSString *jobtitle = (__bridge NSString*)ABRecordCopyValue(person, kABPersonJobTitleProperty);
//读取department部门
NSString *department = (__bridge NSString*)ABRecordCopyValue(person, kABPersonDepartmentProperty);
//读取birthday生日
NSDate *birthday = (__bridge NSDate*)ABRecordCopyValue(person, kABPersonBirthdayProperty);
//读取note备忘录
NSString *note = (__bridge NSString*)ABRecordCopyValue(person, kABPersonNoteProperty);
//第一次添加该条记录的时间
NSString *firstknow = (__bridge NSString*)ABRecordCopyValue(person, kABPersonCreationDateProperty);
NSLog(@"第一次添加该条记录的时间%@\n",firstknow);
//最后一次修改該条记录的时间
NSString *lastknow = (__bridge NSString*)ABRecordCopyValue(person, kABPersonModificationDateProperty);
NSLog(@"最后一次修改該条记录的时间%@\n",lastknow);
// 名字
NSLog(@"%@ %@", firstName, lastName);
//获取email多值
ABMultiValueRef email = ABRecordCopyValue(person, kABPersonEmailProperty);
int emailcount = ABMultiValueGetCount(email);
for (int x = 0; x < emailcount; x++)
{
//获取email Label
NSString* emailLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(email, x));
//获取email值
NSString* emailContent = (__bridge NSString*)ABMultiValueCopyValueAtIndex(email, x);
}
//读取地址多值
ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty);
int count = ABMultiValueGetCount(address);
for(int j = 0; j < count; j++)
{
//获取地址Label
NSString* addressLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(address, j);
//获取該label下的地址6属性
NSDictionary* personaddress =(__bridge NSDictionary*) ABMultiValueCopyValueAtIndex(address, j);
NSString* country = [personaddress valueForKey:(NSString *)kABPersonAddressCountryKey];
NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey];
NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey];
NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey];
NSString* zip = [personaddress valueForKey:(NSString *)kABPersonAddressZIPKey];
NSString* coutntrycode = [personaddress valueForKey:(NSString *)kABPersonAddressCountryCodeKey];
}
//获取dates多值
ABMultiValueRef dates = ABRecordCopyValue(person, kABPersonDateProperty);
int datescount = ABMultiValueGetCount(dates);
for (int y = 0; y < datescount; y++)
{
//获取dates Label
NSString* datesLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(dates, y));
//获取dates值
NSString* datesContent = (__bridge NSString*)ABMultiValueCopyValueAtIndex(dates, y);
}
//获取kind值
CFNumberRef recordType = ABRecordCopyValue(person, kABPersonKindProperty);
if (recordType == kABPersonKindOrganization) {
// it's a company
NSLog(@"it's a company\n");
} else {
// it's a person, resource, or room
NSLog(@"it's a person, resource, or room\n");
}
//获取IM多值
ABMultiValueRef instantMessage = ABRecordCopyValue(person, kABPersonInstantMessageProperty);
for (int l = 1; l < ABMultiValueGetCount(instantMessage); l++)
{
//获取IM Label
NSString* instantMessageLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(instantMessage, l);
//获取該label下的2属性
NSDictionary* instantMessageContent =(__bridge NSDictionary*) ABMultiValueCopyValueAtIndex(instantMessage, l);
NSString* username = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageUsernameKey];
NSString* service = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageServiceKey];
}
//读取电话多值
ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
for (int k = 0; k<ABMultiValueGetCount(phone); k++)
{
//获取电话Label
NSString * personPhoneLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phone, k));
//获取該Label下的电话值
NSString * personPhone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phone, k);
NSLog(@"--电话%@", personPhone);
}
//获取URL多值
ABMultiValueRef url = ABRecordCopyValue(person, kABPersonURLProperty);
for (int m = 0; m < ABMultiValueGetCount(url); m++)
{
//获取电话Label
NSString * urlLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(url, m));
//获取該Label下的电话值
NSString * urlContent = (__bridge NSString*)ABMultiValueCopyValueAtIndex(url,m);
NSLog(@"url:%@", urlContent);
}
//读取照片
NSData *image = (__bridge NSData*)ABPersonCopyImageData(person);
}
}
在iOS9中,apple终于解决了这个问题,全新的Contacts Framework将完全替代AddressBookFramework。
创建CNMutableContact对象:
CNMutableContact * contact = [[CNMutableContact alloc] init];设置联系人头像:
contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"Icon.png"]);设置联系人姓名:
//设置名字 contact.givenName = @"stephen"; //设置姓氏 contact.familyName = @"zhuang";设置联系人邮箱:
CNLabeledValue *homeEmail = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:@"379128008@qq.com"]; CNLabeledValue *workEmail =[CNLabeledValue labeledValueWithLabel:CNLabelWork value:@"379128008@qq.com"]; contact.emailAddresses = @[homeEmail,workEmail];这里需要注意,emailAddresses属性是一个数组,数组中是才CNLabeledValue对象,CNLabeledValue对象主要用于创建一些联系人属性的键值对应,通过这些对应,系统会帮我们进行数据的格式化,例如CNLabelHome,就会将号码格式成家庭邮箱的格式,相应的其他键如下:
//家庭 CONTACTS_EXTERN NSString * const CNLabelHome NS_AVAILABLE(10_11, 9_0); //工作 CONTACTS_EXTERN NSString * const CNLabelWork NS_AVAILABLE(10_11, 9_0); //其他 CONTACTS_EXTERN NSString * const CNLabelOther NS_AVAILABLE(10_11, 9_0); // 邮箱地址 CONTACTS_EXTERN NSString * const CNLabelEmailiCloud NS_AVAILABLE(10_11, 9_0); // url地址 CONTACTS_EXTERN NSString * const CNLabelURLAddressHomePage NS_AVAILABLE(10_11, 9_0); // 日期 CONTACTS_EXTERN NSString * const CNLabelDateAnniversary NS_AVAILABLE(10_11, 9_0);设置联系人电话:
contact.phoneNumbers = @[[CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberiPhone value:[CNPhoneNumber phoneNumberWithStringValue:@"12344312321"]]];联系人电话的配置方式和邮箱类似,键值如下:
CONTACTS_EXTERN NSString * const CNLabelPhoneNumberiPhone NS_AVAILABLE(10_11, 9_0); CONTACTS_EXTERN NSString * const CNLabelPhoneNumberMobile NS_AVAILABLE(10_11, 9_0); CONTACTS_EXTERN NSString * const CNLabelPhoneNumberMain NS_AVAILABLE(10_11, 9_0); CONTACTS_EXTERN NSString * const CNLabelPhoneNumberHomeFax NS_AVAILABLE(10_11, 9_0); CONTACTS_EXTERN NSString * const CNLabelPhoneNumberWorkFax NS_AVAILABLE(10_11, 9_0); CONTACTS_EXTERN NSString * const CNLabelPhoneNumberOtherFax NS_AVAILABLE(10_11, 9_0); CONTACTS_EXTERN NSString * const CNLabelPhoneNumberPager NS_AVAILABLE(10_11, 9_0);设置联系人地址:
CNMutablePostalAddress * homeAdress = [[CNMutablePostalAddress alloc]init]; homeAdress.street = @""; homeAdress.city = @""; homeAdress.state = @""; homeAdress.postalCode = @""; contact.postalAddresses = @[[CNLabeledValue labeledValueWithLabel:CNLabelHome value:homeAdress]];设置生日:
NSDateComponents * birthday = [[NSDateComponents alloc]init]; birthday.day=2; birthday.month=11; birthday.year=1989; contact.birthday=birthday;写入操作:
CNContactStore * store = [[CNContactStore alloc]init]; [store executeSaveRequest:saveRequest error:nil];四、选择联系人
- (void)insertNewObject:(id)sender { CNContactPickerViewController * con = [[CNContactPickerViewController alloc] init]; con.delegate = self; [self presentViewController:con animated:YES completion:nil]; } - (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(nonnull CNContactProperty *)contactProperty { CNContact *contact = contactProperty.contact; CNPhoneNumber *phoneNumer = contactProperty.value; NSString *phoneValue = phoneNumer.stringValue; NSString *lastname = contact.familyName; NSString *firstname = contact.givenName; ZXPersonTemp *person = [[ZXPersonTemp alloc] init]; person.name = [NSString stringWithFormat:@"%@%@",lastname,firstname]; person.phone = phoneValue; [_addressBookArray insertObject:person atIndex:0]; [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic]; [picker dismissViewControllerAnimated:YES completion:nil]; }(原文中 iOS9以下 获取通讯录 类型强转时加 __bridge) 文/千煌89(简书作者) 原文链接:http://www.jianshu.com/p/6acad14cf3c9 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。转载于:https://www.cnblogs.com/LoveStoryJX/p/5695963.html
相关资源:数据结构—成绩单生成器