我们如果想要自己去获取通讯录当中的数据,然后自己去搭建界面,我们可以这么做,首先其实我们会发现就算我们不去授权通讯录好像也可以跑起来,但是其实是必须要去请求用户的授权的,不然上架可能会被拒。
获取授权步骤如下所示
1、先去获取授权的状态
2、创建AddressBook
3、判断授权状态,没有授权就去请求授权
4、最后别忘记释放Core Foundation对象
我们可以在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 这个方法中进行请求授权
//创建通讯录
ABAddressBookRef address = ABAddressBookCreateWithOptions(NULL, NULL);
//判断有没有授权
if(ABAddressBookGetAuthorizationStatus()==kABAuthorizationStatusNotDetermined)
{
ABAddressBookRequestAccessWithCompletion(address, ^(bool granted, CFErrorRef error) {
if(error)
{
NSLog(@"出错");
return;
}
if(granted)
{
NSLog(@"授权成功");
}
else
{
NSLog(@"授权失败");
}
});
CFRelease(address);
}
然后我们这里就是测试下,在touchesBegan中写入下面的方法去获取数据,其实大致的步骤是这样的
1、先去判断授权没有有成功,授权成功,我们再去获取数据
2、创建通讯录
3、我们需要去获取通讯录中的联系人数组也就是通过CFArray去获取
4、遍历联系人以此来获取联系人中存储的数据就比如说姓名和电话
5、取出单个联系人通过ABRecordRef
6、去取名字和电话
7、最后别忘记了Core Foundation框架的对象的释放
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//先去判断是否授权成功了,如果授权成功再去获取数据
if(ABAddressBookGetAuthorizationStatus()==kABAuthorizationStatusAuthorized)
{
//1、首先我们应该先去创建通讯录
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//2、创建联系人数组
CFArrayRef peoples = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex count = CFArrayGetCount(peoples);
for(int i=0;i<count;i++)
{
//3下面函数的返回值是const void *由于CFTypeRef其实就是void * 然后ABRecordRef也是,所以这里也就是返回单个联系人
ABRecordRef people = CFArrayGetValueAtIndex(peoples, i);
//4、获取名字
NSString * name = CFBridgingRelease(ABRecordCopyValue(people, kABPersonLastNameProperty));
NSLog(@"%@",name);
//5、获取电话
ABMultiValueRef phones = ABRecordCopyValue(people, kABPersonPhoneProperty);
//6.1获取号码的count
CFIndex phontCount = ABMultiValueGetCount(phones);
//6.2遍历ABMultiValueRef
for(CFIndex i=0;i<phontCount;i++)
{
//获取号码的标签
NSString * text = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones, i));
//获取号码
NSString * value = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, i));
NSLog(@"text: %@ value: %@",text,value);
}
CFRelease(phones);
NSLog(@"-----------------");
}
CFRelease(peoples);
CFRelease(addressBook);
}
}
输出结果如下所示