< 返回首页

标哥的笔记,是记录在日常学习技术和日常开发中那些年遇到过的坑!本站为新站,原"标哥的技术博客"中的文章会慢慢移到本站,欢迎收藏本站!
在使用本站过程中,有任何建议请联系标哥! 另,承接App开发、网站开发和微信小程序开发!欢迎联系我们


iOS添加、删除通讯录

 作者:标哥    发布日期:2017-01-12 23:34    阅读量:1112次
 

iOS中操作通讯录是需要请求用户的授权的,如果没有得到用户的授权,就没有下文的。对于一些app很恶心,请求得到用户的授权后,给用户的通讯录中插入广告信息,比如常见的就是日历。

回到我们的话题,今天做到这个么小需求,需要添加N条手机号到通讯录,同样也要能清空通讯录。在完成后, 将这两段代码片段记录下来,供大家参考!

添加到通讯录

下面是添加到通讯录的一段代码片段,这里只是手机号作为firstName,功能很单一,具体要添加多个值需要自己去添加!

CFErrorRef error = NULL;
  
//创建一个通讯录操作对象
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
  
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted && !error) {
  for (NSUInteger i = 0; i < self.textField.text.integerValue && i < count; ++i) {
    @autoreleasepool {
      // 创建一条新的联系人纪录
      ABRecordRef newRecord = ABPersonCreate();
      
      // 为新联系人记录添加属性值
      ABRecordSetValue(newRecord,
                       kABPersonFirstNameProperty,
                       (__bridge CFTypeRef)self.phoneArray[i],
                       &error);
      
      //创建一个多值属性
      ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType);
      ABMultiValueAddValueAndLabel(multi,
                                   (__bridge CFTypeRef)self.phoneArray[i],
                                   kABPersonPhoneMobileLabel, NULL);
      
      //将多值属性添加到记录
      ABRecordSetValue(newRecord, kABPersonPhoneProperty, multi, &error);
      //添加记录到通讯录操作对象
      ABAddressBookAddRecord(addressBook, newRecord, &error);
      
      CFRelease(newRecord);
      CFRelease(multi);
    }
  }
  
  //保存通讯录操作对象
  ABAddressBookSave(addressBook, &error);
  CFRelease(addressBook);
}

清空通讯录

下面是一段清空通讯录的代码片段,一定要小心哦,清空前一定要慎重!

CFErrorRef error = NULL;
  
//创建一个通讯录操作对象
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
  
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
    if (granted && !error) {
      CFArrayRef personArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
      CFIndex personCount = ABAddressBookGetPersonCount(addressBook);
      
      if (personCount <= 0) {
        dispatch_async(dispatch_get_main_queue(), ^{
          [SVProgressHUD showSuccessWithStatus:@"清空通讯录成功"];
        });
        return;
      }
      
      for (int i = 0; i < personCount; i++) {
        ABRecordRef ref = CFArrayGetValueAtIndex(personArray, i);
        // 删除联系人
        ABAddressBookRemoveRecord(addressBook, ref, nil);
      }
      
      // 保存通讯录操作对象
      ABAddressBookSave(addressBook, &error);
      CFRelease(addressBook);
      
      dispatch_async(dispatch_get_main_queue(), ^{
        if (!error) {
          [SVProgressHUD showSuccessWithStatus:@"清空通讯录成功"];
        } else {
          [SVProgressHUD showErrorWithStatus:@"清空通讯录失败"];
        }
      });
    }
});

小结

iOS9.0以后ABAddressBook这个framework被废弃了,推荐的是CNContact这个类来处理。不过我们都需要兼容9.0以下版本,所以现在不用管它。


承接:ThinkPHP项目开发、网站项目开发、微信项目开发、微信小程序项目开发、App开发,欢迎联系标哥QQ632840804