#import <AddressBook/AddressBook.h>

#pragma mark 删除一个号码
- (void)deleteLocalMarkSuccess:(void(^)(BOOL success))successBlock{ dispatch_async(dispatch_get_global_queue(, ), ^{
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef records;
// 获取通讯录中全部联系人
records = ABAddressBookCopyArrayOfAllPeople(addressBook); // 遍历全部联系人,检查已存号码库信息数量
for (int i=; i<CFArrayGetCount(records); i++)
{
ABRecordRef record = CFArrayGetValueAtIndex(records, i); CFTypeRef phones = ABRecordCopyValue(record, kABPersonPhoneProperty);
// CFArrayRef values = ABMultiValueCopyArrayOfAllValues(phones);
// NSArray *arr =(__bridge NSArray *)(values);
// if (!arr.count) {
// continue;
// }
NSString *firstphoneNumber = (CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones,)));
NSString *firstLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones,));
NSLog(@"firstPhone = %@ firstLabel = %@",firstphoneNumber,firstLabel);
CFStringRef firstNameRef = ABRecordCopyValue(record, kABPersonFirstNameProperty);
//这里是特殊情况的比较号码并删除,正常是比较姓名即可
if ([firstLabel isEqualToString:@"#0云助手号码库yunzhushou"])
{
bool done = ABAddressBookRemoveRecord(addressBook, record, nil);
successBlock(done);
break;
}
} ABAddressBookSave(addressBook, nil);
CFRelease(addressBook);
}); }
#pragma mark 删除一个号码属性

- (void)deletePersonPropertyWithNumber:(NSString *)phoneNumber withBlock:(void(^)(BOOL success))successBlock{

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
dispatch_async(dispatch_get_global_queue(, ), ^{
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef records;
// 获取通讯录中全部联系人
records = ABAddressBookCopyArrayOfAllPeople(addressBook);
__block bool done = NO;
// 遍历全部联系人,检查是否存在指定号码再进行删除
for (int i=; i<CFArrayGetCount(records); i++)
{
ABRecordRef record = CFArrayGetValueAtIndex(records, i);
CFTypeRef phones = ABRecordCopyValue(record, kABPersonPhoneProperty);
NSString *firstLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones,));
CFArrayRef phoneNums = ABMultiValueCopyArrayOfAllValues(phones); if ([firstLabel isEqualToString:@"#0云助手号码库yunzhushou"])
{
for (int j=; j<CFArrayGetCount(phoneNums); j++)
{
NSString *phone = (NSString*)CFArrayGetValueAtIndex(phoneNums, j);
if ([phone isEqualToString:phoneNumber])
{
ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutableCopy(phones);
done = ABMultiValueRemoveValueAndLabelAtIndex(multiPhone,j);
ABRecordSetValue(record, kABPersonPhoneProperty, multiPhone, nil);
CFRelease(multiPhone); break;
}else{
NSLog(@"没有找到要删除的号码:%@",phoneNumber);
}
}
}else
{
NSLog(@"没有找到要删除的联系人:%@",phoneNumber); }
} successBlock(done);
ABAddressBookSave(addressBook, nil);
CFRelease(addressBook); }); }); }
#pragma mark 增加一个号码属性
- (void)addPersonPropertyWithNumberModel:(NumberModel *)numberModel withBlock:(void(^)(BOOL success))successBlock{ dispatch_async(dispatch_get_global_queue(, ), ^{
__block bool done = NO;
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef records;
// 获取通讯录中全部联系人
records = ABAddressBookCopyArrayOfAllPeople(addressBook); // 遍历全部联系人,检查是否存在指定号码再进行add
bool have = NO;
for (int i=; i<CFArrayGetCount(records); i++)
{
ABRecordRef record = CFArrayGetValueAtIndex(records, i);
CFTypeRef phones = ABRecordCopyValue(record, kABPersonPhoneProperty);
NSString *firstLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones,));
NSLog(@"firstLabel = %@",firstLabel);
CFStringRef firstNameRef = ABRecordCopyValue(record, kABPersonFirstNameProperty);
CFStringRef lastName = ABRecordCopyValue(record, kABPersonLastNameProperty);
//此处正常应该根据名字判断 下面是特殊情况根据首个号码标签属性来判断
if ([firstLabel isEqualToString:@"#0云助手号码库yunzhushou"])
{
have = YES;
BOOL containNumber = NO;
//存在 本地联系人只要添加一对标签号码属性
//已存在则不添加
CFArrayRef phoneNumbers = ABMultiValueCopyArrayOfAllValues(phones);
for (int j ; j < CFArrayGetCount(phoneNumbers); j++) {
NSString *number = (__bridge NSString *)CFArrayGetValueAtIndex(phoneNumbers, j);
if ([number isEqualToString:numberModel.phone]) {
containNumber = YES;
break;
}
}
if (!containNumber) {
ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutableCopy(phones); ABMultiValueAddValueAndLabel(multiPhone, (__bridge CFTypeRef)(numberModel.phone), (__bridge CFStringRef)(numberModel.rpt_type), NULL);
ABRecordSetValue(record, kABPersonPhoneProperty, multiPhone, nil);
CFRelease(multiPhone);
done = ABAddressBookSave(addressBook, nil); NSLog(@"本地标记联系人存在 只是添加属性");
break ; } } } if (!have) {
//不存在 首次添加
NSLog(@"本地标记联系人不存在 首次添加");
// [self wirteLocalPhoneNumbersToContactFromDB];
done = YES;
} ABAddressBookSave(addressBook, nil);
CFRelease(addressBook);
successBlock(done);
}); }
//iOS9 组织多号码以备写入新的联系人
- (void)numbersReadyWriteToContact{ CNMutableContact *mContact = [[CNMutableContact alloc]init];
mContact.imageData = UIImagePNGRepresentation([UIImage
imageNamed:@""]);
mContact.givenName = @"";
mContact.familyName = @"";
NSString *label = @"住宅";
NSString *number = -;
NSMutableArray *arrPhones =[NSMutableArray array];
CNLabeledValue *phone = [CNLabeledValue labeledValueWithLabel:label value:[CNPhoneNumber phoneNumberWithStringValue:number]];
[arrPhones addObject:phone];
mContact.phoneNumbers = arrPhones;
[self stroreContact: contact];
}
//iOS9 存入新联系人 -多值
- (void)stroreContact:(CNMutableContact *)contact
{
BOOL existPhone = NO;
if (contact.phoneNumbers.count>) {
CNLabeledValue *firstLabelValue = contact.phoneNumbers[];
CNPhoneNumber *firstPhoneNumber = firstLabelValue.value;
existPhone = [self existPhone:firstPhoneNumber.stringValue];
} if (existPhone) {
NSLog(@"号码已存在");
return;
}
NSLog(@"号码不存在,存储新的联系人"); //创建添加请求
CNSaveRequest *saveRequest = [[CNSaveRequest alloc]init];
[saveRequest addContact:contact toContainerWithIdentifier:nil];
//写入
CNContactStore *store = [[CNContactStore alloc]init];
[store executeSaveRequest:saveRequest error:nil];
}
//phoneList 为包含多对号码属性字典的数组,用于一个为一个联系人添加多个号码
- (void)addNewContact:(NSArray *)phonesList
{
BOOL existPhone = NO;
if (phonesList.count>) {
NSString *firstPhoneNumber = phonesList[][@"value"];
existPhone = [self existPhone:firstPhoneNumber];
} if (existPhone) {
NSLog(@"号码已存在");
return;
}
NSLog(@"号码不存在,存储新的联系人"); //name
ABAddressBookRef iPhoneAddressBook = ABAddressBookCreate();
CFErrorRef error = NULL;
ABRecordRef newPerson = ABPersonCreate();
ABRecordSetValue(newPerson, kABPersonFirstNameProperty, @"", &error);
ABRecordSetValue(newPerson, kABPersonLastNameProperty, @"", &error); ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType); for (NSInteger i = ; i < phonesList.count; i++) {
ABMultiValueAddValueAndLabel(multiPhone, (__bridge CFTypeRef)(phonesList[i][@"value"]), (__bridge CFStringRef)(phonesList[i][@"label"]), NULL);
ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone, nil);
NSLog(@"%ld",i);
} ABAddressBookAddRecord(iPhoneAddressBook, newPerson, &error);
ABAddressBookSave(iPhoneAddressBook, &error); CFRelease(multiPhone);
CFRelease(newPerson);
CFRelease(iPhoneAddressBook); }

// 指定号码是否已经存在
- (BOOL)existPhone:(NSString*)phoneNum{
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef records;
// 获取通讯录中全部联系人
records = ABAddressBookCopyArrayOfAllPeople(addressBook); // 遍历全部联系人,检查是否存在指定号码
for (int i=; i<CFArrayGetCount(records); i++)
{
ABRecordRef record = CFArrayGetValueAtIndex(records, i);
CFTypeRef phones = ABRecordCopyValue(record, kABPersonPhoneProperty);
CFArrayRef phoneNums = ABMultiValueCopyArrayOfAllValues(phones);
if (phoneNums)
{
for (int j=; j<CFArrayGetCount(phoneNums); j++)
{
NSString *phone = (NSString*)CFArrayGetValueAtIndex(phoneNums, j);
if ([phone isEqualToString:phoneNum])
{
return YES;
}
}
}
}
CFRelease(addressBook);
return NO;
}

iOS8通讯录之联系人增删查,多号码增删操作的更多相关文章

  1. day03 Python字典dict的增删查改及常用操作

    字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可 ...

  2. day02 Python列表的增删查改及常用操作

    列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li = [‘alex’,12 ...

  3. nodejs连接mysql并进行简单的增删查改

    最近在入门nodejs,正好学习到了如何使用nodejs进行数据库的连接,觉得比较重要,便写一下随笔,简单地记录一下 使用在安装好node之后,我们可以使用npm命令,在项目的根目录,安装nodejs ...

  4. Python对MySQL进行增删查改

    python连接MySQL数据库:pymysql # 测试操作 import pymysql # 打开数据库 db = pymysql.connect("localhost", & ...

  5. SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)

    SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML 1.SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL I ...

  6. iOS 获得通讯录中联系人的所有属性--b

    ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBookCopyArrayOfA ...

  7. 学习记录——使用PHP实现数据增删查改等基本功能(前后端分离)

    萌新初次学习服务器端语言,分享学习经验 实现功能:1.显示数据表    2.对数据进行分页    3.对数据进行增删查改 由于本萌新采用前后端完全分离方案,所以数据传输用的ajax,为了提高代码的复用 ...

  8. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  9. 3.EF 6.0 Code-First实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-entity-framework-5-0-code- ...

随机推荐

  1. PDF 补丁丁 0.4.2.905 测试版发布:智能合并功能减小合并文件的大小

    之前的测试版在合并文件功能处添加两个相同的PDF文件,程序会重复写入该文件的内容,导致文件体积膨胀,浪费存储空间. 例如:使用者需要在原 PDF 文件(设文件为1.pdf)第2和第3页中间插入几张图片 ...

  2. AspNetPager分页

    1.页面部分 <%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefi ...

  3. pwnable.kr-fd

    题目: 链接登录: ssh fd@pwnable.kr -p2222 查看文件及权限: ls –al 看到flag文件,但是当前用户fd并没有读权限. cat fd.c 分析程序: int argc ...

  4. cookie窃取和session劫持

    Updates 2014-08-17 感谢@搞前端的crosser的提醒,加入了HTTP Response Splitting的内容. 此篇文章的Presentation戳这里. 一.cookie的基 ...

  5. excel具有制作甘特图的功能

    1.Excel最大功能:数据处理.统计分析. 2.数据有效性验证: 长数字输入方法,文本前面加英文"'"(单引号)或使用文本转换. 身份证号:数据.数据有效性.文本长度. 性别:数 ...

  6. 解决如何监听Activity切换

    本篇博文在我之前的博文中已经提到了,但是监听Activity切换又可以作为一个单独的内容来叙述,因此这里又单独拿了出来进行赘述. Activity的切换无非有两种,第一种:启动或者创建一个新的Acti ...

  7. 12-8 php基础

    <?php //单行注释/* 多行注释*/ //弱类型语言//var a = 10;/*$a=10;$b = "hello";var_dump($a);$a="wo ...

  8. HTTP通信原理

    HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则.计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求 ...

  9. TCP链接时主动close时可能的rst报文

    阿里核心系统团队博客http://csrd.aliapp.com/?p=1055记录了主动关闭TCP socket时,可能不发fin包,而是发rst的问题. 其原因是主动关闭socket时,若接收bu ...

  10. linux之log_format

    log_format是指存储日志的时候所采用的格式,可以在/usr/local/nginx/conf/nginx.conf的http字段中设置 下面是一个典型的log_format设置 log_for ...