一、首先获取用户通讯录授权信息。

在AppDelegate中导入#import <AddressBook/AddressBook.h>框架,在下列方法中获取授权信息。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

具体代码:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

     // 1.获取通讯录授权状态
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
// 2.授权申请
if (status == kABAuthorizationStatusNotDetermined) {
// 有create就一定有release
ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL); ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) {
if (granted) {
NSLog(@"授权允许");
}else {
NSLog(@"授权拒绝");
}
}); CFRelease(book);
}
return YES;
}

二、对通讯录联系人属性进行的一系列操作

 - (void)viewDidLoad {
[super viewDidLoad];
// 1.创建通讯录
ABAddressBookRef book = ABAddressBookCreate();
// 2.得到所有通讯录
CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(book); for (NSUInteger i=; i<CFArrayGetCount(results); i++) {
ABRecordRef person = CFArrayGetValueAtIndex(results, i); // 读取firstName
NSString *personName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
if (personName != nil) {
NSLog(@"名:%@", personName);
} // 获取lastName
NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));
if (lastName != nil) {
NSLog(@"姓:%@", lastName);
} // NSString *lastNamePhonetic = (__bridge NSString *)(ABRecordCopyValue(book, kABPersonLastNamePhoneticProperty));
// if (lastNamePhonetic != nil) {
// NSLog(@"%@", lastNamePhonetic);
// }
//读取organization公司
NSString *organization = (__bridge NSString*)ABRecordCopyValue(person, kABPersonOrganizationProperty);
if(organization != nil) NSLog(@"%@", organization); //获取email多值
ABMultiValueRef email = ABRecordCopyValue(person, kABPersonEmailProperty);
int emailcount = ABMultiValueGetCount(email);
for (int x = ; x < emailcount; x++)
{
//获取email Label
NSString* emailLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(email, x));
//获取email值
NSString* emailContent = (__bridge NSString*)ABMultiValueCopyValueAtIndex(email, x);
NSLog(@"emailLabel:%@,emailContent:%@",emailLabel,emailContent);
}
//读取地址多值
ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty);
int count = ABMultiValueGetCount(address); for(int j = ; j < count; j++)
{
//获取地址Label
NSString* addressLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(address, j);
NSLog(@"%@",addressLabel);
//获取該label下的地址6属性
NSDictionary* personaddress =(__bridge NSDictionary*) ABMultiValueCopyValueAtIndex(address, j);
NSString* country = [personaddress valueForKey:(NSString *)kABPersonAddressCountryKey];
if(country != nil)
NSLog(@"国家:%@\n",country);
NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey];
if(city != nil)
NSLog(@"城市:%@\n",city);
NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey];
if(state != nil)
NSLog(@"省:%@\n",state);
NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey];
if(street != nil)
NSLog(@"街道:%@\n",street);
NSString* zip = [personaddress valueForKey:(NSString *)kABPersonAddressZIPKey];
if(zip != nil)
NSLog(@"邮编:%@\n",zip);
NSString* coutntrycode = [personaddress valueForKey:(NSString *)kABPersonAddressCountryCodeKey];
if(coutntrycode != nil)
NSLog(@"国家编号:%@\n",coutntrycode);
}
//第一次添加该条记录的时间
NSString *firstknow = (__bridge NSString*)ABRecordCopyValue(person, kABPersonCreationDateProperty);
NSLog(@"第一次添加该条记录的时间%@\n",firstknow);
//最后一次修改該条记录的时间
NSString *lastknow = (__bridge NSString*)ABRecordCopyValue(person, kABPersonModificationDateProperty);
NSLog(@"最后一次修改该条记录的时间%@\n",lastknow); //读取电话多值
ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
for (int k = ; k<ABMultiValueGetCount(phone); k++)
{
//获取电话Label
NSString * personPhoneLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phone, k));
//获取該Label下的电话值
NSString * personPhone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phone, k); NSLog(@"%@:%@\n",personPhoneLabel,personPhone);
} //获取URL多值
ABMultiValueRef url = ABRecordCopyValue(person, kABPersonURLProperty);
for (int m = ; m < ABMultiValueGetCount(url); m++)
{
//获取电话Label
NSString * urlLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(url, m));
//获取該Label下的电话值
NSString * urlContent = (__bridge NSString*)ABMultiValueCopyValueAtIndex(url,m); NSLog(@"%@:%@\n",urlLabel,urlContent);
} //读取照片
NSData *image = (__bridge NSData*)ABPersonCopyImageData(person); UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(, , , )];
[myImage setImage:[UIImage imageWithData:image]];
myImage.opaque = YES;
[self.view addSubview:myImage]; } CFRelease(book);
CFRelease(results);
}

这里只是获取了通讯录联系人的一部分属性。获取更多的属性参考《iOS 获取通讯录中联系人的所有属性

三、获取这些属性你也可以利用三方框架RHAddressBook 参考: ios中访问通讯录数据

引入头文件,这里我用的是cocopods管理这个三方框架,引入框架同时 #import <RHAddressBook.h>,还要引入 #import <RHAddressBook/RHPerson.h>这个头文件。具体代码:

  // 创建通讯录对象
RHAddressBook *book = [[RHAddressBook alloc] init];
// 获取通讯录所有联系人
NSArray *peopleArray = book.people; for (RHPerson *people in peopleArray) { //获取人员的firstName
NSString* firstName = people.firstName;
//获取人员的lastName
NSString* lastName = people.lastName;
//获取该人员的号码(号码有多个,所以用RHMultiValue)
RHMultiValue* phoneNumbers = people.phoneNumbers;
NSUInteger phoneNumberCount = phoneNumbers.count;
for (int i = ; i < phoneNumberCount; i++) {
//遍历每个号码中的label(比如:手机 家庭 公司)
NSString* label = [phoneNumbers labelAtIndex:i];
//遍历出号码
NSString* nember = [phoneNumbers valueAtIndex:i];
NSLog(@"%@, %@ ,%@,%@",firstName,lastName,label,nember);
}
NSLog(@"%@", people); }

当然还有很多属性,具体可以进入文件查看其属性。

四、如果你对通讯录的添加删除感兴趣,可以参考

《iOS添加、删除通讯录》

 - (void)addAddressBook
{
// 创建一个通讯录操作对象
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted) {
// 创建新的联系人记录
ABRecordRef newRecord = ABPersonCreate();
NSString *firstName = @"五";
NSString *lastName = @"王";
// 为新的联系人添加属性值
ABRecordSetValue(newRecord, kABPersonFirstNameProperty, (__bridge CFTypeRef)(firstName), NULL);
ABRecordSetValue(newRecord, kABPersonLastNameProperty, (__bridge CFTypeRef)(lastName), NULL); // 创建一个多值属性
ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType); NSString *mobeileLabel = @"";
ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)(mobeileLabel), kABPersonPhoneMobileLabel, NULL); // 将多值属性添加到记录
ABRecordSetValue(newRecord, kABPersonPhoneProperty, multi, NULL); // 添加记录到通讯录操作对象
ABAddressBookAddRecord(addressBook, newRecord, NULL); CFRelease(multi);
CFRelease(newRecord);
}
});
ABAddressBookSave(addressBook, NULL);
CFRelease(addressBook);
}

五、推荐一篇值得学习的文章  iOS开发——高级篇——通讯录

 

iOS有关通讯录操作的更多相关文章

  1. ios读取通讯录信息

    ios读取通讯录信息 (2012-05-22 14:07:11) 标签: ios读取通讯录 it   iphone如许app读取通讯录信息,读取通讯录信息时需要加载AddressBookUI 和Add ...

  2. iOS 修改通讯录联系人地址(address)崩溃原因分析

    目前项目中需要对iOS系统通讯录进行读取,修改操作.在进行对地址修改的时候,出现了一个奇怪现象: ● 如果contact没有address字段(或者一个全新的contact),对它的address进行 ...

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

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

  4. iOS多线程拾贝------操作巨人编程

    iOS多线程拾贝------操作巨人编程 多线程 基本 实现方案:pthread - NSThread - GCD - NSOperation Pthread 多平台,可移植 c语言,要程序员管理生命 ...

  5. iOS - SQLite Database 操作数据库

    iOS - SQLite Database 操作数据库   Sqlite 能被用在ios上做数据处理用,只要你懂得一点sql 就很容易使用sqlite 1:创建一个简单的View based appl ...

  6. IOS各种手势操作实例

    先看下效果 手势相关的介绍 IOS中手势操作一般是 UIGestureRecognizer 类的几个手势子类去实现,一般我们用到的手势就这么5种: 1.点击  UITapGestureRecogniz ...

  7. iOS子线程操作检测版本更新,有新版本通知用户更新, CheckVersion

    iOS子线程操作检测版本更新,有新版本通知用户更新 CheckVersion 一:如何使用: #import "CheckVersion.h" //输入你的app在appStore ...

  8. iOS 本地通知 操作

    iOS 本地通知 操作 1:配置通知:然后退出程序: UILocalNotification *localNotif = [[UILocalNotification alloc] init]; loc ...

  9. iOS 通讯录操作

    转载至:http://superuna.blog.51cto.com/4192682/982938 //新增联系人 -(void)AddPeople {         //取得本地通信录名柄     ...

随机推荐

  1. 远程桌面,出现身份验证错误,要求的函数不正确,这可能是由于CredSSP加密Oracle修正

    问题点: 升级至win10 最新版本10.0.17134,安装最新补丁后无法远程win server 2016服务器,报错信息如下: 出现身份验证错误,要求的函数不正确,这可能是由于CredSSP加密 ...

  2. codeigniter框架开发技巧

    codeigniter框架开发技巧 来源:未知    时间:2014-10-20 11:36   阅读数:171   作者:xbdadmin [导读] (1)自动加载modelsphp5风格 使用这个 ...

  3. 【每日Scrum】第七天冲刺

    一.计划会议内容 界面ui制作,主界面进度 二.任务看板 三.scrum讨论照片 四.产品的状态 无 五.任务燃尽图  

  4. sys.path.append()加入当前目录为环境变量

    当我们导入一个模块时:import  xxx,默认情况下python解析器会搜索当前目录.已安装的内置模块和第三方模块,搜索路径存放在sys模块的path中: >>> import  ...

  5. 吴裕雄--天生自然MySQL学习笔记:MySQL LIKE 子句

    在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录. WHERE 子句中可以使用等号 = 来设定获取数据的条件, ...

  6. 寒假day16

    今天优化了管理员界面,人才标签模块遇到了一点问题,部分结果无法显示,正在寻找原因

  7. Python—在Django中使用Celery

    一.Django中的请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下: http请求发起 经过中间件 http handling(request解析) ur ...

  8. runlevel 运行级别

    linux启动过程 关于Ubuntu 12.04修改默认运行级别,启动字符界面的个人理解   网上通常的做法是:(亲自试验,不管用),如果想直接操作请看绿色字体部分 (1)第一种方法:   由于Red ...

  9. h5-localStorage储存的使用

    <!-- localStorage的使用: 1.存储的内容大概20mb 2.不同浏览器不能共享数据,但是在同意浏览器的不同窗口中可以共享数据 3.永久生效,他的数据是储存在硬盘上,并不会随着页面 ...

  10. Express+MySQL实现图片上传到服务器并把路径保存到数据库中

    demo准备:mysql5.7.20 express4.0 处理图片文件的中间件Multer 先搭建服务器并展示html页面 const express = require("express ...