ios开发 通讯录
一.通信录开发
- 通信录开发主要是获取用户手机中的联系人
- 通过获取用户的通信录,可以在应用中添加好友等
二.如何访问用户的通讯录
- 在iOS9之前,有2个框架可以访问用户的通讯录
- 目前需要适配iOS8,所有也必须进行学习
- AddressBookUI.framework
- 提供了联系人列表界面、联系人详情界面、添加联系人界面等
- 一般用于选择联系人
- AddressBook.framework
- 纯C语言的API,仅仅是获得联系人数据
- 没有提供UI界面展示,需要自己搭建联系人展示界面
- 里面的数据类型大部分基于Core Foundation框架,使用起来极其蛋疼
- 在iOS9开始,也有2个框架可以访问用户的通讯录
- ContactsUI.framework
- 对应AddressBookUI.framework
- Contacts.framework
- 对应AddressBook.framework
- ContactsUI.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之后获取通信录
一.ContactsUI的使用
- 使用步骤
- 创建选择联系人控制器
- 设置代理
- 实现代理方法(在代理方法中拿到用户选择的联系人)
- 弹出控制器
- 代码实现
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{}
二.Contacts的使用
- 使用步骤
- 获取用户的授权
- 获取授权状态
- 如果用户是未决定状态,则请求授权
- 获取联系人信息
- 获取授权状态
- 如果是已经授权,则获取联系人信息
- 创建通信录对象
- 创建联系人请求对象
- 遍历所有的联系人,获取联系人信息
- 获取用户的授权
- 获取用户授权的代码实现
- 注意:通常在应用启动时就询问用户授权
- 授权的代码实现
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 }];