美文网首页
获取通讯录-AddressBook

获取通讯录-AddressBook

作者: 面糊 | 来源:发表于2016-06-02 19:30 被阅读142次

使用步骤

  1. AddressBook.framework框架, 由于大部分都是基于CoreFoundation实现的, 因此要注意一些细节

    • CoreFoundation变量基本都是: 变量名+Ref 类型的变量
    • 由于ARC管理的是Foundation的OC对象, 因此CoreFoundation的对象要手动释放内存
    • 该框架如果要访问通讯录, 一定要向用户请求授权
    • 该框架没有UI界面, 必须通过数据的获取后, 手动搭建UI界面
    • 对于微信那种, 检测通讯录中的好友, 就不需要UI界面, 直接检测即可, 所以使用这个框架比较合适
  2. 大致使用步骤

    1. 在使用该框架之前, 一定要先向用户发送授权申请

       /*
        kABAuthorizationStatusNotDetermined  用户还没有决定, 想用户发送申请授权的请求
        kABAuthorizationStatusRestricted     由于某种原因访问受限, 这个通常是用户手机上的一些设定, 直接提醒用户自行检查即可
        kABAuthorizationStatusDenied         你的App已经被用户拒绝访问了, 给用户个提示, 提醒他去设置页面解除访问
        kABAuthorizationStatusAuthorized     已经授权了, 可以访问
        */
       - (void)getAuthor {
           
           // 判断当前的授权状态是否为"用户未决定"
           if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
               
               // 1. 创建通讯录对象
               ABAddressBookRef bookRef = ABAddressBookCreate();
               
               // 2. 发送通讯录授权申请
               ABAddressBookRequestAccessWithCompletion(bookRef, ^(bool granted, CFErrorRef error) {
                   // 3. 根据回调, 判断是否授权成功
                   if (granted) {
                       NSLog(@"授权成功");
                   } else {
                       NSLog(@"授权失败");
                   }
               });
           }
       }
      
    2. 获取通讯录中的信息

      • 在获取之前, 谨慎起见应该再次判断一下授权状态, 提示一下用户

      • 获取通讯录中所有的信息, 返回的是一个数组, 这个数组必须用CoreFoundation框架的数组来接收: CFArrayRef

      • 注意1: 如果要使用CoreFoundation框架中的字符串, 应该先转换为Foundation的字符串再去使用

      • 注意2: 电话号码会有很多不同的类别: 家用/手机/主要等等, 因此返回的也是数组, 所以要通过遍历来获取

      • 注意3: 不再使用的CoreFoundation对象, 一定要手动释放, 否则会有内存泄露

          - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
              
              // 1. 判断当前的授权状态
              if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {
                  NSLog(@"请先授权");
                  return;
              }
              
              // 2. 获取通讯录对象
              ABAddressBookRef bookRef = ABAddressBookCreate();
              
              // 3. 获取通讯录中所有的联系人信息
              CFArrayRef arrayRef = ABAddressBookCopyArrayOfAllPeople(bookRef);
              
              // 4. 遍历所有的联系人信息, 获取其中需要的内容
              CFIndex count = CFArrayGetCount(arrayRef);
              for (int i = 0; i < count; i++) {
                  
                  // 4.1 创建一个记录对象
                  ABRecordRef record = CFArrayGetValueAtIndex(arrayRef, i);
                  
                  // 4.2 获取姓名
                  NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty);
                  NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty);
                  NSLog(@"%@--%@", firstName, lastName);
                  
                  // 4.3 获取电话号码
                  ABMultiValueRef mutiValue = ABRecordCopyValue(record, kABPersonPhoneProperty);
                  CFIndex count = ABMultiValueGetCount(mutiValue);
                  
                  // 5. 遍历电话号码的数组
                  for (int i = 0; i < count; i++) {
                      NSString *label = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(mutiValue, i);
                      NSString *phone = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(mutiValue, i);
                      NSLog(@"%@--%@", label, phone);
                  }
              }
              
              // 6. 释放对象
              CFRelease(bookRef);
              CFRelease(arrayRef);
          }

相关文章

网友评论

      本文标题:获取通讯录-AddressBook

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