苹果允许访问用户的通讯录,提供的api分为两种,区别在于有没有UI界面,工作中一般都会选用有UI界面,从iOS6开始,无UI界面的通讯录信息需要获取到用户的授权才能访问通讯录,所以在使用之前是需要检测用户的授权状态
有UI界面 (无需授权)
Paste_Image.png
iOS 9 之前
点击屏幕开始选择
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 1.创建选择联系人的界面
ABPeoplePickerNavigationController *ppnc = [[ABPeoplePickerNavigationController alloc] init];
// 2.设置代理
ppnc.peoplePickerDelegate = self;
// 3.弹出界面(modal)
[self presentViewController:ppnc animated:YES completion:nil];
}
底部弹出通讯录控制器
// 何时触发: 选中某一个联系人时,会执行该方法
// 备注: 如果实现该方法,那么选中一个联系人,系统会自动退出控制器 如果不实现就会来到用户详情的控制器
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{
// ABRecordRef : 记录,一个联系人就是一条记录
// 1.获取该联系人的姓名
CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
/*
桥接方式:
(__bridge NSString *) : 仅仅是将对象的所有权交给Foundation的引用使用
(__bridge_transfer NSString *) : 对象所有权交给Foundation的引用,并且内存也交给它来管理
*/
NSString *firstname = (__bridge_transfer NSString *)firstName;
NSString *lastname = (__bridge_transfer NSString *)lastName;
NSLog(@"firstname:%@ lastname:%@", firstname, lastname);
// 2.获取该联系人的电话号码
// 2.1.获取所有的电话
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
// 2.2.遍历所有的电话
CFIndex count = ABMultiValueGetCount(phones);
for (int i = 0; i < count; i++) {
// 2.2.1.获取电话号码
NSString *phoneValue = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, i);
// 2.2.2.获取电话的标签
NSString *phoneLabel = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(phones, i);
NSLog(@"%@ %@", phoneLabel, phoneValue);
}
// 3.释放不再使用的对象
CFRelease(phones);
}
点击取消会触发该方法
// 点击了取消按钮会执行该方法
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
NSLog(@"peoplePicker:%@",peoplePicker);
}
在用户详情控制器点击属性之会来到这里
// 如果实现了该方法,那么选中一个联系人的一个属性后,系统会自动退出控制器
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
NSLog(@"person:%@",person);
NSLog(@"property:%zd",property);
NSLog(@"identifier:%zd",identifier);
}
iOS9以后 也提供了两套框架 使用起来更加的面向对象
ContactsUI.framework 有UI
Contacts.framework 无UI
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 1.创建联系人的界面
CNContactPickerViewController *cpvc = [[CNContactPickerViewController alloc] init];
// 2.设置代理
cpvc.delegate = self;
// 3.弹出控制器
[self presentViewController:cpvc animated:YES completion:nil];
}
#pragma mark - 实现CNContactPickerViewController的代理方法
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact
{
// 1.获取联系人的姓名
NSString *firstname = contact.familyName;
NSString *lastname = contact.givenName;
NSLog(@"%@ %@", firstname, lastname);
// 2.获取电话号码
NSArray *phones = contact.phoneNumbers;
// 3.遍历所有的电话号码
for (CNLabeledValue *labeldValue in phones) {
// 3.1.取出电话号码的标签
NSString *phoneLabel = labeldValue.label;
// 3.2.取出电话号码的值
CNPhoneNumber *phoneNumer = labeldValue.value;
NSString *phoneValue = phoneNumer.stringValue;
NSLog(@"%@ %@", phoneLabel, phoneValue);
}
}
// 取消的时候执行该方法
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker{
NSLog(@"点击了取消");
}
系统提供的通讯录UI界面.png
网友评论