通讯录
iOS 8.0 无界面通讯录
#import "ViewController.h" #import <AddressBook/AddressBook.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //获取授权 ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus(); if (status ==kABAuthorizationStatusNotDetermined) { //创建通讯录对象 ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL); //授权回调 ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) { if (granted) { NSLog(@"成功"); }else{ NSLog(@"失败"); } }); } } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //创建通讯录 ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL); //获取所有联系人信息 CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(book); CFIndex count = CFArrayGetCount(allPeople); for (CFIndex i = 0; i< count; i++) { //根据索引,获取一条联系人记录 ABRecordRef record = CFArrayGetValueAtIndex(allPeople, i); //获取用户电话(因为用户可以用多个电话, 也有多种类型的电话) ABMultiValueRef 是一个集合类型 ABMultiValueRef mulitiValue = ABRecordCopyValue(record, kABPersonPhoneProperty); //遍历集合 for (CFIndex i = 0; i<ABMultiValueGetCount(mulitiValue); i++) { //根据索引获取电话 CFStringRef str = ABMultiValueCopyValueAtIndex(mulitiValue, i); //(__bridge_transfer NSString *)str; 桥接, 让CF字符串 转为NSString 让ARC 进行管理 NSString * phone = (__bridge_transfer NSString *)str; NSLog(@"%@" , phone); } } }
iOS 8.0 有界面通讯录: 导入<AddressBookUI/AddressBookUI.h>
#import "ViewController.h"
#import <AddressBookUI/AddressBookUI.h>
@interface ViewController ()<ABPeoplePickerNavigationControllerDelegate>
@property(nonatomic ,strong) ABPeoplePickerNavigationController * picker;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//实例化通讯录控制器
ABPeoplePickerNavigationController * picker = [[ABPeoplePickerNavigationController alloc]init];
//设置通讯录控制器的代理
picker.peoplePickerDelegate = self;
self.picker = picker;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//modal控制器
[self presentViewController:self.picker animated:YES completion:nil];
}
//如果实现peoplePickerNavigationController 那么property就无效, 就不执行
//- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person NS_AVAILABLE_IOS(8_0){
// NSLog(@"didSelectPerson");
//
//
// CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
//
// CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
//
// NSString * firstStr = (__bridge_transfer NSString*)firstName;
//
// NSString * lastStr = (__bridge_transfer NSString*)lastName;
//
// NSLog(@"%@ ,%@ " ,firstStr , lastStr );
//
//
//
// ABMultiValueRef multiValue = ABRecordCopyValue(person, kABPersonPhoneProperty);
//
// CFIndex count = ABMultiValueGetCount(multiValue);
//
//
// for (CFIndex i = 0; i<count; i++) {
//
// CFStringRef str = ABMultiValueCopyValueAtIndex(multiValue, i);
//
// NSString * phone = (__bridge_transfer NSString*)str;
//
// NSLog(@"%@" , phone);
//
// }
//}
// Called after a property has been selected by the user.(当选择通讯录属性时调用,也就是可以显示详情)
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_AVAILABLE_IOS(8_0){
NSLog(@"property");
//获取选择的属性 记住C语言的规则, 需要操作什么类型, 就拿到要操作的类型,使用Get Copy,来获取
CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
NSString * firstStr = (__bridge_transfer NSString*)firstName;
NSString * lastStr = (__bridge_transfer NSString*)lastName;
NSLog(@"%@ ,%@ " ,firstStr , lastStr );
ABMultiValueRef multiValue = ABRecordCopyValue(person, kABPersonPhoneProperty);
CFIndex count = ABMultiValueGetCount(multiValue);
for (CFIndex i = 0; i<count; i++) {
CFStringRef str = ABMultiValueCopyValueAtIndex(multiValue, i);
NSString * phone = (__bridge_transfer NSString*)str;
NSLog(@"%@" , phone);
}
//判断选择的联系人是否设置电话,不为空才释放
if(multiValue !=NULL){
CFRelease(multiValue);
}
}
// Called after the user has pressed cancel.
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
NSLog(@"peoplePickerNavigationControllerDidCancel");
}
iOS 9.0 无界面通讯录: 导入<Contacts/Contacts.h>
#import "ViewController.h"
#import <Contacts/Contacts.h>
@interface ViewController ()
@property(nonatomic ,strong) CNContactStore *store;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//获取授权状态
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
//创建通讯录仓库
CNContactStore *store = [[CNContactStore alloc]init];
self.store =store;
//判断是否通过授权,未授权就请求授权
if (status == CNAuthorizationStatusNotDetermined) {
//请求授权
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
NSLog(@"成功");
}else{
NSLog(@"失败");
}
}];
}
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//获取通讯录(信息)请求
CNContactFetchRequest * requser = [[CNContactFetchRequest alloc]initWithKeysToFetch:@[CNContactGivenNameKey , CNContactPhoneNumbersKey]];
//遍历请求
[self.store enumerateContactsWithFetchRequest:requser error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
//contact 就是通讯录数据
NSLog(@"%@" ,contact.givenName);
}];
}
iOS 9.0 有界面通讯录 导入<ContactsUI/ContactsUI.h>
#import "ViewController.h"
#import <ContactsUI/ContactsUI.h>
@interface ViewController ()<CNContactPickerDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//创建CNContactPickerViewController 控制器
CNContactPickerViewController * picker = [[CNContactPickerViewController alloc]init];
//设置代理
picker.delegate = self ;
//modal控制器
[self presentViewController:picker animated:YES completion:nil];
}
//实现didSelectContact,那么didSelectContactProperty就不执行
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact{
//contact 就是通讯录数据
NSLog(@"%@" , contact.givenName);
// NSLog(@"%@" , contact.phoneNumbers);
for (CNLabeledValue * obj in contact.phoneNumbers) {
CNPhoneNumber * num = obj.value;
NSLog(@"%@ , %@" , num.stringValue , obj.label);
}
}
-(void)contactPickerDidCancel:(CNContactPickerViewController *)picker{
}
//
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty{
}
总结://获取选择的属性 记住C语言的规则, 需要操作什么类型, 就拿到要操作的类型,使用Get Copy,来获取,
注意:C语言 creat , copy 字样创建的对象,注意遵循谁创建,谁release

浙公网安备 33010602011771号