在我们的App中需要使用获取手机通讯录的了联系人信息时,就需要使用这个框架,这个框架基于C语言开发的,因此里面的许多变量类型都是C中的。文档中也定义了很多方法,在这里我只说一下获取联系人
ABAddressBookCreateWithOptions是6.0以后的方法,ABAddressBookCreate是6.0之前的方法,所以这里需要单独判断一下,
-(NSArray *)getAddressBook
{
@autoreleasepool {
//获得本地通讯录句柄--上下文
ABAddressBookRef ref=nil;
int systemVersion=[[[UIDevice
currentDevice]
systemVersion]
intValue];
if
(systemVersion>=6.0)
{//6.0以上的
ref=ABAddressBookCreateWithOptions(NULL,
NULL);
//请求用户是否可以使用通讯录
dispatch_semaphore_t
sem=dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(ref, ^(bool granted, CFErrorRef error) {
dispatch_semaphore_signal(sem);
});
dispatch_semaphore_wait(sem,
DISPATCH_TIME_FOREVER);
dispatch_release(sem);
}
else{
ref=ABAddressBookCreate();
}
//获取本地所有联系人记录
if
(ref==nil) return nil;
NSArray *arry=(__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(ref);
NSMutableArray *persons=[[NSMutableArray alloc]init];
for
(id tmpPerson in arry) {
//__bridge关键词表示在ARC模式下不需要管理c中的内存释放
ABRecordRef
record=(__bridge ABRecordRef)tmpPerson;
NSMutableDictionary
*dict=[[NSMutableDictionary
alloc]init];
NSString *name=(__bridge NSString *)(ABRecordCopyCompositeName(record));
[dict
setObject:name forKey:@"name"];
ABMultiValueRef
phonevalues=ABRecordCopyValue(record, kABPersonPhoneProperty);
CFIndex count=ABMultiValueGetCount(phonevalues);
for (int i=0;i
NSString *phonenumber=(__bridge NSString *)(ABMultiValueCopyValueAtIndex(phonevalues,
i));
[dict setObject:phonenumber forKey:[NSString stringWithFormat:@"phone%i",i]];
}
[persons
addObject:dict];
}
return [persons copy];
}
}
关于dispatch_semaphore_t变量GCD中用于控制线程并发的,这里不再详细介绍了,
ABRecordCopyCompositeName是直接可以获取联系人姓名的方法,返回值为String,
CFTypeRef ABRecordCopyValue(ABRecordRef record,
ABPropertyID
property)这个方法这里解释一下,第二个参数为属性ID,在ABPerson.h文件中可以获取到所有的联系人属性值,包含email,电话,qq等详细信息,返回值为通用指针类型(Void
*),这里转化为我们需要的就OK了。
(2)AddressBookUI框架
这个框架是Apple为我们提供的调用通讯录页面和联系人页面的框架,与调用本机照相机类似的实现,
ABPeoplePickerNavigationController:显示整个通讯录并可以选择一个联系人的信息
ABPersonViewController:显示一个具体联系人的信息
ABNewPersonViewController:增加一个新的联系人
ABUnknownPersonViewController:完善一个联系人的信息
大概已经清楚这个框架的作用了,每个页面都可以调用相应的委托实现回调,这个就不说了
打开通讯录页面代码:
ABNewPersonViewController
*VC=[[ABNewPersonViewController
alloc]init];
VC.newPersonViewDelegate=self;
[self
presentModalViewController:VC
animated:YES];