使用AddressBook管理联系人

iPhone手机通常都是自带的Contacts应用,包括所有联系人的性(last name)、名(first name)、电话、E-mail地址、住址、生日等各种个人信息.Contacts的数据将保存在自己的应用程序沙盒中,其他应用不能访问它们.

为了能访问iPhone手机存储的联系人信息,iOS系统提供了如下两个框架.

AddressBook.framework

通过该框架提供的系列函数,我们可以开发程序界面对手机中的联系人信息进行增、删、改、查。

AddressBookUI.framework

该框架以AddressBook.framework为基础,它直接包含4个视图控制器类以及相应的委托协议.这些特殊的视图控制器提供了默认的用户界面对手机中的联系人信息进行操作,开发者只要创建这些视图控制器的实例并显示出来即可.

下面AddressBook框架的用法

AddressBook框架主要由如下4组API组成

ABAddressBook

ABAddressBook实例代表地址 簿 对象,该对象提供了一个通用的编程接口,允许我们无须理会联系人信息在底层数据库中的存储方式,直接以透明的方式来访问这些联系人的信息.实际编程时,总是面向ABAddressBook的指针(ABAddressBookRef)编程

ABRecord

ABRecord代表一个通用的记录对象,该记录对象包含了大量的通用的数据(如联系人的姓(last  name)、名(first name)、电话、邮件等)。

每条记录在底层数据库中都有一个唯一的ID,可通过ABRecordGetRecordID()函数获取指定记录的ID.

可通过ABRecordGetRecordType()函数获取该记录的类型

该记录是联系人,则该函数返回kABPersonType(0)枚举值;

该记录组,则该函数返回kABGroupType(1)枚举值.

实际编程时,总是面向ABRecord的指针(ABRecordRef)编程.

ABPerson

ABPerson代表联系人信息.通常使用类型为”kABPersonType”的ABRecordRef表示联系人信息.联系人信息存储了该联系人的姓、名、地址、电子邮件和电话号码等,可使用视图控制器(如ABPersonViewController)显示这些联系人信息.

ABGroup

ABGroup代表组.通常使用类型为”kABGroupType”的ABRecordRef表示组.一个联系人可以属于多个组,一个组也可以包含多个联系人.

ABAddressBook框架,是一种面向过程的操作方式,该框架4组API提供了大量函数.

总结:

ABAddressBook的函数只负责对地址簿进行管理,包括创建地址簿、向地址簿中添加记录、从地址簿中删除记录等。除此之外,还包括判断用户是否允许访问地址簿,以及对地址簿的修改进行保存或丢弃修改。

为了向地址簿中添加记录,或从地址簿中删除记录,都需要使用ABRecordRef,ABRecord所提供的函数主要用于访问ABRecord本身所包含的大量属性。

每个ABRecord由多个属性组成,联系人的姓、名、电话、邮件等都属于ABRecord的属性。

ABRecord提供了如下常用函数。

bool ABRecordSetValue(ABRecordRef  record,ABPropertyID property, CFTypeRef value,  CFErrorRef *error )

将record记录中的property属性设为“value”。其中property必须是由ABPerson、ABGroup定义的常量,用于表示预置的各种属性,而且不同属性需要的属性值不同。

联系人的名字,对应于kABPersonFirstNameProperty常量,这种类型的属性只需要字符串值即可;

联系人的电话,对应于kABPersonPhoneProperty常量,这种类型的属性则需要ABMutableMultiValue值.

CFTypeRef ABRecordCopyValue(ABRecordRef  record,  ABPropertyID  property)

该函数返回record中property属性的值.

bool ABRecordRemoveValue(ABRecordRef  record, ABPropertyID property, CFErrorRef *error )

该函数删除record记录中property属性的值,返回删除是否成功.

CFStringRef  ABRecordCopyCompositeName(ABRecordRef  record):

该函数返回record记录中复合姓名信息(包括姓\名\组织等信息).

ABRecordID ABRecordGetRecordID(ABRecordRef  record)

该函数来获取该记录的ID

ABRecordType  ABRecordGetRecordType(ABRecordRef  record)

该函数来获取该记录的类型(联系人记录或组记录)

总结:

ABRecord的函数主要用于操作记录所包含的属性,如果程序要创建或得到已有的记录,则需要借助于ABPerson、ABGroup提供的函数.

ABPerson提供了大量获取类型为”kABPersonType”的ABRecord的函数,这些函数即可创建一个空的ABRecord,用于向地址簿中添加新的记录,也可从地址薄中获取满足特定条件的ABRecord,包括根据ID获取、根据人名获取等,这些从地址薄中获取的ABRecord可以被删改或修改。

ABGroup提供了大量获取类型为“kABGroupType”的ABRecord的函数,ABGroup包含的函数,既可以创建新的ABRecord,也可从数据库加载ABRecord。

ABMutableMultiValue提供了如下常用函数

ABMutableMultiValueRef ABMultiValueCreateMutable(ABPropertyType type):

创建一个管理ABPropertyType类型的属性值的ABMutableMultiValue

bool ABMultiValueAddValueAndLabel(ABMutableMultiValueRef multiValue, CFTypeRef  value, CFStringRef  label, ABMultiValueIdentifier *outIdentifier):

向multiValue中添加一个属性值.value代表属性值,label代表属性值的标签(比如电话号码,可设置”家庭”、“工作”等label)

bool  ABMultiValueReplaceValueAtIndex(ABMutableMultiValueRef multiValue, CFTypeRef  value, CFIndex  index)

将multiValue中index索引处的属性值替换为新的value

bool  ABMultiValueReplaceLabelAtIndex(ABMutableMultiValueRef multiValue,CFStringRef  label,CFIndex index)

将multiValue中index索引处的属性标签替换为新的label

bool  ABMultiInsertValueAndLabelAtIndex(ABMutableMultiValueRef  multiValue,CFTypeRef  value, =CFStringRef label,CFIndex  index,ABMultiValueIdentifier *outIdentifier)

向multiValue的index索引处插入一个属性值.value代表属性值,label代表属性值的标签.

bool  ABMultiValueRemoveValueAndLabelAtIndex(ABMutableMultiValueRef  multiValue,CFIndex  index)

删除multiValue中index索引处的属性值(同时删除属性值和属性值标签).

删除联系人

删除联系人很简单,只要如下几步

1

创建ABAddressBookRef,这就得到了对地址簿的引用

2

获取将要被删除的ABRecordRef,这就得到了要被删除记录的引用

3

调用ABAddressBookRemoveRecord()函数删除指定记录

4

调用ABAddressBookSave()函数将删除操作保存到底层地址簿中

代码

@implementation LCViewController

- (void)viewDidLoad

{

   [super viewDidLoad];

}

- (IBAction)deletePerson:(id)sender

{

  CFErrorRef  error = nil;

  // 创建ABAddressBook,该函数的第1参数暂时并未使用,直接传入NULL即可

ABAddressBookRef  ab  =  ABAddressBookCreateWithOptions(NULL, &error);

if(!error)

{

  // 请求访问用户地址簿

ABAddressBookRequestAccessWithCompletion(ab, ^(bool  granted, CFErrorRef  error)

{

 // 如果用户允许访问地址簿

if(granted)

{

  // 从地址簿中获取ID为3的记录

 ABRecordRef  rec = ABAddressBookGetPersonWithRecordID(ab, );

 BOOL result = ABAddressBookRemoveRecord(ab, rec, NULL);

  if(result)

{

    // 将程序所做的修改保存到地址簿中,如果保存成功

if(ABAddressBookSave(ab, NULL))

   {

     [self showAlert:@”成功删除ID为3的联系人”];

}

else

{

      [self showAlert:@”保存修改时出现的错误”];

}

}

else

{

   [self showAlert:@”删除失败”];

}

}

});

}

}

- (void) showAlert:(NSString*)msg

{

  // 使用UIAlertView显示msg信息

 [[[UIAlertView alloc] initWithTitle:@”提示” message:msg delegate:nil  cancelButtonTitle:@”确定”  otherButtonTitles:nil] show];

}
 

iOS-----使用AddressBook管理联系人的更多相关文章

  1. iOS-----使用addressBook管理联系人之修改联系人

    使用addressBook管理联系人之修改联系人 修改联系人 修改联系人先从底层地址簿中加载一条ABRecordRef记录,然后对这条ABRecordRef记录的属性值进行修改,修改完成后把这条修改后 ...

  2. iOS-----使用AddressBookUI管理联系人

    使用AddressBookUI管理联系人 iOS SDK为管理地址簿提供的视图控制器位于AddressBookUI框架内.总结来说,AddressBookUI框架提供了如下特殊的视图控制器. ABPe ...

  3. iOS-----使用AddressBook添加联系人

    使用AddressBook添加联系人 添加联系人的步骤如下: 1 创建ABAddressBookRef,这就得到了对地址簿的引用. 2 调用ABPersonCreate()函数创建一个空的ABReco ...

  4. 理解 iOS 的内存管理

    远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳 ...

  5. iOS ARC内存管理

    iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...

  6. android管理联系人操作

    ContentProvider扩展之管理系统联系人 我们都知道ContentProvider是用来共享数据的,然而android本身就提供了大量的ContentProvider,例如联系人信息,系统的 ...

  7. iOS之内存管理(ARC)

    iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方 ...

  8. IOS开发依赖管理工具CocoaPods

    CocoaPods IOS开发依赖管理工具 CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It ...

  9. 说说iOS与内存管理(上)

    http://www.cocoachina.com/ios/20150625/12234.html 说起内存管理,看似老生常谈,而真正掌握内存管理的核心其实并不简单.ARC/MRR以及“谁分配谁就负责 ...

随机推荐

  1. ISCC2016-BASIC、WEB、MISC简单writeup

    RE和PWN题目的wp有大神已经放出来了,我也不擅长,就不搬了.bin求带. BASIC BASIC-1 50 仿射函数,百度“仿射加密法”,它讲的够清楚了. BASIC-2 50 结尾的“=”这个特 ...

  2. 基于.net core webapi和mongodb的日志系统

    开发环境vs2017,.NET Core2.1, 数据写入到mongodb.思路就是1.提供接口写入日志,2.基于接口封装类库.3.引入类库使用 源码在最后 为什么要写它 很多开源项目像nlog.lo ...

  3. Python 开发工具和框架安装

    引言: 其实之前对于 Python,只是知道有这门语言而已.大部分还是使用 .net 开发的,之前也学了 MVC+EF 开发,但是由于工作上完全用不到,也就没有在博客记录学习的东西了. 最近又接触到了 ...

  4. Linux常用命令实践

    一.开机自动挂载文件系统设置 在/media下新建RHEL目录,并把/dev/sr1第二块光驱挂载到该目录 #mkdir /media/RHEL #mount /dev/sr1 /media/RHEL ...

  5. uva11404

    这题说的是给了一个长度为n的字符串(1000)求最长回文子序列,并输出当str[i]==ste[j]时dp[i][j]=dp[i+1][i-1]+2 否则 dp[i][j]=Max(dp[j+1][i ...

  6. 编译 Tensorflow 1.10 + CUDA9.2 + MKL【转】

    本文转自:https://www.solarck.com/compile-tensorflow-gpu.html 我的电脑系统是基于 Archlinux 的 Manjaro,软件包更新的比较激进,很早 ...

  7. 【eclipse】Server Tomcat v9.0 Server at localhost failed to start.

    Server Tomcat v9.0 Server at localhost failed to start. 的一个原因就是启动超时了.

  8. 2016湘潭邀请赛—Heartstone

    http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1246 题意: 有n只怪,每只怪有指定的HP.现在1和2两种攻击方式,前者扣 ...

  9. POJ 2443 Set Operation(压位加速)

    http://poj.org/problem?id=2443 题意: 有1000个集合,每个集合有至多10000个数,之后输入多个询问,判断询问的两个数是否位于同一个集合. 思路: 位运算...很强大 ...

  10. 爬虫模拟登陆之formdata表单数据

    首先HTTP协议是个无连接的协议,浏览器和服务器之间是以循环往复的请求回复来交互的,交互的形式是以文件形式来进行的.比如在chrome开发者工具network中看到了 每一行是一个文件,又文件大小啊, ...