一.通信录开发
- 通信录开发主要是获取用户手机中的联系人
- 通过获取用户的通信录,可以在应用中添加好友等
二.如何访问用户的通讯录
- 在iOS9之前,有2个框架可以访问用户的通讯录
- 目前需要适配iOS8,所有也必须进行学习
- AddressBookUI.framework
- 提供了联系人列表界面、联系人详情界面、添加联系人界面等
- 一般用于选择联系人
- AddressBook.framework
- 纯C语言的API,仅仅是获得联系人数据
- 没有提供UI界面展示,需要自己搭建联系人展示界面
- 里面的数据类型大部分基于Core Foundation框架,使用起来极其蛋疼
- 在iOS9开始,也有2个框架可以访问用户的通讯录
- ContactsUI.framework
- 对应AddressBookUI.framework
- Contacts.framework
iOS9之前获取通信录
一.AddressBookUI的使用
- 使用步骤
- 创建选择联系人控制器
- 设置代理
- 实现代理方法(在代理方法中拿到用户选择的联系人)
- 弹出控制器
- 代码实现
1 // 1.创建选择联系人的界面
2 ABPeoplePickerNavigationController *ppnc = [[ABPeoplePickerNavigationController alloc] init];
3
4 // 2.设置代理(在代理方法中可以拿到用户的联系人信息)
5 ppnc.peoplePickerDelegate = self;
6
7 // 3.弹出控制器
8 [self presentViewController:ppnc animated:YES completion:nil];
1 #pragma mark - 实现ABPeoplePickerNavigationController的代理方法,在代理方法中获取通信录信息
2 /**
3 * 当选择选中一个联系人时就会执行该方法(当实现该方法时,选中了联系人会自动退出控制器)
4 *
5 * @param peoplePicker 联系人选择控制器
6 * @param person 选中的联系人
7 */
8 - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
9 {
10 // 1.获取联系人的姓名
11 CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
12 CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
13 NSLog(@"%@ %@", firstName, lastName);
14
15 // 2.获取电话号码
16 ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
17 CFIndex phoneCount = ABMultiValueGetCount(phones);
18 for (CFIndex i = 0; i < phoneCount; i++) {
19 // 2.1.获取电话号码
20 CFStringRef phoneLabel = ABMultiValueCopyLabelAtIndex(phones, i);
21 CFStringRef phoneValue = ABMultiValueCopyValueAtIndex(phones, i);
22 NSLog(@"%@ %@", phoneLabel, phoneValue);
23 }
24 }
25
26 /**
27 * 当用户选择某一个联系人的某一个属性时会调用该方法
28 *
29 * @param person 选择的联系人
30 * @param property 选择的属性
31 * @param identifier 属性对应的标识符
32 */
33 - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
34 {
35 }
二.AddressBook的使用
- 使用步骤
- 获取用户的授权
- 获取联系人信息
- 获取授权状态
- 如果是已经授权,则获取联系人信息
- 创建通信录对象
- 获取通信录中所有的联系人
- 遍历所有的联系人,获取联系人信息
- 获取用户授权的代码实现
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1.获取授权状态
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
// 2.判断授权状态
if (status == kABAuthorizationStatusNotDetermined) {
// 2.1.创建通信录对象
ABAddressBookRef addressBook = ABAddressBookCreate();
// 2.2.请求授权
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted) {
NSLog(@"授权成功");
} else {
NSLog(@"授权失败");
}
});
}
return YES;
}
1 // 1.获取授权状态
2 ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
3
4 // 2.如果是没有授权,则直接返回
5 if (status != kABAuthorizationStatusAuthorized) return;
6
7 // 3.获取联系人
8 // 3.1.创建通信录对象
9 ABAddressBookRef addressBook = ABAddressBookCreate();
10
11 // 3.2.从通信录对象中获取所有的联系人
12 CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
13
14 // 3.2.遍历所有的联系人
15 CFIndex peopleCount = CFArrayGetCount(peopleArray);
16 for (CFIndex i = 0; i < peopleCount; i++) {
17 // 3.3.获取i位置的联系人
18 ABRecordRef person = CFArrayGetValueAtIndex(peopleArray, i);
19
20 // 1.获取联系人的姓名
21 CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
22 CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
23 NSLog(@"%@ %@", firstName, lastName);
24
25 // 2.获取电话号码
26 ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
27 CFIndex phoneCount = ABMultiValueGetCount(phones);
28 for (CFIndex i = 0; i < phoneCount; i++) {
29 // 2.1.获取电话号码
30 CFStringRef phoneLabel = ABMultiValueCopyLabelAtIndex(phones, i);
31 CFStringRef phoneValue = ABMultiValueCopyValueAtIndex(phones, i);
32 NSLog(@"%@ %@", phoneLabel, phoneValue);
33 }
34 }
iOS9之后获取通信录
- 使用步骤
- 创建选择联系人控制器
- 设置代理
- 实现代理方法(在代理方法中拿到用户选择的联系人)
- 弹出控制器
- 代码实现
1 #pragma mark - <CNContactPickerViewController代理方法>
2 /**
3 * 当选中一个联系人时,会执行该方法
4 *
5 * @param picker 选择联系人的控制器
6 * @param contact 选择的联系人
7 */
8 - (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact
9 {
10 // 1.获取联系人的姓名
11 NSString *firstName = contact.givenName;
12 NSString *lastName = contact.familyName;
13 NSLog(@"%@ %@", firstName, lastName);
14
15 // 2.获取联系人的电话号码
16 NSArray *phoneNumers = contact.phoneNumbers;
17 for (CNLabeledValue *labelValue in phoneNumers) {
18 CNPhoneNumber *phoneNumber = labelValue.value;
19 NSString *phoneValue = phoneNumber.stringValue;
20 NSString *phoneLabel = labelValue.label;
21 NSLog(@"%@ %@", phoneValue, phoneLabel);
22 }
23 }
24
25 /**
26 * 当选中某一个联系人的某一个属性时,会执行该方法
27 *
28 * @param contactProperty 选中的联系人属性
29 */
30 - (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty{}
- 使用步骤
- 获取用户的授权
- 获取联系人信息
- 获取授权状态
- 如果是已经授权,则获取联系人信息
- 创建通信录对象
- 创建联系人请求对象
- 遍历所有的联系人,获取联系人信息
- 获取用户授权的代码实现
- 授权的代码实现
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
2
3 // 1.获取授权状态
4 CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
5
6 // 2.如果是未决定状态,则请求授权
7 if (status == CNAuthorizationStatusNotDetermined) {
8 // 3.创建CNContactStore对象
9 CNContactStore *contactStore = [[CNContactStore alloc] init];
10
11 // 4.请求授权
12 [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
13 if (granted) {
14 NSLog(@"授权成功");
15 } else {
16 NSLog(@"授权失败:%@", error);
17 }
18 }];
19 }
20
21 return YES;
22 }
1 // 1.获取授权状态
2 CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
3
4 // 2.如果是没有授权,则直接返回
5 if (status != CNAuthorizationStatusAuthorized) return;
6
7 // 3.创建通信录的对象
8 CNContactStore *contactStore = [[CNContactStore alloc] init];
9
10 // 4.创建联系人请求对象
11 NSArray *keys = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey];
12 CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys];
13
14 // 5.遍历所有的联系人
15 [contactStore enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
16 // stop是决定是否要停止
17 // 1.获取姓名
18 NSString *firstname = contact.givenName;
19 NSString *lastname = contact.familyName;
20 NSLog(@"%@ %@", firstname, lastname);
21
22 // 2.获取电话号码
23 NSArray *phones = contact.phoneNumbers;
24
25 // 3.遍历电话号码
26 for (CNLabeledValue *labelValue in phones) {
27 CNPhoneNumber *phoneNumber = labelValue.value;
28 NSLog(@"%@ %@", phoneNumber.stringValue, labelValue.label);
29 }
30 }];