亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > 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); }];}

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91影院在线免费观看视频| 欧美日韩国产一中文字不卡| 69**夜色精品国产69乱| 日韩视频免费中文字幕| 日韩精品视频在线| 成人免费视频网址| 91网在线免费观看| 国产91久久婷婷一区二区| 成人黄色免费网站在线观看| 亚洲一区二区三区香蕉| 在线观看日韩专区| 日韩精品免费综合视频在线播放| 国产脚交av在线一区二区| 亚洲丝袜在线视频| 日韩一二三在线视频播| 亚洲成色777777在线观看影院| 亚洲a级在线播放观看| 国产日韩中文在线| 秋霞午夜一区二区| 欧美视频在线视频| 欧美视频二区36p| 亚洲一区二区三区乱码aⅴ蜜桃女| 91在线中文字幕| 国产亚洲精品高潮| 美女av一区二区| 亚洲福利视频久久| 欧美激情亚洲综合一区| 91色视频在线观看| 欧美成人一二三| 国产精品三级久久久久久电影| 亚洲乱码一区av黑人高潮| 日韩高清免费在线| 5252色成人免费视频| 91精品在线影院| 国产精品高精视频免费| 亚洲国产小视频在线观看| 国产精品视频免费在线| 1769国产精品| 日韩午夜在线视频| 成人黄色免费片| 亚洲另类xxxx| 日本精品一区二区三区在线| 国产在线精品一区免费香蕉| 久久精品影视伊人网| 国产精品露脸自拍| 日韩成人中文电影| 欧美一级淫片丝袜脚交| 亚洲成年人在线播放| 97色在线观看| 国产成人激情小视频| 精品视频偷偷看在线观看| 疯狂蹂躏欧美一区二区精品| 精品偷拍各种wc美女嘘嘘| 日韩成人久久久| 国产精品免费视频xxxx| 综合久久五月天| 国产成人97精品免费看片| 97在线视频免费播放| 欧美激情一区二区三区高清视频| 亚洲第一视频网| 欧美在线欧美在线| 中文字幕成人精品久久不卡| 美日韩精品视频免费看| 国产成人97精品免费看片| 亚洲va欧美va国产综合剧情| 欧美专区在线观看| 久久网福利资源网站| 亚洲一区二区三区四区视频| 日韩电影免费在线观看中文字幕| 538国产精品一区二区免费视频| 国产欧美精品日韩| 九九热这里只有精品6| 精品成人在线视频| 日本久久久久亚洲中字幕| 91香蕉亚洲精品| 欧美日韩美女在线| 91香蕉国产在线观看| 亚洲精品福利在线| 国产一区二区久久精品| 久久在精品线影院精品国产| 色狠狠av一区二区三区香蕉蜜桃| 成人免费淫片视频软件| 91经典在线视频| 国产精品伦子伦免费视频| 亚洲高清久久久久久| 夜夜嗨av一区二区三区免费区| 欧美成人中文字幕在线| 日韩黄在线观看| 国产欧美在线播放| 久久久久久久久久国产| 在线丨暗呦小u女国产精品| 久久综合伊人77777| 亚洲欧美中文日韩在线| 亚洲日本成人女熟在线观看| 国产成人一区二| 久久久国产在线视频| 日韩美女写真福利在线观看| 国产成人久久久精品一区| 91成品人片a无限观看| 国产在线观看不卡| 中文字幕亚洲国产| 亚洲色图13p| 国产第一区电影| 日韩精品亚洲视频| 国产脚交av在线一区二区| 亚洲第一国产精品| 国产午夜精品一区二区三区| 久久av.com| 夜夜狂射影院欧美极品| 欧美精品一区三区| 国产成人啪精品视频免费网| 国产精品久久久久久久久久久久久久| 国产精品欧美日韩| 日韩电影在线观看中文字幕| 国产亚洲欧美一区| 91精品久久久久久综合乱菊| 国产日本欧美一区| 欧美精品999| 国产国语videosex另类| 精品五月天久久| 91久久国产综合久久91精品网站| 成人精品一区二区三区电影黑人| 色妞欧美日韩在线| 岛国av一区二区在线在线观看| 国产欧美亚洲精品| 国产精品日韩在线播放| 国产欧美日韩视频| 亚洲精品不卡在线| 中文字幕亚洲一区二区三区| 另类图片亚洲另类| 国产精品老女人精品视频| 日韩视频欧美视频| 久久久国产精品一区| 国产精品人成电影| 色偷偷噜噜噜亚洲男人| 欧美剧在线观看| 亚洲日本中文字幕免费在线不卡| 九九热这里只有在线精品视| xxxxx91麻豆| 亚洲精品日产aⅴ| 国产精品久久久久久久天堂| 精品国模在线视频| 欧美激情精品久久久久久变态| 国产精品丝袜白浆摸在线| 久久影视电视剧免费网站| 日韩中文视频免费在线观看| 国产精品一区二区三区在线播放| 日韩免费在线免费观看| 国产网站欧美日韩免费精品在线观看| 欧美大胆a视频| 欧美老女人www| 久久久久久久久久久免费精品| 国产日韩欧美91| 久久香蕉国产线看观看网| 日韩欧美极品在线观看| 国产精品草莓在线免费观看| 亚洲成人av片| 欧美精品精品精品精品免费| 日韩av免费在线看| 精品亚洲一区二区三区四区五区| 亚洲国产成人久久| 日韩精品有码在线观看| 日韩久久免费电影| 久久精品国产视频|