以下是2种方式:

第一种方法:

GetAddressBook.h

#import <Foundation/Foundation.h>

@interface GetAddressBook : NSObject

- (NSArray *)getAddressBookAction;

@end

GetAddressBook.m

#import "GetAddressBook.h"
#import "ContactAddressModel.h"
#import "NSDate+TimeCategory.h" #import <AddressBook/AddressBook.h> @interface GetAddressBook () @property (nonatomic, strong) NSArray *arr; @end @implementation GetAddressBook - (NSArray *)getAddressBookAction { WEAKSELF
weaktype.arr = nil; ABAddressBookRef addressBook = ABAddressBookCreate();
// 用户授权
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { // 首次访问通讯录
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { if (!error) { if (granted) { // 允许 NSArray *contacts = [self fetchContactWithAddressBook:addressBook];
dispatch_async(dispatch_get_main_queue(), ^{ // NSLog(@"contacts:%@", contacts);
}); weaktype.arr = contacts;
} else { // 拒绝 NSLog(@"拒绝");
}
} else { NSLog(@"错误!");
}
}); return weaktype.arr;
} else { // 非首次访问通讯录 NSArray *contacts = [self fetchContactWithAddressBook:addressBook];
dispatch_async(dispatch_get_main_queue(), ^{ // NSLog(@"contacts:%@", contacts);
}); return contacts;
} } - (NSMutableArray *)fetchContactWithAddressBook:(ABAddressBookRef)addressBook { if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { // 有权限访问 NSMutableArray *contacts = [[NSMutableArray alloc] init]; // 获取联系人数组
NSArray *array = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
for (int i = ; i < array.count; i++) { // NSDictionary *dict = [[NSDictionary alloc] init];
// 获取联系人
ABRecordRef people = CFArrayGetValueAtIndex((__bridge ABRecordRef)array, i);
// 获取联系人详细信息,如:姓名,电话,住址等信息
NSString *firstName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty);
NSString *lastName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty); // 判断姓名null
NSString *displayName;
if (lastName.length > || firstName.length > ) { displayName = [NSString stringWithFormat:@"%@%@", lastName, firstName];
} else { displayName = @"";
} ABMutableMultiValueRef phoneRef = ABRecordCopyValue(people, kABPersonPhoneProperty);
NSArray *phoneList = ((__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneRef)); for (int j = ; j < phoneList.count; j++) { NSMutableDictionary *addressBookMDic = [NSMutableDictionary dictionary];
[addressBookMDic setValue:displayName forKey:@"name"];
[addressBookMDic setValue:phoneList[j] forKey:@"mobile"];
[contacts addObject:addressBookMDic];
} } return contacts; } else { // 无权限访问 // 提示授权
// UIAlertView * alart = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"请您设置允许APP访问您的通讯录\n设置-隐私-通讯录" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
// [alart show];
return nil;
}
} @end

第二种方法:

GetContactVC.h

#import <UIKit/UIKit.h>

@interface GetContactVC : UIViewController

@end

GetContactVC.m

#import "GetContactVC.h"
#import <AddressBook/AddressBook.h>
#import <ContactsUI/ContactsUI.h> @interface GetContactVC ()
{
UITableView *infoTable;
NSMutableArray *dataArray;
NSMutableDictionary *dataSectionData;
NSMutableArray *allKeysArray;
NSMutableArray *sortkeysArray; /**
* 创建CNContactStore对象,用与获取和保存通讯录信息
*/
CNContactStore *contactStore;
}
@end @implementation GetContactVC - (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor yellowColor]; if (@available(iOS 9.0, *)) { [self fetchAddressBookOnIOS9AndLater];
} else { [self fetchAddressBookBeforeIOS9];
}
} - (void)fetchAddressBookOnIOS9AndLater{
//创建CNContactStore对象
CNContactStore *contactStore = [[CNContactStore alloc] init];
//首次访问需用户授权
if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusNotDetermined) {//首次访问通讯录
[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!error){
if (granted) {//允许
NSLog(@"已授权访问通讯录");
NSArray *contacts = [self fetchContactWithContactStore:contactStore];//访问通讯录
dispatch_async(dispatch_get_main_queue(), ^{
//----------------主线程 更新 UI-----------------
NSLog(@"contacts:%@", contacts); });
}else{//拒绝
NSLog(@"拒绝访问通讯录");
}
}else{
NSLog(@"发生错误!");
}
}];
}else{
//非首次访问通讯录
NSArray *contacts = [self fetchContactWithContactStore:contactStore];//访问通讯录
dispatch_async(dispatch_get_main_queue(), ^{
//----------------主线程 更新 UI-----------------
NSLog(@"contacts:%@", contacts); });
}
} - (NSMutableArray *)fetchContactWithContactStore:(CNContactStore *)contactStore{
//判断访问权限
if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusAuthorized) {//有权限访问
NSError *error = nil;
//创建数组,必须遵守CNKeyDescriptor协议,放入相应的字符串常量来获取对应的联系人信息
NSArray <id<CNKeyDescriptor>> *keysToFetch = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey];
//获取通讯录数组
NSArray<CNContact*> *arr = [contactStore unifiedContactsMatchingPredicate:nil keysToFetch:keysToFetch error:&error];
if (!error) {
NSMutableArray *contacts = [NSMutableArray array]; for (int i = ; i < arr.count; i++) {
CNContact *contact = arr[i];
NSString *givenName = contact.givenName;
NSString *familyName = contact.familyName;
NSString *phoneNumber = @"NULL";
if ((CNPhoneNumber *)(contact.phoneNumbers.lastObject.value)) {
phoneNumber = ((CNPhoneNumber *)(contact.phoneNumbers.lastObject.value)).stringValue;
}
[contacts addObject:@{@"name": [givenName stringByAppendingString:familyName], @"phoneNumber": phoneNumber}];
}
return contacts;
}else {
return nil;
}
}else{//无权限访问
NSLog(@"无权限访问通讯录");
return nil;
}
} - (void)fetchAddressBookBeforeIOS9{
ABAddressBookRef addressBook = ABAddressBookCreate();
//首次访问需用户授权
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {//首次访问通讯录
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (!error) {
if (granted) {//允许
NSLog(@"已授权访问通讯录");
NSArray *contacts = [self fetchContactWithAddressBook:addressBook];
dispatch_async(dispatch_get_main_queue(), ^{
//----------------主线程 更新 UI-----------------
NSLog(@"contacts:%@", contacts);
});
}else{//拒绝
NSLog(@"拒绝访问通讯录");
}
}else{
NSLog(@"发生错误!");
}
});
}else{//非首次访问通讯录
NSArray *contacts = [self fetchContactWithAddressBook:addressBook];
dispatch_async(dispatch_get_main_queue(), ^{
//----------------主线程 更新 UI-----------------
NSLog(@"contacts:%@", contacts);
});
}
} - (NSMutableArray *)fetchContactWithAddressBook:(ABAddressBookRef)addressBook{
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {////有权限访问
//获取联系人数组
NSArray *array = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSMutableArray *contacts = [NSMutableArray array];
for (int i = ; i < array.count; i++) {
//获取联系人
ABRecordRef people = CFArrayGetValueAtIndex((__bridge ABRecordRef)array, i);
//获取联系人详细信息,如:姓名,电话,住址等信息
NSString *firstName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty);
NSString *lastName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty);
ABMutableMultiValueRef *phoneNumRef = ABRecordCopyValue(people, kABPersonPhoneProperty);
NSString *phoneNumber = ((__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneNumRef)).lastObject;
[contacts addObject:@{@"name": [firstName stringByAppendingString:lastName], @"phoneNumber": phoneNumber}];
}
return contacts;
}else{//无权限访问
NSLog(@"无权限访问通讯录");
return nil;
}
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

iOS获取通讯录所有联系人信息的更多相关文章

  1. iOS 获取通讯录中联系人的所有属性 by - zfqj

    1 ABAddressBookRef addressBook = ABAddressBookCreate(); 2 3 CFArrayRef results = ABAddressBookCopyAr ...

  2. IOS 获取通讯录中信息

    获取通讯录中信息 一. 我们设置一个ABAddressBookRef类型的属性addressBook. 二. 要获得通讯录中的信息,我们需要获取访问通讯录的权限. 在运行下面的获取权限的方法的时候,系 ...

  3. ios 获取通讯录的所有信息

    iOS获取通讯录全部信息 ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBoo ...

  4. 【实用篇】获取Android通讯录中联系人信息

    第一步,在Main.xml布局文件中声明一个Button控件,布局文件代码如下: <LinearLayout xmlns:android="http://schemas.android ...

  5. iOS 获得通讯录中联系人的所有属性--b

    ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBookCopyArrayOfA ...

  6. Android初级教程获取手机系统联系人信息

    在手机内部,对联系人信息存在对应的数据库.我们创建的而联系人信息都存在这张表中.如下是对数据库的截图,我已经对表和应该注意的地方做了红笔标注: 好了,现在可以根据数据库里面的数据来写代码了. 代码如下 ...

  7. [android] 获取系统的联系人信息

    内容提供是实质上是个接口,后门,他给别人提供数据,系统联系人是个比较复杂的内容通过者. 找到/data/data/com.android.providers.contacts/contacts2.db ...

  8. ios 获得通讯录中联系人的所有属性 亲测,可行 兼容io6 和 ios 7

    //获取通讯录中的所有属性,并存储在 textView 中,已检验,切实可行.兼容io6 和 ios 7 ,而且ios7还没有权限确认提示. -(void)getAddressBook { ABAdd ...

  9. ios 获取设备相关的信息

    .获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name; //获取设备所有者的名称 NSStr ...

随机推荐

  1. csharp: DataTable export to excel,word,csv etc

    http://code.msdn.microsoft.com/office/Export-GridView-to-07c9f836 https://exporter.codeplex.com/ htt ...

  2. 初识 ElasticSearch

    场景:最近有同事分享了ElasticSearch Inverted Index,所以自己也了解一下基于Lucene的ES. 转载自:http://www.jianshu.com/p/05cff7175 ...

  3. 医药箱APP静态小项目

    花费了10天时间,纯手写一个医药箱APP静态小项目,里面有上拉加载.左右滑动.弹出层淡入淡出等效果,主要是练习. 以下是一部分页面效果图: 我用的是谷歌的开发者工具的手机端模拟器. 里面需要优化的地方 ...

  4. 对连接到 Azure 中 Linux VM 时出现的问题进行详细的 SSH 故障排除的步骤

    有许多可能的原因会导致 SSH 客户端无法访问 VM 上的 SSH 服务. 如果已经执行了较常规的 SSH 故障排除步骤,则需要进一步排查连接问题. 本文指导用户完成详细的故障排除步骤,以确定 SSH ...

  5. ubuntu 安装nodejs和git

    1.安装curl sudo apt-get install curl 2.安装nodejs 和 npm curl -sL https://deb.nodesource.com/setup_8.x | ...

  6. python+appium学习之swipe

    #coding:utf-8 from appium import webdriver from time import sleep import random desired_caps={ " ...

  7. SAP Customer Data Cloud(Gigya)的用户搜索实现

    我在Gigya前台根据email搜索,输入一个邮箱地址,回车,在Chrome开发者工具里观察到到后台的网络请求: 这是一个post请求: __RequestVerificationToken 请求体: ...

  8. ABAP类的文档生成工具

    本文介绍的工具原理和JavaDoc类似,位于software component BBPCRM 1. 在ABAP类里新建一个名为CLASS_DOCU的私有方法. 然后把所有的注释写在这个方法源代码的前 ...

  9. BZOJ 3680: 吊打XXX (模拟退火)

    //yy:今天简单入门学了下ORZ 爬山算法:兔子朝着比现在高的地方跳去.它找到了不远处的最高山峰.但是这座山不一定是珠穆朗玛峰.这就是爬山算法,它不能保证局部最优值就是全局最优值. 模拟退火:兔子喝 ...

  10. 郝斌 SqlServer2005 学习笔记

    1.0 什么是数据库 狭义:存储数据的仓库. 广义:可以对数据进行存储和管理的软件以及数据本身统称为数据库. 另外一种说法:数据库是由表.关系.操作组成. 2.0 为什么要学习数据库 几乎所有的应用软 ...