美文网首页
获取通讯录--AddressBookUI的使用

获取通讯录--AddressBookUI的使用

作者: 面糊 | 来源:发表于2016-06-01 23:42 被阅读590次

    一. 通讯录的简介

    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的使用

          本文链接:https://www.haomeiwen.com/subject/mcahdttx.html