AddressBookUI

AddressBookUI.framework、AddressBook.framework這2個(gè)框架在iOS2.0引入。

AddressBookUI:

#import <AddressBookUI/ABPeoplePickerNavigationController.h>//顯示整個(gè)通訊錄并可以選擇一個(gè)聯(lián)系人的信息
#import <AddressBookUI/ABPersonViewController.h>//顯示一個(gè)具體聯(lián)系人的信息
#import <AddressBookUI/ABNewPersonViewController.h>//增加一個(gè)新的聯(lián)系人
#import <AddressBookUI/ABUnknownPersonViewController.h>
#import <AddressBookUI/ABAddressFormatting.h>

ABPeoplePickerNavigationController這個(gè)類自帶導(dǎo)航條,使用presentViewController從底部推出一個(gè)帶導(dǎo)航條的聯(lián)系人界面;實(shí)現(xiàn)ABPeoplePickerNavigationControllerDelegate代理方法.

  ABPeoplePickerNavigationController *vc = [[ABPeoplePickerNavigationController alloc] init];
    vc.peoplePickerDelegate = self;
    [self presentViewController:vc animated:YES completion:nil];

ABPersonViewController查看一個(gè)聯(lián)系人的詳細(xì)信息:

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之前有這樣三個(gè)方法:
1.- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker,用戶點(diǎn)擊聯(lián)系人界面的右上角取消按鈕時(shí)觸發(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個(gè)方法,棄用2個(gè)方法:
4.- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person NS_AVAILABLE_IOS(8_0),該方法會在選中某個(gè)聯(lián)系人之后觸發(fā),一旦實(shí)現(xiàn)了這個(gè)代理方法用戶只能選擇到聯(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.
第一個(gè)方法是選中這個(gè)人之后調(diào)用。
第二個(gè)方法是選中這個(gè)人的詳細(xì)信息后調(diào)用。


AddressBook:

首先創(chuàng)建一個(gè)ABAddressBookRef類的通訊錄對象

//創(chuàng)建通訊錄對象 
 self.addressBook=ABAddressBookCreateWithOptions(NULL, NULL);
 //請求訪問用戶通訊錄,注意無論成功與否block都會調(diào)用
 ABAddressBookRequestAccessWithCompletion(self.addressBook, ^(bool granted, CFErrorRef error) {
        if (!granted) {
            NSLog(@"未獲得通訊錄訪問權(quán)限!");
        }
        [self initAllPerson];

    });

獲取通訊錄中所有人

/**
 *  取得所有通訊錄記錄
 */
-(void)initAllPerson{
    //取得通訊錄訪問授權(quán)
    ABAuthorizationStatus authorization= ABAddressBookGetAuthorizationStatus();
    //如果未獲得授權(quán)
    if (authorization!=kABAuthorizationStatusAuthorized) {
        NSLog(@"尚未獲得通訊錄訪問授權(quán)!");
        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);
    //進(jìn)行遍歷
    for (NSInteger i=0; i<number; i++) {
        //獲取聯(lián)系人對象的引用
        ABRecordRef  people = CFArrayGetValueAtIndex(allLinkPeople, i);
        //獲取當(dāng)前聯(lián)系人名字
        NSString*firstName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonFirstNameProperty));
        //獲取當(dāng)前聯(lián)系人姓氏
        NSString*lastName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonLastNameProperty));
        //獲取當(dāng)前聯(lián)系人中間名
        NSString*middleName=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonMiddleNameProperty));
        //獲取當(dāng)前聯(lián)系人的名字前綴
        NSString*prefix=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonPrefixProperty));
        //獲取當(dāng)前聯(lián)系人的名字后綴
        NSString*suffix=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonSuffixProperty));
        //獲取當(dāng)前聯(lián)系人的昵稱
        NSString*nickName=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonNicknameProperty));
        //獲取當(dāng)前聯(lián)系人的名字拼音
        NSString*firstNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonFirstNamePhoneticProperty));
        //獲取當(dāng)前聯(lián)系人的姓氏拼音
        NSString*lastNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonLastNamePhoneticProperty));
        //獲取當(dāng)前聯(lián)系人的中間名拼音
        NSString*middleNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonMiddleNamePhoneticProperty));
        //獲取當(dāng)前聯(lián)系人的公司
        NSString*organization=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonOrganizationProperty));
        //獲取當(dāng)前聯(lián)系人的職位
        NSString*job=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonJobTitleProperty));
        //獲取當(dāng)前聯(lián)系人的部門
        NSString*department=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonDepartmentProperty));
        //獲取當(dāng)前聯(lián)系人的生日
        NSString*birthday=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonBirthdayProperty));
        NSMutableArray * emailArr = [[NSMutableArray alloc]init];
        //獲取當(dāng)前聯(lián)系人的郵箱 注意是數(shù)組
        ABMultiValueRef emails= ABRecordCopyValue(people, kABPersonEmailProperty);
        for (NSInteger j=0; j<ABMultiValueGetCount(emails); j++) {
            [emailArr addObject:(__bridge NSString *)(ABMultiValueCopyValueAtIndex(emails, j))];
        }
        //獲取當(dāng)前聯(lián)系人的備注
       NSString*notes=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonNoteProperty));
       //獲取當(dāng)前聯(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)建當(dāng)前聯(lián)系人的時(shí)間 注意是NSDate
        NSDate*creatTime=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonCreationDateProperty));
        //獲取最近修改當(dāng)前聯(lián)系人的時(shí)間
        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]];
        }
        //獲取當(dāng)前聯(lián)系人頭像圖片
        NSData*userImage=(__bridge NSData*)(ABPersonCopyImageData(people));
        //獲取當(dāng)前聯(lián)系人紀(jì)念日
        NSMutableArray * dateArr = [[NSMutableArray alloc]init];
        ABMultiValueRef dates= ABRecordCopyValue(people, kABPersonDateProperty);
        for (NSInteger j=0; j<ABMultiValueGetCount(dates); j++) {
            //獲取紀(jì)念日日期
            NSDate * data =(__bridge NSDate*)(ABMultiValueCopyValueAtIndex(dates, j));
            //獲取紀(jì)念日名稱
            NSString * str =(__bridge NSString*)(ABMultiValueCopyLabelAtIndex(dates, j));
            NSDictionary * temDic = [NSDictionary dictionaryWithObject:data forKey:str];
            [dateArr addObject:temDic];
        }

新建一個(gè)聯(lián)系人

 //創(chuàng)建一個(gè)聯(lián)系人引用
    ABRecordRef person = ABPersonCreate();
    NSString *firstName = @"哈";
    NSString *lastName = @"哈";
    // 電話號碼數(shù)組
    NSArray *phones = [NSArray arrayWithObjects:@"123",@"456",nil];
    // 電話號碼對應(yīng)的名稱
    NSArray *labels = [NSArray arrayWithObjects:@"iphone",@"home",nil];
    //這里的字段和上面的字段完全相同
    // 設(shè)置名字屬性
    ABRecordSetValue(person, kABPersonFirstNameProperty,(__bridge CFStringRef)firstName, NULL);
    // 設(shè)置姓氏屬性
    ABRecordSetValue(person, kABPersonLastNameProperty, (__bridge CFStringRef)lastName, NULL);
    // 設(shè)置生日屬性
    ABRecordSetValue(person, kABPersonBirthdayProperty,(__bridge CFDateRef)birthday, NULL);
    // 字典引用
    ABMultiValueRef dic =ABMultiValueCreateMutable(kABMultiStringPropertyType);
    // 添加電話號碼與其對應(yīng)的名稱內(nèi)容
    for (int i = 0; i < [phones count]; i ++) {
        ABMultiValueIdentifier obj = ABMultiValueAddValueAndLabel(dic,(__bridge CFStringRef)[phones objectAtIndex:i], (__bridge CFStringRef)[labels objectAtIndex:i], &obj);
    }
    // 設(shè)置phone屬性
    ABRecordSetValue(person, kABPersonPhoneProperty, dic, NULL);
    // 將新建的聯(lián)系人添加到通訊錄中
    ABAddressBookAddRecord(addBook, person, NULL);
    // 保存通訊錄數(shù)據(jù)
    ABAddressBookSave(addBook, NULL);

修改聯(lián)系人信息

修改聯(lián)系人的操作就是將獲取和添加和在一起,先獲取到相應(yīng)的聯(lián)系人引用,重設(shè)其屬性字段即可。

刪除聯(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);

內(nèi)存管理

-(void)dealloc{
    
    if (self.addressBook != NULL) {
        CFRelease(self.addressBook);
    }
}
在我們用ABAddressBookCreate()創(chuàng)建一個(gè)引用對象時(shí),切記無論ARC還MRC,要用CFRelease()進(jìn)行釋放引用,例如上面的例子,我們需要加上這句代碼
 CFRelease(self.addressBook);

contactsUI

iOS9中,系統(tǒng)也為我們封裝好了一套聯(lián)系人的UI界面,用起來也十分方便,主要新增的controller有兩個(gè):

CNContactPickerViewController:展示聯(lián)系人列表的controller
CNContactViewController:展示聯(lián)系人詳細(xì)信息的controller

示例如下:

彈出聯(lián)系人列表:
    CNContactPickerViewController * con = [[CNContactPickerViewController alloc]init];
    [self presentViewController:con animated:YES completion:nil];

CNContactPickerDelegate代理方法:

//視圖取消時(shí) 調(diào)用的方法
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker;
//選中與取消選中時(shí)調(diào)用的方法
- (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)系人的詳細(xì)信息的

 CNContactViewController * con = [CNContactViewController viewControllerForContact:contact];
    [self presentViewController:con animated:YES completion:nil];
//將要展示聯(lián)系人信息與已經(jīng)展示聯(lián)系人信息的回調(diào)
- (BOOL)contactViewController:(CNContactViewController *)viewController shouldPerformDefaultActionForContactProperty:(CNContactProperty *)property;
- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容