這裡不需要先擷取所有的聯系人自己做聯系人清單,直接使用系統自帶的<code>AddressBookUI/ABPeoplePickerNavigationController.h</code>就好。
首先需要引入如下三個檔案
<code>#import <AddressBookUI/ABPeoplePickerNavigationController.h>#import <AddressBook/ABPerson.h>#import <AddressBookUI/ABPersonViewController.h></code>
然後初始化ABPeoplePickerNavigationController。
<code>ABPeoplePickerNavigationController *nav = [[ABPeoplePickerNavigationController alloc] init];nav.peoplePickerDelegate= self;if(IOS8_OR_LATER){ nav.predicateForSelectionOfPerson = [NSPredicate predicateWithValue:false];}[selfpresentViewController:nav animated:YES completion:nil];</code>
在iOS8之後,需要添加<code>nav.predicateForSelectionOfPerson = [NSPredicate predicateWithValue:false];</code>這一段代碼,否則選擇聯系人之後會直接dismiss,不能進入詳情選擇電話。
最後設定代理
<code>//取消選擇- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{ [peoplePicker dismissViewControllerAnimated:YES completion:nil];}</code>
iOS8下
<code>- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); long index = ABMultiValueGetIndexForIdentifier(phone,identifier); NSString *phoneNO = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phone, index); if ([phoneNO hasPrefix:@"+"]) { phoneNO = [phoneNO substringFromIndex:3]; } phoneNO = [phoneNO stringByReplacingOccurrencesOfString:@"-" withString:@""]; NSLog(@"%@", phoneNO); if (phone && [ZXValidateHelper checkTel:phoneNO]) { phoneNum = phoneNO; [self.tableView reloadData]; [peoplePicker dismissViewControllerAnimated:YES completion:nil]; return; }}- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person{ ABPersonViewController *personViewController = [[ABPersonViewController alloc] init]; personViewController.displayedPerson = person; [peoplePicker pushViewController:personViewController animated:YES];}</code>
iOS7下
<code>- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{ return YES;}- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{ ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); long index = ABMultiValueGetIndexForIdentifier(phone,identifier); NSString *phoneNO = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phone, index); if ([phoneNO hasPrefix:@"+"]) { phoneNO = [phoneNO substringFromIndex:3]; } phoneNO = [phoneNO stringByReplacingOccurrencesOfString:@"-"withString:@""]; NSLog(@"%@", phoneNO); if (phone && [ZXValidateHelper checkTel:phoneNO]) { phoneNum = phoneNO; [self.tableView reloadData]; [peoplePicker dismissViewControllerAnimated:YES completion:nil]; return NO; } returnYES;}</code>
效果示範
這裡需要讀取通訊錄資料。
首先引入頭檔案
<code>#import <AddressBook/AddressBook.h></code>
其次根據權限生成通訊錄
<code>- (void)loadPerson{ ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); if(ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error){ CFErrorRef *error1 = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error1); [selfcopyAddressBook:addressBook]; }); } else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized){ CFErrorRef *error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); [self copyAddressBook:addressBook]; } else { dispatch_async(dispatch_get_main_queue(), ^{ // 更新界面 [hud turnToError:@"沒有擷取通訊錄權限"]; }); }}</code>
然後循環擷取每個聯系人的資訊,建議自己建個model存起來。
<code>- (void)copyAddressBook:(ABAddressBookRef)addressBook{ CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook); CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); for ( int i = 0; i < numberOfPeople; i++){ ABRecordRef person = CFArrayGetValueAtIndex(people, i); NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty)); NSString *lastName = (__bridge NSString*)(ABRecordCopyValue(person, kABPersonLastNameProperty)); //讀取middlename NSString *middlename = (NSString*)ABRecordCopyValue(person, kABPersonMiddleNameProperty); //讀取prefix字首 NSString *prefix = (NSString*)ABRecordCopyValue(person, kABPersonPrefixProperty); //讀取suffix字尾 NSString *suffix = (NSString*)ABRecordCopyValue(person, kABPersonSuffixProperty); //讀取nickname呢稱 NSString *nickname = (NSString*)ABRecordCopyValue(person, kABPersonNicknameProperty); //讀取firstname拼音音标 NSString *firstnamePhonetic = (NSString*)ABRecordCopyValue(person, kABPersonFirstNamePhoneticProperty); //讀取lastname拼音音标 NSString*lastnamePhonetic = (NSString*)ABRecordCopyValue(person, kABPersonLastNamePhoneticProperty); //讀取middlename拼音音标NSString *middlenamePhonetic = (NSString*)ABRecordCopyValue(person, kABPersonMiddleNamePhoneticProperty); //讀取organization公司 NSString *organization = (NSString*)ABRecordCopyValue(person, kABPersonOrganizationProperty); //讀取jobtitle工作 NSString *jobtitle = (NSString*)ABRecordCopyValue(person, kABPersonJobTitleProperty); //讀取department部門NSString *department = (NSString*)ABRecordCopyValue(person, kABPersonDepartmentProperty); //讀取birthday生日 NSDate*birthday = (NSDate*)ABRecordCopyValue(person, kABPersonBirthdayProperty); //讀取note備忘錄 NSString *note = (NSString*)ABRecordCopyValue(person, kABPersonNoteProperty); //第一次添加該條記錄的時間 NSString *firstknow = (NSString*)ABRecordCopyValue(person, kABPersonCreationDateProperty); NSLog(@"第一次添加該條記錄的時間%@\n",firstknow); //最後一次修改該條記錄的時間 NSString *lastknow = (NSString*)ABRecordCopyValue(person, kABPersonModificationDateProperty); NSLog(@"最後一次修改該條記錄的時間%@\n",lastknow); //擷取email多值 ABMultiValueRef email = ABRecordCopyValue(person, kABPersonEmailProperty); int emailcount = ABMultiValueGetCount(email); for (int x = 0; x < emailcount; x++) { //擷取email Label NSString* emailLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(email, x)); //擷取email值 NSString* emailContent = (NSString*)ABMultiValueCopyValueAtIndex(email, x); } //讀取位址多值ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty); int count = ABMultiValueGetCount(address); for(int j = 0; j < count; j++) { //擷取位址Label NSString* addressLabel = (NSString*)ABMultiValueCopyLabelAtIndex(address, j); //擷取該label下的位址6屬性 NSDictionary* personaddress =(NSDictionary*) ABMultiValueCopyValueAtIndex(address, j); NSString* country = [personaddress valueForKey:(NSString*)kABPersonAddressCountryKey]; NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey]; NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey]; NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey]; NSString* zip = [personaddress valueForKey:(NSString*)kABPersonAddressZIPKey]; NSString* coutntrycode = [personaddress valueForKey:(NSString*)kABPersonAddressCountryCodeKey]; } //擷取dates多值 ABMultiValueRef dates = ABRecordCopyValue(person, kABPersonDateProperty); int datescount = ABMultiValueGetCount(dates); for (int y = 0; y < datescount; y++) { //擷取dates Label NSString* datesLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(dates, y)); //擷取dates值 NSString* datesContent = (NSString*)ABMultiValueCopyValueAtIndex(dates, y); } //擷取kind值CFNumberRef recordType = ABRecordCopyValue(person, kABPersonKindProperty); if (recordType == kABPersonKindOrganization) { // it's a company NSLog(@"it's a company\n"); } else { // it's a person, resource, or room NSLog(@"it's a person, resource, or room\n"); } //擷取IM多值 ABMultiValueRef instantMessage = ABRecordCopyValue(person, kABPersonInstantMessageProperty); for (int l = 1; l < ABMultiValueGetCount(instantMessage); l++) { //擷取IM Label NSString* instantMessageLabel = (NSString*)ABMultiValueCopyLabelAtIndex(instantMessage, l); //擷取該label下的2屬性 NSDictionary* instantMessageContent =(NSDictionary*) ABMultiValueCopyValueAtIndex(instantMessage, l); NSString* username = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageUsernameKey]; NSString* service = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageServiceKey]; } //讀取電話多值ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); for (int k = 0; k<ABMultiValueGetCount(phone); k++) { //擷取電話Label NSString * personPhoneLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phone, k)); //擷取該Label下的電話值 NSString * personPhone = (NSString*)ABMultiValueCopyValueAtIndex(phone, k); } //擷取URL多值 ABMultiValueRef url = ABRecordCopyValue(person, kABPersonURLProperty); for (int m = 0; m < ABMultiValueGetCount(url); m++) { //擷取電話LabelNSString * urlLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(url, m)); //擷取該Label下的電話值 NSString * urlContent = (NSString*)ABMultiValueCopyValueAtIndex(url,m); } //讀取照片 NSData *image = (NSData*)ABPersonCopyImageData(person); }}</code>
效果:
本文轉自 卓行天下 51CTO部落格,原文連結:http://blog.51cto.com/9951038/1745644,如需轉載請自行聯系原作者