利用AddressBook.framework框架获取iOS系统通讯录数据
此方法是使用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系统通讯录数据的更多相关文章
- 获取iOS系统版本号,慎重使用[[[UIDevice currentDevice] systemVersion] floatValue]——【sdk缺陷】
iOS 最常见的获取系统版本的方法是: [[[UIDevice currentDevice] systemVersion] floatValue] 可是.这个floatValue是不靠谱的,这也算是i ...
- 用 iOS-System-Services 框架获取iOS设备所用的设备信息
参考资料地址 https://github.com/Shmoopi/iOS-System-Services 百度云盘下载地址 http://pan.baidu.com/s/1c05ot1m This ...
- 获取iOS系统版本 --- UIDevice
UIDevice类是一个单例,其唯一的实例( [UIDevice currentDevice] ) 代表了当前使用的设备. 通过这个实例,可以获得设备的相关信息(包括系统名称,版本号,设备模式等等). ...
- Git.Framework 框架随手记--ORM查询数据集合 二
一. 分组查询 在SQL中使用Group By 来对数据分组,在实际中分组中一般与聚合函数一并使用.在Git.Framework中提供了相应的分组方法 DataTable Group(T entit ...
- ios 读取通讯录数据
#import <Foundation/Foundation.h> @interface LoadingContactData : NSObject // 读取通讯录 + (Loading ...
- Git.Framework 框架随手记--ORM查询数据集合 一
本文记录Git.Framework之ORM中最为浓墨重彩的一篇,查询集合.根据自己做的项目统计这个是使用频率最高的一个. 一. 查询集合方法简介 (1)List<T> GetList(); ...
- 利用python scrapy 框架抓取豆瓣小组数据
因为最近在找房子在豆瓣小组-上海租房上找,发现搜索困难,于是想利用爬虫将数据抓取. 顺便熟悉一下Python. 这边有scrapy 入门教程出处:http://www.cnblogs.com/txw1 ...
- Swift - 访问通讯录-使用AddressBook.framework和AddressBookUI.framework框架实现
1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...
- iOS系统层次架构
本文转自:http://blog.csdn.net/lxl_815520/article/details/51172917 一,概述 iOS的系统架构分为四个层次:核心操作系统层(Core OS la ...
随机推荐
- linux如何处理多连接请求?
1.TCP迭代服务器程序 这种方式就是服务器同一时间只处理一个客户端的请求,这个请求处理完以后才转向下一个客户请求.当然这样的服务器程序比较少见,这就像一个公司只能一次处理一个客户,后面的客户只能等待 ...
- Flask使用原生sql语句
安装pip install flask-sqlalchemy 创建数据库对象 # 设置数据库连接地址app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://r ...
- 前端 CSS 盒子模型 padding 内边距 属性
padding:就是内边距的意思,它是边框到内容之间的距离 另外padding的区域是有背景颜色的.并且背景颜色和内容区域的颜色一样.也就是说background-color这个属性将填充所有的bor ...
- java二周的学习总结
一转眼二周就过去了,个人觉得虽然java和C语言有差异,但差别并不大,因为语法语句方面都是差不多的,因为我上个学期并没有很认真的学好C语言,所以我这个学期更希望学好java,java方面还是挺有趣的, ...
- MySQL-第十二篇管理结果集
1.ResultSet 2.可更新的结果集,使用ResultSet的updateRow()方法.
- 微信小程序 Mustache语法详解
最近微信小程序非常火,对于前端开发的程序员是个利好的消息,这里主要记录下微信小程序 Mustache语法. 小程序开发的wxml里,用到了Mustache语法.所以,非常有必要把Mustache研究 ...
- java_第一年_JavaWeb(11)
自定义标签:主要是用来移除JSP页面中的java代码. 先从一个简单的案例了解其怎么移除代码: 一个正常的jsp页面: <%@ page language="java" pa ...
- Codeforces 396C (DFS序+线段树)
题面 传送门 题目大意: 给定一棵树,每个点都有权值,边的长度均为1,有两种操作 操作1:将节点u的值增加x,并且对于u的子树中的任意一个点v,将它的值增加x-dist(u,v)*k, dist(u, ...
- 安装paramiko的方法
打开cmd命令行 输入 cd /d C:\Python27\Scripts 输入 pip install paramiko pip install pika -i https://pypi.doub ...
- ElasticSearch 入门介绍
tags: 第三方 lucene [toc] 1. what Elastic Search(ES)是什么 全文检索和lucene 全文检索 优点:高效,准确,分词全文检索允许用户输入一些关键字,从数据 ...