获取通讯录--AddressBookUI的使用

一. 通讯录的简介

  1. 通讯录获取主要用于一些即时通讯App, 如微信, 可以获取你的手机通讯录, 查看哪些好友注册了微信号

  2. 目前通讯录获取的方案

    1. AddressBookUI.framework框架
      • 这个框架提供了联系人列表界面/详情界面/添加联系人界面等
      • 这个框架一般用于查看联系人/添加联系人等功能
    2. AddressBook.framework框架
      • 该框架与上面相比, 没有UI二字, 因此他并没有提供UI界面的展示, 需要手动搭建界面
      • 该框架是一个纯C语言的API, 主要用户获取联系人的数据
      • 里面的内容大部分是基于CoreFoundation框架的数据类型, 因此使用较难
      • 从iOS6开始, 需要得到用户的授权才能访问通讯录, 因此还要检查用户是否授权了
    3. RHAddressBook三方框架
      • 该框架是对AddressBook.framework框架的封装
      • 使用较为简单, 不过较为古老
    4. iOS9.0新推出的两个框架:
      • ContactsUI.framework -> AddressBookUI.framework的替代品
      • Contacts.framework -> AddressBook.framework的替代品
      • 这两个框架都转变为了面对对象的封装, 使用很简单, 也比较强大, 但是苦于为iOS9.0+专用, 对于低版本适配很是无奈

二. AddressBookUI的使用

  1. 实现步骤
    1. 创建选择联系人的控制器:

    2. 设置选择联系人控制器的代理属性

    3. 弹出控制器

       // 1. 创建联系人选择控制器
       ABPeoplePickerNavigationController *pickVC = [[ABPeoplePickerNavigationController alloc] init];
       
       // 2. 设置代理
       pickVC.peoplePickerDelegate = self;
       
       // 3. 弹出控制器
       [self presentViewController:pickVC animated:YES completion:nil];
      
    4. 遵守协议, 并且实现代理方法: ABPeoplePickerNavigationControllerDelegate

    5. 当点击某个联系人时调用的方法:

      • 联系人的属性:
        • 简单属性: firstName/lastName等
        • 复杂属性: 电话号码/电子邮件
          • 对于复杂属性, 要使用ABRecordCopyValue函数返回的ABMutiValueRef类型来接收
          • ABRecordCopyValue需要两个参数, 一个是联系人对象, 一个是需要获取的数据关键字
          • 复杂属性要指定取出哪个属性, 比如电话, 划分为座机/手机等等不同的电话, 因此该类型包含了多个数据
          • ABMutiValueRef是一个包含了多个数据的结合, 要通过遍历其中的数据, 才能取出每一个
                    // 选择某个联系人的时候调用
                    - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person {
                        
                        NSLog(@"选中了某个联系人");
                        
                        // 取出联系人的姓名数据
                        CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
                        CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
                        
                        // 将CoreFoundation的字符串, 转化为OC的字符串, 并且转移内存管理权
                        NSString *first = CFBridgingRelease(firstName);
                        NSString *last = CFBridgingRelease(lastName);
                        
                        NSLog(@"%@--%@", first, last);
                        
                        // 取出电话的数据
                        ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
                        CFIndex count = ABMultiValueGetCount(multi);
                        
                        for (int i = 0; i < count; i++) {
                            NSString *label = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(multi, i);
                            NSString *phone = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(multi, i);
                            NSLog(@"%@---%@", label, phone);
                        }
                    }

你可能感兴趣的:(获取通讯录--AddressBookUI的使用)