AddressBookUI.framework
、AddressBook.framework
這2個框架在iOS2.0引入垮媒。
AddressBookUI:
#import <AddressBookUI/ABPeoplePickerNavigationController.h>//顯示整個通訊錄并可以選擇一個聯(lián)系人的信息
#import <AddressBookUI/ABPersonViewController.h>//顯示一個具體聯(lián)系人的信息
#import <AddressBookUI/ABNewPersonViewController.h>//增加一個新的聯(lián)系人
#import <AddressBookUI/ABUnknownPersonViewController.h>
#import <AddressBookUI/ABAddressFormatting.h>
ABPeoplePickerNavigationController
這個類自帶導航條椎例,使用presentViewController
從底部推出一個帶導航條的聯(lián)系人界面查乒;實現(xiàn)ABPeoplePickerNavigationControllerDelegate
代理方法.
ABPeoplePickerNavigationController *vc = [[ABPeoplePickerNavigationController alloc] init];
vc.peoplePickerDelegate = self;
[self presentViewController:vc animated:YES completion:nil];
ABPersonViewController
查看一個聯(lián)系人的詳細信息:
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, personID);
ABPersonViewController *viewController = [[ABPersonViewController alloc] init];
viewController.personViewDelegate = self;
viewController.displayedPerson = person;
viewController.allowsActions = NO;
viewController.allowsEditing = YES;
viewController.displayedProperties = @[[NSNumber numberWithInt:kABPersonPhoneProperty]];
[self.navigationController pushViewController:viewController animated:YES];
CFRelease(addressBook);
ABNewPersonViewController
添加新聯(lián)系人
ABNewPersonViewController *picker = [[ABNewPersonViewControlleralloc] init];
picker.newPersonViewDelegate = self;
UINavigationController *navigation = [[UINavigationControlleralloc] initWithRootViewController:picker];
[selfpresentModalViewController:navigation animated:YES];
iOS8之前有這樣三個方法:
1.- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
,用戶點擊聯(lián)系人界面的右上角取消按鈕時觸發(fā)抽减;
2.- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person NS_DEPRECATED_IOS(2_0, 8_0)
,
3.- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_DEPRECATED_IOS(2_0, 8_0)
,
ios8之后新增2個方法祥得,棄用2個方法:
4.- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person NS_AVAILABLE_IOS(8_0)
,該方法會在選中某個聯(lián)系人之后觸發(fā)兔沃,一旦實現(xiàn)了這個代理方法用戶只能選擇到聯(lián)系人視圖,無法查看具體聯(lián)系人的信息级及;// Called after a person has been selected by the user.
5.- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_AVAILABLE_IOS(8_0)
// Called after a property has been selected by the user.
第一個方法是選中這個人之后調用乒疏。
第二個方法是選中這個人的詳細信息后調用。
AddressBook:
首先創(chuàng)建一個ABAddressBookRef類的通訊錄對象
//創(chuàng)建通訊錄對象
self.addressBook=ABAddressBookCreateWithOptions(NULL, NULL);
//請求訪問用戶通訊錄,注意無論成功與否block都會調用
ABAddressBookRequestAccessWithCompletion(self.addressBook, ^(bool granted, CFErrorRef error) {
if (!granted) {
NSLog(@"未獲得通訊錄訪問權限饮焦!");
}
[self initAllPerson];
});
獲取通訊錄中所有人
/**
* 取得所有通訊錄記錄
*/
-(void)initAllPerson{
//取得通訊錄訪問授權
ABAuthorizationStatus authorization= ABAddressBookGetAuthorizationStatus();
//如果未獲得授權
if (authorization!=kABAuthorizationStatusAuthorized) {
NSLog(@"尚未獲得通訊錄訪問授權怕吴!");
return ;
}
//取得通訊錄中所有人員記錄
CFArrayRef allPeople= ABAddressBookCopyArrayOfAllPeople(self.addressBook);
self.allPerson=(__bridge NSMutableArray *)allPeople;
//釋放資源
CFRelease(allPeople);
獲取通訊錄中所有人員信息
//獲取所有聯(lián)系人的數(shù)組
CFArrayRef allLinkPeople = ABAddressBookCopyArrayOfAllPeople(addBook);
//獲取聯(lián)系人總數(shù)
CFIndex number = ABAddressBookGetPersonCount(addBook);
//進行遍歷
for (NSInteger i=0; i<number; i++) {
//獲取聯(lián)系人對象的引用
ABRecordRef people = CFArrayGetValueAtIndex(allLinkPeople, i);
//獲取當前聯(lián)系人名字
NSString*firstName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonFirstNameProperty));
//獲取當前聯(lián)系人姓氏
NSString*lastName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonLastNameProperty));
//獲取當前聯(lián)系人中間名
NSString*middleName=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonMiddleNameProperty));
//獲取當前聯(lián)系人的名字前綴
NSString*prefix=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonPrefixProperty));
//獲取當前聯(lián)系人的名字后綴
NSString*suffix=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonSuffixProperty));
//獲取當前聯(lián)系人的昵稱
NSString*nickName=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonNicknameProperty));
//獲取當前聯(lián)系人的名字拼音
NSString*firstNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonFirstNamePhoneticProperty));
//獲取當前聯(lián)系人的姓氏拼音
NSString*lastNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonLastNamePhoneticProperty));
//獲取當前聯(lián)系人的中間名拼音
NSString*middleNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonMiddleNamePhoneticProperty));
//獲取當前聯(lián)系人的公司
NSString*organization=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonOrganizationProperty));
//獲取當前聯(lián)系人的職位
NSString*job=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonJobTitleProperty));
//獲取當前聯(lián)系人的部門
NSString*department=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonDepartmentProperty));
//獲取當前聯(lián)系人的生日
NSString*birthday=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonBirthdayProperty));
NSMutableArray * emailArr = [[NSMutableArray alloc]init];
//獲取當前聯(lián)系人的郵箱 注意是數(shù)組
ABMultiValueRef emails= ABRecordCopyValue(people, kABPersonEmailProperty);
for (NSInteger j=0; j<ABMultiValueGetCount(emails); j++) {
[emailArr addObject:(__bridge NSString *)(ABMultiValueCopyValueAtIndex(emails, j))];
}
//獲取當前聯(lián)系人的備注
NSString*notes=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonNoteProperty));
//獲取當前聯(lián)系人的電話 數(shù)組
NSMutableArray * phoneArr = [[NSMutableArray alloc]init];
ABMultiValueRef phones= ABRecordCopyValue(people, kABPersonPhoneProperty);
for (NSInteger j=0; j<ABMultiValueGetCount(phones); j++) {
[phonerr addObject:(__bridge NSString *)(ABMultiValueCopyValueAtIndex(phones, j))];
}
//獲取創(chuàng)建當前聯(lián)系人的時間 注意是NSDate
NSDate*creatTime=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonCreationDateProperty));
//獲取最近修改當前聯(lián)系人的時間
NSDate*alterTime=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonModificationDateProperty));
//獲取地址
ABMultiValueRef address = ABRecordCopyValue(people, kABPersonAddressProperty);
for (int j=0; j<ABMultiValueGetCount(address); j++) {
//地址類型
NSString * type = (__bridge NSString *)(ABMultiValueCopyLabelAtIndex(address, j));
NSDictionary * temDic = (__bridge NSDictionary *)(ABMultiValueCopyValueAtIndex(address, j));
//地址字符串,可以按需求格式化
NSString * adress = [NSString stringWithFormat:@"國家:%@\n省:%@\n市:%@\n街道:%@\n郵編:%@",[temDic valueForKey:(NSString*)kABPersonAddressCountryKey],[temDic valueForKey:(NSString*)kABPersonAddressStateKey],[temDic valueForKey:(NSString*)kABPersonAddressCityKey],[temDic valueForKey:(NSString*)kABPersonAddressStreetKey],[temDic valueForKey:(NSString*)kABPersonAddressZIPKey]];
}
//獲取當前聯(lián)系人頭像圖片
NSData*userImage=(__bridge NSData*)(ABPersonCopyImageData(people));
//獲取當前聯(lián)系人紀念日
NSMutableArray * dateArr = [[NSMutableArray alloc]init];
ABMultiValueRef dates= ABRecordCopyValue(people, kABPersonDateProperty);
for (NSInteger j=0; j<ABMultiValueGetCount(dates); j++) {
//獲取紀念日日期
NSDate * data =(__bridge NSDate*)(ABMultiValueCopyValueAtIndex(dates, j));
//獲取紀念日名稱
NSString * str =(__bridge NSString*)(ABMultiValueCopyLabelAtIndex(dates, j));
NSDictionary * temDic = [NSDictionary dictionaryWithObject:data forKey:str];
[dateArr addObject:temDic];
}
新建一個聯(lián)系人
//創(chuàng)建一個聯(lián)系人引用
ABRecordRef person = ABPersonCreate();
NSString *firstName = @"哈";
NSString *lastName = @"哈";
// 電話號碼數(shù)組
NSArray *phones = [NSArray arrayWithObjects:@"123",@"456",nil];
// 電話號碼對應的名稱
NSArray *labels = [NSArray arrayWithObjects:@"iphone",@"home",nil];
//這里的字段和上面的字段完全相同
// 設置名字屬性
ABRecordSetValue(person, kABPersonFirstNameProperty,(__bridge CFStringRef)firstName, NULL);
// 設置姓氏屬性
ABRecordSetValue(person, kABPersonLastNameProperty, (__bridge CFStringRef)lastName, NULL);
// 設置生日屬性
ABRecordSetValue(person, kABPersonBirthdayProperty,(__bridge CFDateRef)birthday, NULL);
// 字典引用
ABMultiValueRef dic =ABMultiValueCreateMutable(kABMultiStringPropertyType);
// 添加電話號碼與其對應的名稱內容
for (int i = 0; i < [phones count]; i ++) {
ABMultiValueIdentifier obj = ABMultiValueAddValueAndLabel(dic,(__bridge CFStringRef)[phones objectAtIndex:i], (__bridge CFStringRef)[labels objectAtIndex:i], &obj);
}
// 設置phone屬性
ABRecordSetValue(person, kABPersonPhoneProperty, dic, NULL);
// 將新建的聯(lián)系人添加到通訊錄中
ABAddressBookAddRecord(addBook, person, NULL);
// 保存通訊錄數(shù)據(jù)
ABAddressBookSave(addBook, NULL);
修改聯(lián)系人信息
修改聯(lián)系人的操作就是將獲取和添加和在一起县踢,先獲取到相應的聯(lián)系人引用转绷,重設其屬性字段即可。
刪除聯(lián)系人
//獲取所有聯(lián)系人
NSArray *array = (__bridge NSArray*)ABAddressBookCopyArrayOfAllPeople(addBook);
// 遍歷所有的聯(lián)系人
for (id obj in array) {
ABRecordRef people = (__bridge ABRecordRef)obj;
NSString *firstName = (__bridge NSString*)ABRecordCopyValue(people, kABPersonFirstNameProperty);
NSString *lastName = (__bridge NSString*)ABRecordCopyValue(people, kABPersonLastNameProperty);
if ([firstName isEqualToString:@"哈"] &&[lastName isEqualToString:@"哈"]) {
ABAddressBookRemoveRecord(addBook, people,NULL);
}
}
// 保存修改的通訊錄對象
ABAddressBookSave(addBook, NULL);
內存管理
-(void)dealloc{
if (self.addressBook != NULL) {
CFRelease(self.addressBook);
}
}
在我們用ABAddressBookCreate()創(chuàng)建一個引用對象時殿雪,切記無論ARC還MRC暇咆,要用CFRelease()進行釋放引用,例如上面的例子,我們需要加上這句代碼
CFRelease(self.addressBook);
contactsUI
iOS9中爸业,系統(tǒng)也為我們封裝好了一套聯(lián)系人的UI界面其骄,用起來也十分方便,主要新增的controller有兩個:
CNContactPickerViewController
:展示聯(lián)系人列表的controller
CNContactViewController
:展示聯(lián)系人詳細信息的controller
示例如下:
彈出聯(lián)系人列表:
CNContactPickerViewController * con = [[CNContactPickerViewController alloc]init];
[self presentViewController:con animated:YES completion:nil];
CNContactPickerDelegate
代理方法:
//視圖取消時 調用的方法
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker;
//選中與取消選中時調用的方法
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact*> *)contacts;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray<CNContactProperty*> *)contactProperties;
CNContactViewController
則是用來顯示具體聯(lián)系人的詳細信息的
CNContactViewController * con = [CNContactViewController viewControllerForContact:contact];
[self presentViewController:con animated:YES completion:nil];
//將要展示聯(lián)系人信息與已經(jīng)展示聯(lián)系人信息的回調
- (BOOL)contactViewController:(CNContactViewController *)viewController shouldPerformDefaultActionForContactProperty:(CNContactProperty *)property;
- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact;