国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS實現封裝一個獲取通訊錄的工具類詳解

2020-07-26 02:38:27
字體:
來源:轉載
供稿:網友

前言

本文給大家介紹了關于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

  • key: Privacy - Contacts Usage Description
  • value: 自由發揮, 這里隨便寫一句: 是否允許此App訪問你的通訊錄?

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); }];}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长岭县| 土默特左旗| 北安市| 凤冈县| 来凤县| 湾仔区| 华阴市| 勐海县| 新源县| 平罗县| 丰都县| 武陟县| 怀宁县| 深泽县| 广汉市| 织金县| 合肥市| 浦江县| 酒泉市| 民权县| 凤山市| 博野县| 桐城市| 通化县| 瑞昌市| 娄烦县| 丽水市| 高雄县| 措勤县| 青川县| 芜湖市| 和平区| 南投市| 潍坊市| 榆树市| 聂荣县| 泽州县| 湖口县| 泰州市| 慈溪市| 徐水县|