您好,登錄后才能下訂單哦!
前言
本文給大家介紹了關于iOS如何封裝一個獲取通訊錄工具類的相關內容,iOS獲取通訊錄一共有4個framework: AddressBook, AddressBookUI, Contacts, ContactsUI; 其中 AddressBook 和 AddressBookUI 已經被iOS9時 deprecated 了, 而推出了Contacts 和 ContactsUI 取代之. 其中 AddressBookUI 和 ContactsUI 是picker出一個界面提供選擇一條聯系人信息并且是不需要手動授權, AddressBook 和 Contacts 是獲取全部通訊錄數據并且需要手動授權.下面來一起看看詳細的介紹吧。
注意:在iOS10獲取通訊錄權限需主動在info.plist
里添加上提示信息. 不然會崩潰. 在info.plist
里添加一對key和value
ContactsModel
新建兩個數據模型文件來保存獲取的通訊錄數據
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) { // 用戶還沒有決定是否授權你的程序進行訪問 ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { if (granted) { contactModels = [self getAddressBookInfo:addressBook]; } else { [self showErrorAlert]; if (addressBook) CFRelease(addressBook); } }); // 用戶已拒絕 或 iOS設備上的家長控制或其它一些許可配置阻止程序與通訊錄數據庫進行交互 } else if (status == kABAuthorizationStatusDenied || status == kABAuthorizationStatusRestricted) { [self showErrorAlert]; if (addressBook) CFRelease(addressBook); } else if (status == kABAuthorizationStatusAuthorized) { // 用戶已授權 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) { // 用戶還沒有決定是否授權你的程序進行訪問 [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted) { contactModels = [self getContactsInfo:store]; } else { [self showErrorAlert]; } }]; // 用戶已拒絕 或 iOS設備上的家長控制或其它一些許可配置阻止程序與通訊錄數據庫進行交互 } else if (status == CNAuthorizationStatusDenied || status == CNAuthorizationStatusRestricted) { [self showErrorAlert]; } else if (status == CNAuthorizationStatusAuthorized) { // 用戶已授權 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(@"授權失敗, 請允許app訪問您的通訊錄, 在手機的”設置-隱私-通訊錄“選項中設置允許"); } @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); }]; }
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。