IOS 获取通讯录中信息
获取通讯录中信息
一. 我们设置一个ABAddressBookRef
类型的属性addressBook
。
二. 要获得通讯录中的信息,我们需要获取访问通讯录的权限。
在运行下面的获取权限的方法的时候,系统会自动跳出来一个alterView,询问是否允许访问通讯录。(注意这个访问只会执行一次,之后即使我们删除了这个app,下次在下载回来,这个询问也不会再执行了)
CFErrorRef error;
addressBook = ABAddressBookCreateWithOptions(NULL , &error);//获得访问通讯录的权限
三. 获取通讯录中的信息:
在获取了访问通讯录权限之后,我们需要获取通讯录中的信息,这个信息以ABAddressBookRef的类型存储。
//访问通讯录信息
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted == YES) {
NSLog(@"已经获取了通讯录信息");
}else{
NSLog(@"获取通讯录信息失败,\nerror-------%@", error);
}
});
四. 将通讯录中的信息转化为我们方便使用的类型
CFBridgingRelease就是将Core Foundation类型的变量转化为NSObject类。转化之后,内存改为ARC自动管理。
CFBridgingRetain就是将NSObject类型的变量转化为Core Foundation类型。转化之后,新创建的数值,内存要手动管理。
//将获取的数据转化为出来
NSArray *addressArray = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
for(id object in addressArray){
ABRecordRef record = CFBridgingRetain(object);//单个的记录,就是一个联系人信息
//获取通讯录中的名字
NSString *firstName = CFBridgingRelease(ABRecordCopyValue(record, kABPersonFirstNameProperty));
NSLog(@"firstName --------------%@", firstName);
//获取通讯录中的email地址
CFArrayRef Emailarray = ABRecordCopyValue(record, kABPersonEmailProperty);
NSArray *emails = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(Emailarray));
for (int i = 0; i < [emails count]; i++) {
NSLog(@"emailAddress--------------%@", [emails objectAtIndex:i]);
}
CFRelease(record);
}
五. 附上源码:
#import "ViewController.h"
#import <AddressBook/AddressBook.h>
@interface ViewController ()
{
ABAddressBookRef addressBook;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self loadAddressBook];
[self LoadBaseUI];
}
- (void)LoadBaseUI{
////TODO: 初始化界面
}
- (void)loadAddressBook{
CFErrorRef error;
addressBook = ABAddressBookCreateWithOptions(NULL , &error);//获得访问通讯录的权限
if (addressBook == nil) {
NSLog(@"通讯录权限获取失败\nerror----------%@", error);
}else{
//访问通讯录信息
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted == YES) {
NSLog(@"已经获取了通讯录信息");
}else{
NSLog(@"获取通讯录信息失败,\nerror-------%@", error);
}
});
//将获取的数据转化为出来
NSArray *addressArray = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
for(id object in addressArray){
ABRecordRef record = CFBridgingRetain(object);
//获取通讯录中的名字
NSString *firstName = CFBridgingRelease(ABRecordCopyValue(record, kABPersonFirstNameProperty));
NSLog(@"firstName --------------%@", firstName);
//获取通讯录中的email地址
CFArrayRef Emailarray = ABRecordCopyValue(record, kABPersonEmailProperty);
NSArray *emails = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(Emailarray));
for (int i = 0; i < [emails count]; i++) {
NSLog(@"emailAddress--------------%@", [emails objectAtIndex:i]);
}
CFRelease(record);
}
// NSLog(@"%@", addressArray);
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
/* 参考
kABPersonFirstNameProperty,名字
kABPersonLastNameProperty,姓氏
kABPersonMiddleNameProperty,中间名
kABPersonPrefixProperty,前缀
kABPersonSuffixProperty,后缀
kABPersonNicknameProperty,昵称
kABPersonFirstNamePhoneticProperty,名字汉语拼音或音标
kABPersonLastNamePhoneticProperty,姓氏汉语拼音或音标
kABPersonMiddleNamePhoneticProperty,中间名汉语拼音或音标
kABPersonOrganizationProperty,组织名
kABPersonJobTitleProperty,头衔
kABPersonDepartmentProperty,部门
kABPersonNoteProperty,备注
kABPersonPhoneProperty,电话号码属性,kABMultiStringPropertyType类型多值属性;
kABPersonEmailProperty,Email属性,kABMultiStringPropertyType类型多值属性;
kABPersonURLProperty,URL属性,kABMultiStringPropertyType类型多值属性;
kABPersonRelatedNamesProperty,亲属关系人属性,kABMultiStringPropertyType类型多值属性;
kABPersonAddressProperty,地址属性,kABMultiDictionaryPropertyType类型多值属性;
kABPersonInstantMessageProperty,即时聊天属性,kABMultiDictionaryPropertyType类型多值属性;
kABPersonSocialProfileProperty,社交账号属性,kABMultiDictionaryPropertyType类型多值属性;
*/