ios 通讯录“写”操作大全

以下内容为转自互联网,没有亲自测试过,后面自己会用到,会测试代码是否有效。 1.需要引入AddressBook.framework框架 2.iPhone通讯录的增加联系人的操作,代码如下(放到项目中可直接运行): // 初始化一个ABAddressBookRef对象,使用完之后需要进行释放, // 这里使用CFRelease进行释放 // 相当于通讯录的一个引用 ABAddressBookRef addressBook = ABAddressBookCreate(); // 新建一个联系人 // ABRecordRef是一个属性的集合,相当于通讯录中联系人的对象 // 联系人对象的属性分为两种: // 只拥有唯一值的属性和多值的属性。 // 唯一值的属性包括:姓氏、名字、生日等。 // 多值的属性包括:电话号码、邮箱等。 ABRecordRef person = ABPersonCreate(); NSString *firstName = @"四"; NSString *lastName = @"李"; NSDate *birthday = [NSDate date]; // 电话号码数组 NSArray *phones = [NSArray arrayWithObjects:@"123",@"456",nil]; // 电话号码对应的名称 NSArray *labels = [NSArray arrayWithObjects:@"iphone",@"home",nil]; // 保存到联系人对象中,每个属性都对应一个宏,例如:kABPersonFirstNameProperty // 设置firstName属性 ABRecordSetValue(person, kABPersonFirstNameProperty,(CFStringRef)firstName, NULL); // 设置lastName属性 ABRecordSetValue(person, kABPersonLastNameProperty, (CFStringRef)lastName, NULL); // 设置birthday属性 ABRecordSetValue(person, kABPersonBirthdayProperty,(CFDateRef)birthday, NULL); // ABMultiValueRef类似是Objective-C中的NSMutableDictionary ABMultiValueRef mv =ABMultiValueCreateMutable(kABMultiStringPropertyType); // 添加电话号码与其对应的名称内容 for (int i = 0; i < [phones count]; i ++) { ABMultiValueIdentifier mi = ABMultiValueAddValueAndLabel(mv,(CFStringRef)[phones objectAtIndex:i], (CFStringRef)[labelsobjectAtIndex:i], &mi); } // 设置phone属性 ABRecordSetValue(person, kABPersonPhoneProperty, mv, NULL); // 释放该数组 if (mv) { CFRelease(mv); } // 将新建的联系人添加到通讯录中 ABAddressBookAddRecord(addressBook, person, NULL); // 保存通讯录数据 ABAddressBookSave(addressBook, NULL); // 释放通讯录对象的引用 if (addressBook) { CFRelease(addressBook); } ------------------------------------------------------------------------------------------------ 3.删除联系人的操作,代码如下(放到项目中可直接运行): // 初始化并创建通讯录对象,记得释放内存 ABAddressBookRef addressBook =ABAddressBookCreate(); // 获取通讯录中所有的联系人 NSArray *array = (NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook); // 遍历所有的联系人并删除(这里只删除姓名为张三的) for (id obj in array) { ABRecordRef people = (ABRecordRef)obj; NSString *firstName = (NSString*)ABRecordCopyValue(people, kABPersonFirstNameProperty); NSString *lastName = (NSString*)ABRecordCopyValue(people, kABPersonLastNameProperty); if ([firstName isEqualToString:@"三"] &&[lastName isEqualToString:@"张"]) { ABAddressBookRemoveRecord(addressBook, people,NULL); } } // 保存修改的通讯录对象 ABAddressBookSave(addressBook, NULL); // 释放通讯录对象的内存 if (addressBook) { CFRelease(addressBook); } ---------------------------------------------------------------------------------------------- 4.修改联系人的操作,代码如下(由于项目中使用到了修改联系人的操作,所以将方法直接复制过来了): // 根据姓氏、名字以及手机号码修改联系人的昵称和生日 + (void)updateAddressBookPersonWithFirstName:(NSString *)firstName lastName:(NSString *)lastName mobile:(NSString *)mobile nickname:(NSString *)nickname birthday:(NSDate *)birthday { // 初始化并创建通讯录对象,记得释放内存 ABAddressBookRef addressBook =ABAddressBookCreate(); // 获取通讯录中所有的联系人 NSArray *array = (NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook); // 遍历所有的联系人并修改指定的联系人 for (id obj in array) { ABRecordRef people = (ABRecordRef)obj; NSString *fn = (NSString*)ABRecordCopyValue(people, kABPersonFirstNameProperty); NSString *ln = (NSString*)ABRecordCopyValue(people, kABPersonLastNameProperty); ABMultiValueRef mv = ABRecordCopyValue(people,kABPersonPhoneProperty); NSArray *phones = (NSArray*)ABMultiValueCopyArrayOfAllValues(mv); // firstName同时为空或者firstName相等 BOOL ff = ([fn length] == 0 && [firstNamelength] == 0) || ([fn isEqualToString:firstName]); // lastName同时为空或者lastName相等 BOOL lf = ([ln length] == 0 && [lastNamelength] == 0) || ([ln isEqualToString:lastName]); // 由于获得到的电话号码不符合标准,所以要先将其格式化再比较是否存在 BOOL is = NO; for (NSString *p in phones) { //红色代码处,我添加了一个类别(给NSString扩展了一个方法),该类别的这个方法主要是用于将电话号码中的"("、")"、""、"-"过滤掉 if ([[p iPhoneStandardFormat]isEqualToString:mobile]) { is = YES; break; } } // firstName、lastName、mobile 同时存在进行修改 if (ff && lf && is) { if ([nickname length] > 0) { ABRecordSetValue(people,kABPersonNicknameProperty, (CFStringRef)nickname, NULL); } if (birthday != nil) { ABRecordSetValue(people,kABPersonBirthdayProperty, (CFDataRef)birthday, NULL); } } } // 保存修改的通讯录对象 ABAddressBookSave(addressBook, NULL); // 释放通讯录对象的内存 if (addressBook) { CFRelease(addressBook); } } 转自:http://blog.sina.com.cn/s/blog_6f9a971801016pk5.html -------------------------------------------------------------------------------------------------- 下面是我自己使用的时候遇到的问题: 自iOS6.0后获取通讯录列表需要询问用户,经过用户同意后才可以获取通讯录用户列表。而且ABAddressBookRef的初始化工作也由ABAddressBookCreate函数转变为ABAddressBookCreateWithOptions函数。下面代码是兼容之前版本的获取通讯录用户列表方法。 ABAddressBookRef addressBook = nil; if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) { addressBook = ABAddressBookCreateWithOptions(NULL, NULL); //等待同意后向下执行 dispatch_semaphore_t sema = dispatch_semaphore_create(0); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { dispatch_semaphore_signal(sema); }); dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); dispatch_release(sema); } else { addressBook = ABAddressBookCreate(); } NSArray *personArray = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
posted @ 2013-02-26 10:44  坤坤同学  阅读(1294)  评论(0编辑  收藏  举报