ios开发 通讯录

一.通信录开发

  • 通信录开发主要是获取用户手机中的联系人
  • 通过获取用户的通信录,可以在应用中添加好友等

二.如何访问用户的通讯录

  • 在iOS9之前,有2个框架可以访问用户的通讯录
    • 目前需要适配iOS8,所有也必须进行学习
    • AddressBookUI.framework
      • 提供了联系人列表界面、联系人详情界面、添加联系人界面等
      • 一般用于选择联系人
    • AddressBook.framework
      • 纯C语言的API,仅仅是获得联系人数据
      • 没有提供UI界面展示,需要自己搭建联系人展示界面
      • 里面的数据类型大部分基于Core Foundation框架,使用起来极其蛋疼
  • 在iOS9开始,也有2个框架可以访问用户的通讯录
    • ContactsUI.framework
      • 对应AddressBookUI.framework
    • Contacts.framework
      • 对应AddressBook.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     }];

 

 

       

posted @ 2016-07-28 18:05  超神船长  阅读(230)  评论(0编辑  收藏  举报