访问地址簿和单个联系人数据的接口是基于C语言的函数,接口传递对地址簿各种对象的引用作为参数。管理地址簿中条目的基类对象是 ABRecord。一个 ABRecord 可以表示一个人 或者一个群体 ABGroup 。无论何时,在界面上选中一条记录,或者使用框架进行查询返回一条结果,系统都会返回一个指向 ABRecord 的指针,标示为 ABRecordRef。与地址簿 API 的大部分交互都涉及使用 ABRecordRef 这个引用类型。

常用访问记录的函数如下:

ABRecordID ABRecordGetRecord(ABRecordRef record);

返回 ABRecordID ,代表了 记录在底层数据库中的ID号。具有唯一性。

ABRecordType ABRecordGetRecordType(ABRecordRef record);

返回记录类型。可以是 kABPersonType 和 kABGroupType

CFStringRef ABRecordCopyCompositeName(ABRecordRef record);

返回个人或群体完整名称。例:NSString* name = (NSString*)ABRecordCopyCompositeName(record);

一、高层地址簿函数

1.获得地址簿句柄

你必须先初始化地址簿,然后才能对其进读写操作。要获得一个地址簿句柄,可以使用 ABAddressBookCreate函数:

源码打印?
  1. #import <AddressBook/AddressBook.h>
  2. AddressBookRef ab = AddressBookCreate();

2. 保存地址簿

获得了地址簿的引用就可以对其进行操作了,操作完毕要记得保存:

源码打印?
  1. CFErrorRef err;
  2. BOOL success =  ABAddressBookSave(ab, &err);

如果不确定是否需要保存,则可以用:

源码打印?
  1. BOOL hasUnsavedChanges = ABAddressBookHasUnsavedChanges(ab);

3.添加/删除 记录

源码打印?
  1. CFErrorRef err;
  2. BOOL success =ABAddressBookAddRecord(ab, record, &err);//添加
源码打印?
  1. CFErrorRef err;
  2. BOOL success =ABAddressBookRemoveRecord(ab, record, &err);//删除

二、查询地址簿

地址簿框架仅仅提供了基本的查询功能。可以用函数根据名字来查询多个记录,或者是根据特定记录 ID 查询单个记录。

1.获取地址簿中记录总个数:

源码打印?
  1. CFIndex count = ABAddressBookGetPersonCount(ab);
  2. printf("%ld total entries in the address book\n",count);

2. 获取所有联系人:

源码打印?
  1. NSArray* array = (NSArray*)ABAddressBookCopyArrayOfAllPeople(ab);
  2. printf("Retrieved %d contacts\n",[array count]);

3. 在联系人列表中查询一个特定的名字:

源码打印?
  1. NSArray* arrayByName = (NSArray*)ABAddressBookCopyPeopleWithName(ab, CFSTR("Liu Wei"));

函数如其名,这个函数返回的并不是地址簿中实际的对象,而是拷贝。要访问这个数组的单个记录,就用NSArray的方法啦:

源码打印?
  1. ABRecordRef myRecord = [arrayByName objectAtIndex:0];

除了通过名字查询,你也可以直接通过ID查询(假如你知道ID的话):

源码打印?
  1. ABRecordRef myRecord = ABAddressBookGetPersonWithRecordID(ab, recordID);

三、创建记录

创建新的联系人可以使用 ABPersonCreate 函数。这样可以得到一个空记录,然后就可以向其中填充信息:

源码打印?
  1. ABRecordRef record = ABPersonCreate();

四、操纵记录

一旦获得了 ABRecordRef,就可以确定是属于个人还是群体,也就可以访问更进一步的信息了。姓名以及其他各项信息都可以通过相应属性来操纵。只有ABPerson 类型实体记录才会有属性,而每个记录都具有各种各样的信息。

查询给定记录的信息,可以使用 ABRecordCopyValue 函数。这个函数原型如下:

源码打印?
  1. CFTypeRef ABRecordCopyValue(ABRecordRef record,kABPersonFirstNameProperty);

调用这个函数时,会将你指定 的属性拷贝一份,并返回引用:

源码打印?
  1. CFStringRef firstName = ABRecordCopyValue(record, kABPersonFirstNameProperty);

由于kABPersonFirstNameProperty 属性是一个 CFString,你可以将其转换为 NSString* :

源码打印?
  1. NSString* firstName =NSString* ABRecordCopyValue(record, kABPersonFirstNameProperty);

就像CFStringRef 可以转换为 NSString* 一样,如果有属性返回类型是CFDateRef,你也可以转换为 NSDate* :

源码打印?
  1. NSDate* birthday =  (NSDate*) ABRecordCopyValue(record, kABPersonBirthdayProperty);

上面所指定的 ABPropertyID, 是一个与在记录中查找信息相对应的值。根据这个值返回ABPerson 对象属性。由于 ABRecordCopyValue 函数返回的数据类型是通用的 CFTypeRef ,所以结果可疑被转换为一个与属性相对应的更细化的数据类型,如下表:

源码打印?
  1. // Property keys
  2. extern const ABPropertyID kABPersonFirstNameProperty;          // First name - kABStringPropertyType
  3. extern const ABPropertyID kABPersonLastNameProperty;           // Last name - kABStringPropertyType
  4. extern const ABPropertyID kABPersonMiddleNameProperty;         // Middle name - kABStringPropertyType
  5. extern const ABPropertyID kABPersonPrefixProperty;             // Prefix ("Sir" "Duke" "General") - kABStringPropertyType
  6. extern const ABPropertyID kABPersonSuffixProperty;             // Suffix ("Jr." "Sr." "III") - kABStringPropertyType
  7. extern const ABPropertyID kABPersonNicknameProperty;           // Nickname - kABStringPropertyType
  8. extern const ABPropertyID kABPersonFirstNamePhoneticProperty;  // First name Phonetic - kABStringPropertyType
  9. extern const ABPropertyID kABPersonLastNamePhoneticProperty;   // Last name Phonetic - kABStringPropertyType
  10. extern const ABPropertyID kABPersonMiddleNamePhoneticProperty; // Middle name Phonetic - kABStringPropertyType
  11. extern const ABPropertyID kABPersonOrganizationProperty;       // Company name - kABStringPropertyType
  12. extern const ABPropertyID kABPersonJobTitleProperty;           // Job Title - kABStringPropertyType
  13. extern const ABPropertyID kABPersonDepartmentProperty;         // Department name - kABStringPropertyType
  14. extern const ABPropertyID kABPersonEmailProperty;              // Email(s) - kABMultiStringPropertyType
  15. extern const ABPropertyID kABPersonBirthdayProperty;           // Birthday associated with this person - kABDateTimePropertyType
  16. extern const ABPropertyID kABPersonNoteProperty;               // Note - kABStringPropertyType
  17. extern const ABPropertyID kABPersonCreationDateProperty;       // Creation Date (when first saved)
  18. extern const ABPropertyID kABPersonModificationDateProperty;   // Last saved date

五、写入属性

向记录写入属性,使用ABRecordSetValue 函数:

源码打印?
  1. CFStringRef name = CFSTR("IUKEY");
  2. BOOL suc = ABRecordSetValue(record, kABPersonNicknameProperty, name, &err);
  3. if (suc) {
  4. NSLog(@"setValue succeed");
  5. }

删除属性:

源码打印?
  1. BOOL succeed = ABRecordRemoveValue(record, kABPersonFirstNameProperty, &err);

当修改完以后不要忘记保存地址簿。

六、多值属性

除了前面列出的属性之外,一个记录还可能会有一些属性,其中包含多个值。多只属性可以用一种索引机制来处理,使用时首先查询值的总数,然后通过特定的索引得到一个条目。指向多值数据的指针,可以首先通过前面提到的 ABRecordCopyValue 方法得到,然后转换成 MultiValueRef :

源码打印?
  1. ABMultiValueRef phoneNumbers = ABRecordCopyValue(record, kABPersonPhoneProperty);

然后你可以通过这个引用来确定值的个数,并按照索引获取其中的单个值。函数ABMultiGetCount 可以返回条目个数,按照索引拷贝指定条目,可以用ABMultiValueCopyValueAtIndex 函数。

下面列出了多值属性中的条目:

源码打印?
  1. extern const ABPropertyID kABPersonEmailProperty;
  2. extern const ABPropertyID kABPersonAddressProperty;
  3. extern const ABPropertyID kABPersonDateProperty;
  4. extern const ABPropertyID kABPersonPhoneProperty;
  5. extern const ABPropertyID kABPersonInstantMessageProperty;
  6. extern const ABPropertyID kABPersonURLProperty;

除了多值属性中真正的值,每个条目还有一个标签。标签描述了返回的条目的类型。例如,一个电话号码标签有可能指明了这个号码是家庭电话还是手机号。地址的标签则可一描述是家庭地址还是工作地址。要查询特定条目标签,可以使用 ABMultValueCopyLabelAtIndex 函数:

源码打印?
  1. CFStringRef label = ABMultiValueCopyLabelAtIndex(phoneNumbers, i);

默写属性具有一组预定义的标签。下面这些 CFStringRef 类型标签的原型是在 ABPerson.h 中指定的:

源码打印?
  1. extern const ABPropertyID kABPersonDateProperty;               // Dates associated with this person - kABMultiDatePropertyType
  2. extern const CFStringRef kABPersonAnniversaryLabel;
源码打印?
  1. // Phone numbers
  2. extern const ABPropertyID kABPersonPhoneProperty;              // Generic phone number - kABMultiStringPropertyType
  3. extern const CFStringRef kABPersonPhoneMobileLabel;
  4. extern const CFStringRef kABPersonPhoneIPhoneLabel __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
  5. extern const CFStringRef kABPersonPhoneMainLabel;
  6. extern const CFStringRef kABPersonPhoneHomeFAXLabel;
  7. extern const CFStringRef kABPersonPhoneWorkFAXLabel;
  8. extern const CFStringRef kABPersonPhoneOtherFAXLabel __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
  9. extern const CFStringRef kABPersonPhonePagerLabel;
源码打印?
  1. // IM
  2. extern const ABPropertyID kABPersonInstantMessageProperty;     // Instant Messaging - kABMultiDictionaryPropertyType
  3. extern const CFStringRef kABPersonInstantMessageServiceKey;     // Service ("Yahoo", "Jabber", etc.)
  4. extern const CFStringRef kABPersonInstantMessageServiceYahoo;
  5. extern const CFStringRef kABPersonInstantMessageServiceJabber;
  6. extern const CFStringRef kABPersonInstantMessageServiceMSN;
  7. extern const CFStringRef kABPersonInstantMessageServiceICQ;
  8. extern const CFStringRef kABPersonInstantMessageServiceAIM;
源码打印?
  1. // URLs
  2. extern const ABPropertyID kABPersonURLProperty;                // URL - kABMultiStringPropertyType
  3. extern const CFStringRef kABPersonHomePageLabel; // Home Page
源码打印?
  1. // Related names
  2. extern const ABPropertyID kABPersonRelatedNamesProperty;       // Names - kABMultiStringPropertyType
  3. extern const CFStringRef kABPersonFatherLabel;    // Father
  4. extern const CFStringRef kABPersonMotherLabel;    // Mother
  5. extern const CFStringRef kABPersonParentLabel;    // Parent
  6. extern const CFStringRef kABPersonBrotherLabel;   // Brother
  7. extern const CFStringRef kABPersonSisterLabel;    // Sister
  8. extern const CFStringRef kABPersonChildLabel;      // Child
  9. extern const CFStringRef kABPersonFriendLabel;    // Friend
  10. extern const CFStringRef kABPersonSpouseLabel;    // Spouse
  11. extern const CFStringRef kABPersonPartnerLabel;   // Partner
  12. extern const CFStringRef kABPersonAssistantLabel; // Assistant
  13. extern const CFStringRef kABPersonManagerLabel;   // Manager

许多属性使用一组通用标签,标识工作、家庭以及其它地点。这些通用的标签如下:

kABWorkLabel

kABHomeLabel

kABOtherLabel

写入多只属性条目:

为了在现有的属性中加入一个值,你必须首先从记录中复制出多值字典。然后 ABMultiValueAddValueAndLabel 函数操作拷贝,将新的值-标签加入到字典中。最后用函数 ABRecordSetValue 将字典条目写回到地址簿记录中,完全替换掉整个多值属性。

七、使用字典

地址簿记录用字典来 表示地址和即时通讯账号。这些字典是内嵌在多值属性条目之中的。要访问这些字典,需要将值复制出来,并转换成 NSDictionary* 。然后你就可以用一组预定于的键值来访问字典了。

八、图像数据

某些联系人可能会有与之相关联的图像。可以使用 ABPersonCopyImageData 函数获取这些图像数据,返回将是一个 CFDataRef。可以把它转换成 NSData*,然后用来初始化一个UIImage对象。

源码打印?
  1. if (ABPersonHasImageData(record)) {
  2. UIImage *addressVookImage = [UIImage imageWithData:(NSData*)ABPersonCopyImageData(record)];
  3. }

九、地址簿界面

地址簿界面框架提供了两种关键的用户界面:一个“找人”导航控件,来选择联系人;以及一个视图控件,用于显示单个联系人。

1. 联系人视图

ABPersonViewController 提供了一个简单的界面,可以向用户显示一个联系人。联系人视图需要一个 CFRecordRef 。

源码打印?
  1. ABPersonViewController *viewController = [[ABPersonViewController alloc]init];

可以将希望显示的记录赋值给 displayedPerson 属性:

源码打印?
  1. viewController.displayedPerson=record;

然后,你可以创建一个数组,其中包含你想要显示给用户的属性。只有指定的属性才会被显示出来,不过如果联系人被修改了,所有属性都将显示出来。可用的属性值与前面提到的枚举值相同。每个都作为一个 NSNumber 对象加入到数组中。

源码打印?
  1. NSMutableArray* properties = [[NSMutableArray alloc]init];
  2. [properties addObject:[NSNumber numberWithInt:kABPersonFirstNameProperty ]];
  3. [properties addObject:[NSNumber numberWithInt:kABPersonLastNameProperty ]];
  4. [properties addObject:[NSNumber numberWithInt:kABPersonOrganizationProperty ]];
  5. viewController.allowsEditing =YES;

十、联系人选取器

如果应用程序要选取一系列联系人,ABPeoplePickerNavigationController 类正好适合你。这个导航控件 可以显示联系人,让用户从中选择其一。选好后,你可以选择向用户显示该联系人,也可以通过一个委托方法实现你自己的行为。

源码打印?
  1. ABPeoplePickerNavigationController* peoplePicker = [[ABPeoplePickerNavigationController alloc]init];

如果希望允许用户查看单个联系人,你可以赋予其一组希望用户看到的属性。默认情况下会向用户显示所有的项目。 可用的属性值就是本章前面讲授的那些枚举值。每个作为一个NSNumber对象加入到数组中:

源码打印?
  1. NSMutableArray* properties = [[NSMutableArray alloc]init];
  2. [properties addObject:[NSNumber numberWithInt:kABPersonFirstNameProperty ]];
  3. [properties addObject:[NSNumber numberWithInt:kABPersonLastNameProperty ]];
  4. [properties addObject:[NSNumber numberWithInt:kABPersonOrganizationProperty ]];
  5. peoplePicker.displayedProperties = properties;

可以指定一个委托,在用户选定联系人时接收通知:

源码打印?
  1. peoplePicker.peoplePickerDelegate =self;
源码打印?
  1. [self.view addSubview:peoplePicker.view];

委托方发:

源码打印?
  1. -(void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
  2. //取消选择
  3. }
  4. -(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
  5. //选中联系人
  6. }
  7. -(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
  8. //选中属性
  9. }

转载于:https://www.cnblogs.com/madordie/p/4458764.html

[摘]iOS 通讯录操作相关推荐

  1. [共享]iOS开发系列--Swift语言

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发系列--Swift语言 概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服 ...

  2. [转]iOS 远程推送(APNs)

    我是搬运工.原帖:http://blog.csdn.net/lifengzhong/article/details/7737028 目录(?)[-] 一简介 二使用步骤 step1 step2 ste ...

  3. iOS 通讯录操作 删除联系人 以及联系人多个号码 如何删除其中一个号码

    纠结了好久的问题,分享给大家 项目需求:操作通讯录,当一个联系人中有多个手机号时,点击删除,删除对应的手机号:当剩下一个手机号时,点击删除,删除这个联系人,最后将这些修改保存到通讯录 ABMultiV ...

  4. [分享]iOS开发-UI篇:CAlayer层的属性

    iOS开发UI篇-CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...

  5. [转载]iOS开发之第三方登录QQ

    转载自 iOS_developer_zhong 1. 申请腾讯开发账号. 地址:点击打开链接 2. 下载最新的SDK   地址: SDK下载 SDK内容如下: 1.sample 这个是简单的demo ...

  6. [分享]iOS开发 - 网络总结

    基本概念 客户端:client 服务器:server 请求:request 响应:response 过程 客户端 -> 发送请求 -> 服务器(连接数据库) 服务器 -> 发送响应 ...

  7. [分享]iOS开发-实现view底部控件随着键盘的弹出而上移的效果

    首先说一下思路: 想要达到底部控件随着键盘的弹出而上移的效果,那么我们必然需要的到键盘在弹出时的高度,以及原点坐标. 说白了我们的大致思路就是,用view的高度-键盘弹出时的高度,得到的值就是底部控件 ...

  8. [分享]iOS开发-如何使用tabBarController

    由于难度不大,直接上代码了,看一遍基本就明白思路了 1.创建一个tabBarViewController .m文件 #import "SSTabBarViewController.h&quo ...

  9. [分享]iOS开发-实现UILabel显示出不同颜色并且某一部分产生下划线的效果 ...

    效果图: @interface XSRecommendedPrivilegeViewController () @property (weak, nonatomic) IBOutlet UIButto ...

最新文章

  1. mapinfo制作地图_Mapinfo操作不太会?看这篇就够了
  2. SAP UI5 Currency 数据类型的校验逻辑分析
  3. node-sass报错解决方法
  4. ORCALE SYNONYM SEQUENCE
  5. ORACLE查询保留字
  6. 事业单位的生活是怎么样的?
  7. 编程练习赛11B 物品价值(装压dp)
  8. 如何使用 Apple Watch 拨打电话?
  9. 提高linux运行速度,教你如何提高Linux操作系统的运行速度
  10. 软件测试记录表模版,简单软件测试报告模板.doc
  11. python-合并两个txt文件
  12. excel制作复合饼状图_如何在Excel中制作饼图
  13. RFID区域实时定位系统
  14. python箱形图各部分含义_箱形图以及python实践
  15. 将AutoCAD文件中圆形替换为六边形
  16. AI行业全面复苏,秋招AI岗位竞争激烈!Tesra超算网络助力找到合适的岗位!
  17. QT自制精美Ui模板系列展示(一)桃子风格模板 - 二次开发专用
  18. SpringBoot 优雅地对接口进行数据加解密
  19. OpenCV图像无缝融合-seamlessClone介绍与使用(附Python/C++源码)
  20. Ambari 操作指南 (Ambari Operations) 之一

热门文章

  1. Android应用资源---其他资源类型(More Types)(二)
  2. 一个实用的JS自定义函数addLoadEvent()
  3. 深度学习开源项目学习
  4. 总结CMS常见面试题
  5. 计算机桌面不来回变黑,电脑屏幕变小了左右黑几种解决方法
  6. 使用这些 HTTP 头保护 Web 应用
  7. AFNetworking2.0源代码解析
  8. Laravel教程 四:数据库和Eloquent
  9. echo 单引号和双引号
  10. IIS7.5安全配置研究