AddressBookUI

AddressBookUI.frameworkAddressBook.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;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末扯旷,一起剝皮案震驚了整個濱河市拯爽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钧忽,老刑警劉巖毯炮,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耸黑,居然都是意外死亡桃煎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門大刊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來为迈,“玉大人,你說我怎么就攤上這事缺菌『” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵伴郁,是天一觀的道長耿战。 經(jīng)常有香客問我,道長焊傅,這世上最難降的妖魔是什么剂陡? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮租冠,結果婚禮上鹏倘,老公的妹妹穿的比我還像新娘薯嗤。我一直安慰自己顽爹,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布骆姐。 她就那樣靜靜地躺著镜粤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玻褪。 梳的紋絲不亂的頭發(fā)上肉渴,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音带射,去河邊找鬼同规。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的券勺。 我是一名探鬼主播绪钥,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼关炼!你這毒婦竟也來了程腹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤儒拂,失蹤者是張志新(化名)和其女友劉穎寸潦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體社痛,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡见转,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒜哀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片池户。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凡怎,靈堂內的尸體忽然破棺而出校焦,到底是詐尸還是另有隱情,我是刑警寧澤统倒,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布寨典,位于F島的核電站,受9級特大地震影響房匆,放射性物質發(fā)生泄漏耸成。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一浴鸿、第九天 我趴在偏房一處隱蔽的房頂上張望井氢。 院中可真熱鬧,春花似錦岳链、人聲如沸花竞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽约急。三九已至,卻和暖如春苗分,著一層夾襖步出監(jiān)牢的瞬間厌蔽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工摔癣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奴饮,地道東北人纬向。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像戴卜,于是被迫代替她去往敵國和親罢猪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容