您好,登錄后才能下訂單哦!
前言
本文給大家介紹了關(guān)于iOS如何封裝一個獲取通訊錄工具類的相關(guān)內(nèi)容,iOS獲取通訊錄一共有4個framework: AddressBook, AddressBookUI, Contacts, ContactsUI; 其中 AddressBook 和 AddressBookUI 已經(jīng)被iOS9時 deprecated 了, 而推出了Contacts 和 ContactsUI 取代之. 其中 AddressBookUI 和 ContactsUI 是picker出一個界面提供選擇一條聯(lián)系人信息并且是不需要手動授權(quán), AddressBook 和 Contacts 是獲取全部通訊錄數(shù)據(jù)并且需要手動授權(quán).下面來一起看看詳細(xì)的介紹吧。
注意:在iOS10獲取通訊錄權(quán)限需主動在info.plist
里添加上提示信息. 不然會崩潰. 在info.plist
里添加一對key和value
ContactsModel
新建兩個數(shù)據(jù)模型文件來保存獲取的通訊錄數(shù)據(jù)
ContactsModel.h
#import <Foundation/Foundation.h> @interface ContactsModel : NSObject @property (nonatomic, copy) NSString *num; @property (nonatomic, copy) NSString *name; - (instancetype)initWithName:(NSString *)name num:(NSString *)num; @end
ContactsModel.m
#import "ContactsModel.h" @implementation ContactsModel - (instancetype)initWithName:(NSString *)name num:(NSString *)num { if (self = [super init]) { self.name = name; self.num = num; } return self; } @end
ContactsHelp
這是獲取通訊錄的工具類.
ContactsHelp.h
#import <UIKit/UIKit.h> #import "ContactsModel.h" typedef void(^ContactBlock)(ContactsModel *contactsModel); @interface ContactsHelp : NSObject + (NSMutableArray *)getAllPhoneInfo; - (void)getOnePhoneInfoWithUI:(UIViewController *)target callBack:(ContactBlock)block; @end
ContactsHelp.m
#import "ContactsHelp.h" #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> #import <Contacts/Contacts.h> #import <ContactsUI/ContactsUI.h> #define iOS9 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) @interface ContactsHelp () <CNContactPickerDelegate, ABPeoplePickerNavigationControllerDelegate> @property(nonatomic, strong) ContactsModel *contactModel; @property(nonatomic, strong) ContactBlock myBlock; @end @implementation ContactsHelp + (NSMutableArray *)getAllPhoneInfo { return iOS9 ? [self getContactsFromContacts] : [self getContactsFromAddressBook]; } - (void)getOnePhoneInfoWithUI:(UIViewController *)target callBack:(void (^)(ContactsModel *))block { if (iOS9) { [self getContactsFromContactUI:target]; } else { [self getContactsFromAddressBookUI:target]; } self.myBlock = block; } #pragma mark - AddressBookUI - (void)getContactsFromAddressBookUI:(UIViewController *)target { ABPeoplePickerNavigationController *pickerVC = [[ABPeoplePickerNavigationController alloc] init]; pickerVC.peoplePickerDelegate = self; [target presentViewController:pickerVC animated:YES completion:nil]; } - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person { ABMultiValueRef phonesRef = ABRecordCopyValue(person, kABPersonPhoneProperty); if (!phonesRef) { return; } NSString *phoneValue = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phonesRef, 0); CFStringRef lastNameRef = ABRecordCopyValue(person, kABPersonLastNameProperty); CFStringRef firstNameRef = ABRecordCopyValue(person, kABPersonFirstNameProperty); NSString *lastname = (__bridge_transfer NSString *)(lastNameRef); NSString *firstname = (__bridge_transfer NSString *)(firstNameRef); NSString *name = [NSString stringWithFormat:@"%@%@", lastname == NULL ? @"" : lastname, firstname == NULL ? @"" : firstname]; NSLog(@"姓名: %@", name); ContactsModel *model = [[ContactsModel alloc] initWithName:name num:phoneValue]; NSLog(@"電話號碼: %@", phoneValue); CFRelease(phonesRef); if (self.myBlock) self.myBlock(model); } #pragma mark - ContactsUI - (void)getContactsFromContactUI:(UIViewController *)target { CNContactPickerViewController *pickerVC = [[CNContactPickerViewController alloc] init]; pickerVC.delegate = self; [target presentViewController:pickerVC animated:YES completion:nil]; } - (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact { NSString *name = [NSString stringWithFormat:@"%@%@", contact.familyName == NULL ? @"" : contact.familyName, contact.givenName == NULL ? @"" : contact.givenName]; NSLog(@"姓名: %@", name); CNPhoneNumber *phoneNumber = [contact.phoneNumbers[0] value]; ContactsModel *model = [[ContactsModel alloc] initWithName:name num:[NSString stringWithFormat:@"%@", phoneNumber.stringValue]]; NSLog(@"電話號碼: %@", phoneNumber.stringValue); if (self.myBlock) self.myBlock(model); } #pragma mark - AddressBook + (NSMutableArray *)getContactsFromAddressBook { ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus(); CFErrorRef myError = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &myError); if (myError) { [self showErrorAlert]; if (addressBook) CFRelease(addressBook); return nil; } __block NSMutableArray *contactModels = [NSMutableArray array]; if (status == kABAuthorizationStatusNotDetermined) { // 用戶還沒有決定是否授權(quán)你的程序進(jìn)行訪問 ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { if (granted) { contactModels = [self getAddressBookInfo:addressBook]; } else { [self showErrorAlert]; if (addressBook) CFRelease(addressBook); } }); // 用戶已拒絕 或 iOS設(shè)備上的家長控制或其它一些許可配置阻止程序與通訊錄數(shù)據(jù)庫進(jìn)行交互 } else if (status == kABAuthorizationStatusDenied || status == kABAuthorizationStatusRestricted) { [self showErrorAlert]; if (addressBook) CFRelease(addressBook); } else if (status == kABAuthorizationStatusAuthorized) { // 用戶已授權(quán) contactModels = [self getAddressBookInfo:addressBook]; } return contactModels; } + (NSMutableArray *)getAddressBookInfo:(ABAddressBookRef)addressBook { CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook); NSInteger peopleCount = CFArrayGetCount(peopleArray); NSMutableArray *contactModels = [NSMutableArray array]; for (int i = 0; i < peopleCount; i++) { ABRecordRef person = CFArrayGetValueAtIndex(peopleArray, i); ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty); if (phones) { NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); NSString *name = [NSString stringWithFormat:@"%@%@", lastName == NULL ? @"" : lastName, firstName == NULL ? @"" : firstName]; NSLog(@"姓名: %@", name); CFIndex phoneCount = ABMultiValueGetCount(phones); for (int j = 0; j < phoneCount; j++) { NSString *phoneValue = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, j); NSLog(@"電話號碼: %@", phoneValue); ContactsModel *model = [[ContactsModel alloc] initWithName:name num:phoneValue]; [contactModels addObject:model]; } } CFRelease(phones); } if (addressBook) CFRelease(addressBook); if (peopleArray) CFRelease(peopleArray); return contactModels; } #pragma mark - Contacts + (NSMutableArray *)getContactsFromContacts { CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]; CNContactStore *store = [[CNContactStore alloc] init]; __block NSMutableArray *contactModels = [NSMutableArray array]; if (status == CNAuthorizationStatusNotDetermined) { // 用戶還沒有決定是否授權(quán)你的程序進(jìn)行訪問 [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted) { contactModels = [self getContactsInfo:store]; } else { [self showErrorAlert]; } }]; // 用戶已拒絕 或 iOS設(shè)備上的家長控制或其它一些許可配置阻止程序與通訊錄數(shù)據(jù)庫進(jìn)行交互 } else if (status == CNAuthorizationStatusDenied || status == CNAuthorizationStatusRestricted) { [self showErrorAlert]; } else if (status == CNAuthorizationStatusAuthorized) { // 用戶已授權(quán) contactModels = [self getContactsInfo:store]; } return contactModels; } + (NSMutableArray *)getContactsInfo:(CNContactStore *)store { NSArray *keys = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]; CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys]; NSMutableArray *contactModels = [NSMutableArray array]; [store enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) { NSString *name = [NSString stringWithFormat:@"%@%@", contact.familyName == NULL ? @"" : contact.familyName, contact.givenName == NULL ? @"" : contact.givenName]; NSLog(@"姓名: %@", name); for (CNLabeledValue *labeledValue in contact.phoneNumbers) { CNPhoneNumber *phoneNumber = labeledValue.value; NSLog(@"電話號碼: %@", phoneNumber.stringValue); ContactsModel *model = [[ContactsModel alloc] initWithName:name num:phoneNumber.stringValue]; [contactModels addObject:model]; } }]; return contactModels; } #pragma mark - Error + (void)showErrorAlert { NSLog(@"授權(quán)失敗, 請?jiān)试Sapp訪問您的通訊錄, 在手機(jī)的”設(shè)置-隱私-通訊錄“選項(xiàng)中設(shè)置允許"); } @end
使用
#import "ContactsHelp.h" #import "ContactsModel.h" ... @property(nonatomic, strong) ContactsHelp *contactsHelp; ... - (IBAction)btn_getOne { self.contactsHelp = [[ContactsHelp alloc] init]; [self.contactsHelp getOnePhoneInfoWithUI:self callBack:^(ContactsModel *contactModel) { NSLog(@"-----------"); NSLog(@"%@", contactModel.name); NSLog(@"%@", contactModel.num); }]; } - (IBAction)btn_getAll { NSMutableArray *contactModels = [ContactsHelp getAllPhoneInfo]; [contactModels enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { ContactsModel *model = obj; NSLog(@"-----------"); NSLog(@"%@", model.name); NSLog(@"%@", model.num); }]; }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。