标签:
使用到的系统框架AddressBook,AddressBookUI;IOS中的通讯录是存储在数据库中的,开发人员不能直接访问通讯录数据库,必须依靠AddressBook提供的API来实现通讯录操作,通过AddressBook.FrameWork可以操作通讯录信息,但是AddressBook框架是基于C语言编写的,无法使用ARC管理内存,需要自己手动管理。
AddressBook框架的常用类型:
ABAddressBookRef:代表通讯录对象。通过该对象,可以直接访问和保存通讯录信息。
ABRecordRef:代表一个通用的记录对象,常用。作为联系人,该对象完整记录了联系人信息(姓名,性别,电话,邮件),每个ABRecordRef 都有一条唯一的ID表示,(可以通过ABRecordGetRecordID())获得。
ABPersonRef:代表联系人信息,很少使用,实际开发中常使用kABPersonType 的ABPersonRef 来表示联系人;
ABGrounpRef:代表群组。
对通讯录的操作,关键是对ABRecordRef的操作,常用方法如下:
ABPersonCreate():创建一个类型为“kABPersonType”的ABRecordRef;
ABRecordCopyValue():取得联系人属性:官方文档的属性:
由于联系人访问时(读取、设置、删除时)牵扯到大量联系人属性,可以到ABPerson.h中查询或者直接到帮助文档“Personal Information Properties”
ABRecordSetValue(): 设置ABRecordRef的属性值。分为单属性和多属性,单属性使用ABRecordSetValue();多属性通过创建一个ABMutableMultiValueRef类型的变量,然后通过ABMultiValueAddValueAndLabel ()方法依次添加属性值,最后通过ABRecordRefSetValue ()方法 将ABMutableMultiValueRef类型的变量设置为记录值。
ABRecordRmoveValue ():删除指定的属性值。
注意: 取出的对象为CF对象,编译器无法自动释放,可以通过 bridge-casts 转换成NSObject对象,例如 NSString*firstname=(__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);有关bridge-casts 可以参考这篇文章http://blog.csdn.net/chengwuli125/article/details/25497051 。
建议使用 CFBridgingRelease(),从 Core Foundation 传递所有权给 Objective-C;
使用 CFBridgingRetain(),从 Objective-C 传递所有权给 Core Foundation;这样就不用手动释放CF对象。
以上为AddressBook框架对象及方法的介绍,接下来就是读取联系人,项目中用到的是最简单的调用系统的AddressBookUI框架。
一、 使用ABPeoplePickerNavigationController 局限:只能选择一个联系人,且不能定制页面。优点:方便快捷,视图本身继承于UINavigationCotroller 不需要使用UInavigationcontroller 封装。
作为模态视图推出即可。
ABPeoplePickerNavigationController*ppvc=[[ABPeoplePickerNavigationController alloc]init];
ppvc.peoplePickerDelegate=self;//设置代理
[self.navigationController presentViewController:ppvc animated:YES completion:nil];
方法:代理ABPeoplePickerNavigationControllerDelegate;
// Called after a person has been selected by the user.
iOS8方法,选中联系人后的操作,
-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person NS_AVAILABLE_IOS(8_0);
可以根据自己需要对person 属性进行处理。
取姓名:NSString*firstname=(__bridgeNSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
取电话:ABMultiValueRef phones=ABRecordCopyValue(person, kABPersonPhoneProperty);
for(int i=0;i<ABMultiValueGetCount(phones);i++)
{
NSString*phone=(__bridge NSString *)ABMultiValueCopyValueAtIndex(phones, i);
[_phoneNumber addObject:phone];
}
电话取出后为一数组,可能不止一个。
// Called after a property has been selected by the user.
iOS8 选中联系人属性后的方法,如果上一个方法实现 这个方法不会调用。
-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_AVAILABLE_IOS(8_0);
// Called after the user has pressed cancel.
点击取消后的操作
-(void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker;
注意:选择联系人或点击取消后 都要
[self dismissViewControllerAnimated:YES completion:nil];
以下为以前的方法,在iOS8 上选取联系人后会进入联系人详细页面,不会读取联系人信息,慎用。
// Deprecated, use predicateForSelectionOfPerson and/or -peoplePickerNavigationController:didSelectPerson: instead.
-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person NS_DEPRECATED_IOS(2_0, 8_0);
// , use predicateForSelectionOfProperty and/or -peoplePickerNavigationController:didSelectPerson:property:identifier: instead.
-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_DEPRECATED_IOS(2_0, 8_0);
二、addressBookUI 还提供ABPersonViewController :用于查看联系人信息(需要设置displayedPerson属性 来显示或需要编辑的联系人);
ABNewPersonViewController :用于新增联系人。
ABUnknownPersonViewController :用于显示未知联系人。
以上均继承于UIViewController 在使用过程中必须使用一个UINavigationController 进行封装,否则只能看到视图,无法操作。封装后不必处理具体新增,修改联系人的逻辑,但必须处理关闭操作即调用 dismissViewControllerAnimated的方法。
更多时候开发中会自己定制通讯录,即通过addressBook框架进行开发。
开发步骤:1、创建通讯录对象ABAddressBookRef ABAddressBookCreateWithOpio();
2、获得用户授权访问通讯录 ABAddressBookRrequestAccessWithCompletion();
3、查询联系人信息 ABAddressBookCopyArrayOfAllPeople(),ABAddressBookCopyPeopleWithName();
4、读取联系人后如果要显示联系人信息则可以调用ABRecord相关方法读取相应的数据;如果要进行修改联系人信息,则可以使用对应的方法修改ABRecord信息,然后调用ABAddressBookSave()方法提交修改;如果要删除联系人,则可以调用ABAddressBookRemoveRecord()方法删除,然后调用ABAddressBookSave()提交修改操作。
5、如果要修改或者删除都需要首先查询对应的联系人,然后修改或删除后提交更改。如果用户要增加一个联系人则不用进行查询,直接调用ABPersonCreate()方法创建一个ABRecord然后设置具体的属性,调用ABAddressBookAddRecord方法添加即可。
读取全部联系人信息:
1、ABAddressBookRef addressBook=ABAddressBookCreateWithOptions(nil, nil);
CFArrayRef allperson =ABAddressBookCopyArrayOfAllPeople(addressBook);
NSArray *array=CFBridgingRelease(allperson);
新建联系人:
//创建一条记录
ABRecordRef recordRef= ABPersonCreate();
ABRecordSetValue(recordRef, kABPersonFirstNameProperty, (__bridge CFTypeRef)(firstName), NULL);//添加名
ABRecordSetValue(recordRef, kABPersonLastNameProperty, (__bridge CFTypeRef)(lastName), NULL);//添加姓
ABMutableMultiValueRef multiValueRef =ABMultiValueCreateMutable(kABStringPropertyType);//添加设置多值属性
ABMultiValueAddValueAndLabel(multiValueRef, (__bridge CFStringRef)(workNumber), kABWorkLabel, NULL);//添加工作电话
ABRecordSetValue(recordRef, kABPersonPhoneProperty, multiValueRef, NULL);
//添加记录
ABAddressBookAddRecord(addressBook, recordRef, NULL);
//保存通讯录,提交更改
ABAddressBookSave(addressBook, NULL);
//释放资源
CFRelease(recordRef);
CFRelease(multiValueRef);
3、根据姓名删除联系人
CFStringRef personNameRef=(__bridge CFStringRef)(personName);
CFArrayRef recordsRef= ABAddressBookCopyPeopleWithName(addressBook, personNameRef);//根据人员姓名查找
CFIndex count= CFArrayGetCount(recordsRef);//取得记录数
for (CFIndex i=0; i<count; ++i) {
ABRecordRef recordRef=CFArrayGetValueAtIndex(recordsRef, i);//取得指定的记录
ABAddressBookRemoveRecord(self.addressBook, recordRef, NULL);//删除
}
ABAddressBookSave(self.addressBook, NULL);//删除之后提交更改
CFRelease(recordsRef);// 释放资源
4、修改联系人信息
ABRecordRef recordRef=ABAddressBookGetPersonWithRecordID(addressBook,recordID);
ABRecordSetValue(recordRef, kABPersonFirstNameProperty, (__bridge CFTypeRef)(firstName), NULL);//添加名
ABRecordSetValue(recordRef, kABPersonLastNameProperty, (__bridge CFTypeRef)(lastName), NULL);//添加姓
ABMutableMultiValueRef multiValueRef =ABMultiValueCreateMutable(kABStringPropertyType);
ABMultiValueAddValueAndLabel(multiValueRef, (__bridge CFStringRef)(workNumber), kABWorkLabel, NULL);
ABRecordSetValue(recordRef, kABPersonPhoneProperty, multiValueRef, NULL);
//保存记录,提交更改
ABAddressBookSave(self.addressBook, NULL);
//释放资源
CFRelease(multiValueRef);
iOS 通讯录开发 AddressBook AddressBookUI框架的使用
标签:
原文地址:http://www.cnblogs.com/snail-007/p/4284443.html