此方法是使用AddressBook.framework框架获取通讯录信息

第一步、在info.plist文件里面配置访问权限

第二步、导入头文件

 #import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>

第三步、获取通讯录数据

 - (void)getSystemAddress{

     //新建一个通讯录类
ABAddressBookRef addressBooks = nil;
//判断是否在ios6.0版本以上
if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
{
addressBooks = ABAddressBookCreateWithOptions(NULL, NULL);
//获取通讯录权限
dispatch_semaphore_t sema = dispatch_semaphore_create(); ABAddressBookRequestAccessWithCompletion(addressBooks, ^(bool granted, CFErrorRef error){dispatch_semaphore_signal(sema);}); dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else
{
CFErrorRef* error=nil;
addressBooks = ABAddressBookCreateWithOptions(NULL, error);
} //获取通讯录中的所有人
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBooks);
//通讯录中人数
CFIndex nPeople = ABAddressBookGetPersonCount(addressBooks); for (NSInteger i = ; i < nPeople; i++)
{
ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
//获取个人名字
CFTypeRef abName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *nameString = (__bridge NSString *)abName; CFTypeRef abLastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
NSString *lastNameString = (__bridge NSString *)abLastName; CFStringRef abFullName = ABRecordCopyCompositeName(person);
if ((__bridge id)abFullName != nil)
{
nameString = (__bridge NSString *)abFullName;
}
else
{
if ((__bridge id)abLastName != nil){
nameString = [NSString stringWithFormat:@"%@ %@", nameString, lastNameString];
}
}
//获取到的姓名
NSLog(@"name:%@", nameString); ABPropertyID multiProperties[] = {
kABPersonPhoneProperty,
kABPersonEmailProperty
};
NSInteger multiPropertiesTotal = sizeof(multiProperties) / sizeof(ABPropertyID);
for (NSInteger j = ; j < multiPropertiesTotal; j++)
{
ABPropertyID property = multiProperties[j];
ABMultiValueRef valuesRef = ABRecordCopyValue(person, property);
NSInteger valuesCount = ;
if (valuesRef != nil){
//获取每个联系人添加的电话号码数量
valuesCount = ABMultiValueGetCount(valuesRef);
}
if (valuesCount == ) {
CFRelease(valuesRef);
continue;
}
//获取电话号码和email
for (NSInteger k = ; k < valuesCount; k++)
{
CFTypeRef value = ABMultiValueCopyValueAtIndex(valuesRef, k);
switch (j)
{
case : // Phone number
{
NSString * phoneNumber = (__bridge NSString*)value;
NSLog(@"电话:%@", phoneNumber);
break;
}
case : // Email
{
NSString *email = (__bridge NSString*)value;
NSLog(@"邮箱:%@", email);
break;
}
}
CFRelease(value);
}
}
}
}

第四步、获取到姓名、电话、邮箱后可建立model保存,这里只是打印出来

五、扩展、其他信息的获取方法

 //获取当前联系人名字
NSString*firstName=(__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
//获取当前联系人姓氏
NSString*lastName=(__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));
//获取当前联系人中间名
NSString*middleName=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonMiddleNameProperty));
//获取当前联系人的名字前缀
NSString*prefix=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonPrefixProperty));
//获取当前联系人的名字后缀
NSString*suffix=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonSuffixProperty));
//获取当前联系人的昵称
NSString*nickName=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonNicknameProperty));
//获取当前联系人的名字拼音
NSString*firstNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonFirstNamePhoneticProperty));
//获取当前联系人的姓氏拼音
NSString*lastNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonLastNamePhoneticProperty));
//获取当前联系人的中间名拼音
NSString*middleNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonMiddleNamePhoneticProperty));
//获取当前联系人的公司
NSString*organization=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonOrganizationProperty));
//获取当前联系人的职位
NSString*job=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonJobTitleProperty));
//获取当前联系人的部门
NSString*department=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonDepartmentProperty));
//获取当前联系人的生日
NSString*birthday=(__bridge NSDate*)(ABRecordCopyValue(person, kABPersonBirthdayProperty));
NSMutableArray * emailArr = [[NSMutableArray alloc]init];
//获取当前联系人的邮箱 注意是数组
ABMultiValueRef emails= ABRecordCopyValue(person, kABPersonEmailProperty);
for (NSInteger j=; j<ABMultiValueGetCount(emails); j++) {
[emailArr addObject:(__bridge NSString *)(ABMultiValueCopyValueAtIndex(emails, j))];
}
//获取当前联系人的备注
NSString*notes=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonNoteProperty));
//获取创建当前联系人的时间 注意是NSDate
NSDate*creatTime=(__bridge NSDate*)(ABRecordCopyValue(person, kABPersonCreationDateProperty));
//获取最近修改当前联系人的时间
NSDate*alterTime=(__bridge NSDate*)(ABRecordCopyValue(person, kABPersonModificationDateProperty));
//获取地址
ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty);
for (int j=; j<ABMultiValueGetCount(address); j++) {
//地址类型
NSString *type = (__bridge NSString *)(ABMultiValueCopyLabelAtIndex(address, j));
NSDictionary * temDic = (__bridge NSDictionary *)(ABMultiValueCopyValueAtIndex(address, j));
//地址字符串,可以按需求格式化
NSString * adress = [NSString stringWithFormat:@"国家:%@\n省:%@\n市:%@\n街道:%@\n邮编:%@",[temDic valueForKey:(NSString*)kABPersonAddressCountryKey],[temDic valueForKey:(NSString*)kABPersonAddressStateKey],[temDic valueForKey:(NSString*)kABPersonAddressCityKey],[temDic valueForKey:(NSString*)kABPersonAddressStreetKey],[temDic valueForKey:(NSString*)kABPersonAddressZIPKey]];
}
//获取当前联系人头像图片
NSData*userImage=(__bridge NSData*)(ABPersonCopyImageData(person));
//获取当前联系人纪念日
NSMutableArray * dateArr = [[NSMutableArray alloc]init];
ABMultiValueRef dates= ABRecordCopyValue(person, kABPersonDateProperty);
for (NSInteger j=; j<ABMultiValueGetCount(dates); j++) {
//获取纪念日日期
NSDate * data =(__bridge NSDate*)(ABMultiValueCopyValueAtIndex(dates, j));
//获取纪念日名称
NSString * str =(__bridge NSString*)(ABMultiValueCopyLabelAtIndex(dates, j));
NSDictionary * temDic = [NSDictionary dictionaryWithObject:data forKey:str];
[dateArr addObject:temDic];
}

利用AddressBook.framework框架获取iOS系统通讯录数据的更多相关文章

  1. 获取iOS系统版本号,慎重使用[[[UIDevice currentDevice] systemVersion] floatValue]——【sdk缺陷】

    iOS 最常见的获取系统版本的方法是: [[[UIDevice currentDevice] systemVersion] floatValue] 可是.这个floatValue是不靠谱的,这也算是i ...

  2. 用 iOS-System-Services 框架获取iOS设备所用的设备信息

    参考资料地址 https://github.com/Shmoopi/iOS-System-Services 百度云盘下载地址 http://pan.baidu.com/s/1c05ot1m This ...

  3. 获取iOS系统版本 --- UIDevice

    UIDevice类是一个单例,其唯一的实例( [UIDevice currentDevice] ) 代表了当前使用的设备. 通过这个实例,可以获得设备的相关信息(包括系统名称,版本号,设备模式等等). ...

  4. Git.Framework 框架随手记--ORM查询数据集合 二

    一.  分组查询 在SQL中使用Group By 来对数据分组,在实际中分组中一般与聚合函数一并使用.在Git.Framework中提供了相应的分组方法 DataTable Group(T entit ...

  5. ios 读取通讯录数据

    #import <Foundation/Foundation.h> @interface LoadingContactData : NSObject // 读取通讯录 + (Loading ...

  6. Git.Framework 框架随手记--ORM查询数据集合 一

    本文记录Git.Framework之ORM中最为浓墨重彩的一篇,查询集合.根据自己做的项目统计这个是使用频率最高的一个. 一. 查询集合方法简介 (1)List<T> GetList(); ...

  7. 利用python scrapy 框架抓取豆瓣小组数据

    因为最近在找房子在豆瓣小组-上海租房上找,发现搜索困难,于是想利用爬虫将数据抓取. 顺便熟悉一下Python. 这边有scrapy 入门教程出处:http://www.cnblogs.com/txw1 ...

  8. Swift - 访问通讯录-使用AddressBook.framework和AddressBookUI.framework框架实现

    1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...

  9. iOS系统层次架构

    本文转自:http://blog.csdn.net/lxl_815520/article/details/51172917 一,概述 iOS的系统架构分为四个层次:核心操作系统层(Core OS la ...

随机推荐

  1. linux 简单安装mongodb

    Linux 安装mongodb 1.下载mongodb linux wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon- ...

  2. CSS去除点击按钮时出现的虚线框

    1. outline:none://需要配合仅ie6和ie7支持的css属性blr:expression_r(this.onFocus=this.blur()); 优点:较为常用 缺点:ie6.ie7 ...

  3. 打开虚拟机提示 无法获得vmci 驱动程序的版本:句柄无效

    我从另一台电脑复制过来虚拟机,提示如题. 找到  我的虚拟机的  *.vmx文件(如NeoKylin.vmx),其中有 vmci0.present = "TRUE",将TRUE改为 ...

  4. Python 3实现网页爬虫

    1 什么是网页爬虫 网络爬虫( 网页蜘蛛,网络机器人,网页追逐者,自动索引,模拟程序)是一种按照一定的规则自动地抓取互联网信息的程序或者脚本,从互联网上抓取对于我们有价值的信息.Tips:自动提取网页 ...

  5. web框架的本质(使用socket实现的最基础的web框架、使用wsgiref实现的web框架)

    import socket def handle_request(client): data = client.recv(1024) client.send("HTTP/1.1 200 OK ...

  6. express通过生成器

    express通过生成器 [ 脚手架 ] 1. 作用:可以帮助快速构建一个express项目 2. 脚手架的安装 全局安装 [可以使用npm cnpm] $ cnpm i express-genera ...

  7. jquery 点击加载更多

    html部分 <ul class="bill moreadd"> <div class="total"><span>-< ...

  8. WPF绑定各种数据源之xml数据源

    一.WPF绑定各种数据源索引 WPF 绑定各种数据源之Datatable WPF绑定各种数据源之object数据源 WPF绑定各种数据源之xml数据源 WPF绑定各种数据源之元素控件属性 Bindin ...

  9. service mesh学习规划

    istio go语言 谷歌开发 现有产品功能(每个功能具体支持哪些方式,优缺点) 服务注册发现 流量劫持 路由 负载均衡 熔断降级 流量控制(限流.流量分配) 重试机制 日志管理 支持的协议 监控(健 ...

  10. TensorFlow学习笔记2:逻辑回归实现手写字符识别

    代码比较简单,没啥好说的,就做个记录而已.大致就是现建立graph,再通过session运行即可.需要注意的就是Variable要先初始化再使用. import tensorflow as tf fr ...