【转】iPhone通讯录AddressBook.framework和AddressBookUI.framework的应用

通讯录联系人相关的应用iPhone提供了两个框架:AddressBook.framework和AddressBookUI.framework,使用这两个框架我们可以在程序中访问并显示iPhone数据库中的联系人信息。

1.AddressBookUI显示部分

AddressBookUI中提供了和联系人显示信息相关的一些Controller,有四个:

ABPeoplePickerNavigationController:显示整个通讯录并可以选择一个联系人的信息

ABPersonViewController:显示一个具体联系人的信息

ABNewPersonViewController:增加一个新的联系人

ABUnknownPersonViewController:完善一个联系人的信息

由于其中最主要的是ABPeoplePickerNavigationController,因此就具体的介绍一下通过程序显示整个通讯录并且可以选择其中某个联系人信息的步骤。

(a)创建并初始化一个ABPeoplePickerNavigationController对象

(b)设置其代理(delegate)

(c)用presentModalViewController:animated:这个方法进行显示整个通讯录页面

例子:

  1. - (IBAction)showPicker:(id)sender {
  2. ABPeoplePickerNavigationController *picker =
  3. [[ABPeoplePickerNavigationController alloc] init];
  4. picker.peoplePickerDelegate = self;
  5. [self presentModalViewController:picker animated:YES];
  6. [picker release];
  7. }

ABPeoplePickerNavigationControllerDelegate的方法介绍

(1)


  1. peoplePickerNavigationControllerDidCancel:

当用户选择取消时调用这个方法,可以在这个方法里取消整个通讯录页面的显示。

(2)


  1. peoplePickerNavigationController:shouldContinueAfterSelectingPerson:

当用户选择了通讯录中某一个联系人时调用这个方法,可以在这里获取联系人的信息。如果希望可以继续显示这个联系人更具体的信息,则return YES。否则取消整个通讯录页面的显示并return NO。

(3)


  1. eoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:

如果上一个方法返回的是YES,则会显示某一个联系人信息,如果选择了联系人的某一项纪录,就会调用这个方法,可以通过点击选择联系人的某一项信息。如果希望可以对选择的某一项纪录进行进一步操作,比如直接拨打电话或调用邮箱发送邮件,则return YES。否则取消整个通讯录页面的显示并return NO。

例子:


  1. - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {
  2. // assigning control back to the main controller
  3. [picker dismissModalViewControllerAnimated:YES];
  4. }
  5. - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker
  6. shouldContinueAfterSelectingPerson:(ABRecordRef)person {
  7. //获取联系人姓名
  8. name.text = (NSString*)ABRecordCopyCompositeName(person);
  9. //获取联系人电话
  10. ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person, kABPersonPhoneProperty);
  11. NSMutableArray *phones = [[NSMutableArray alloc] init];
  12. int i;
  13. for (i = 0; i < ABMultiValueGetCount(phoneMulti); i++) {
  14. NSString *aPhone = [(NSString*)ABMultiValueCopyValueAtIndex(phoneMulti, i) autorelease];
  15. NSString *aLabel = [(NSString*)ABMultiValueCopyLabelAtIndex(phoneMulti, i) autorelease];
  16. NSLog(@"PhoneLabel:%@ Phone#:%@",aLabel,aPhone);
  17. if([aLabel isEqualToString:@"_$!<Mobile>!$_"])
  18. {
  19. [phones addObject:aPhone];
  20. }
  21. }
  22. [email protected]"";
  23. if([phones count]>0)
  24. {
  25. NSString *mobileNo = [phones objectAtIndex:0];
  26. phoneNo.text = mobileNo;
  27. //NSLog(mobileNo);
  28. }
  29. //获取联系人邮箱
  30. ABMutableMultiValueRef emailMulti = ABRecordCopyValue(person, kABPersonEmailProperty);
  31. NSMutableArray *emails = [[NSMutableArray alloc] init];
  32. for (i = 0;i < ABMultiValueGetCount(emailMulti); i++)
  33. {
  34. NSString *emailAdress = [(NSString*)ABMultiValueCopyValueAtIndex(emailMulti, i) autorelease];
  35. [emails addObject:emailAdress];
  36. }
  37. [email protected]"";
  38. if([emails count]>0)
  39. {
  40. NSString *emailFirst=[emails objectAtIndex:0];
  41. email.text = emailFirst;
  42. //NSLog(emailFirst);
  43. }
  44. [peoplePicker dismissModalViewControllerAnimated:YES];
  45. return NO;
  46. }
  47. - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker
  48. shouldContinueAfterSelectingPerson:(ABRecordRef)person
  49. property:(ABPropertyID)property
  50. identifier:(ABMultiValueIdentifier)identifier{
  51. return NO;
  52. }

2.AddressBook部分

AddressBook框架部分主要是记录联系人的各个信息,ABRecordRef类型的记录既可以代表单个人(kABPersonType),也可以是一个集合(kABGroupType)。

通讯录中联系人的各个属性有两种形式,单值属性和多值属性。单值属性对应的只有一个值,比如联系人的姓名;多值属性对应的可能有多个值,比如联系人有多个电话号码等。

(a)常用方法


  1. CFTypeRef ABRecordCopyValue (
  2. ABRecordRef record,
  3. ABPropertyID property
  4. );

从一个记录中获取某个属性对应的值

(b)单值属性对应的方法


  1. CFStringRef ABRecordCopyCompositeName (
  2. ABRecordRef record
  3. );

获取联系人完整的姓名。

(c)多值属性对应的方法


  1. CFTypeRef ABMultiValueCopyValueAtIndex (
  2. ABMultiValueRef multiValue,
  3. CFIndex index
  4. );

返回对应位置处的属性值


  1. CFStringRef ABMultiValueCopyLabelAtIndex (
  2. ABMultiValueRef multiValue,
  3. CFIndex index
  4. );

返回对应位置处的属性标识


  1. CFArrayRef ABMultiValueCopyArrayOfAllValues (
  2. ABMultiValueRef multiValue
  3. );

返回包含所有属性值的数组


  1. CFIndex ABMultiValueGetCount (
  2. ABMultiValueRef multiValue
  3. );

返回属性值的个数

例子:


  1. //获取联系人姓名
  2. name.text = (NSString*)ABRecordCopyCompositeName(person);
  3. //获取联系人电话
  4. ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person, kABPersonPhoneProperty);
  5. NSMutableArray *phones = [[NSMutableArray alloc] init];
  6. int i;
  7. for (i = 0; i < ABMultiValueGetCount(phoneMulti); i++) {
  8. NSString *aPhone = [(NSString*)ABMultiValueCopyValueAtIndex(phoneMulti, i) autorelease];
  9. NSString *aLabel = [(NSString*)ABMultiValueCopyLabelAtIndex(phoneMulti, i) autorelease];
  10. NSLog(@"PhoneLabel:%@ Phone#:%@",aLabel,aPhone);
  11. if([aLabel isEqualToString:@"_$!<Mobile>!$_"])
  12. {
  13. [phones addObject:aPhone];
  14. }
  15. }

by gqzhu

http://shanshandaocao-163-com.iteye.com/blog/1390221

时间: 2024-12-06 21:56:21

【转】iPhone通讯录AddressBook.framework和AddressBookUI.framework的应用的相关文章

iOS开发------操作通讯录(AddressBook篇)&amp;通讯录UI(AddressBookUI篇)

上篇博文简要的介绍了如何使用AddessBook.framework来获取系统通讯录,但有时候又想对其做修改怎么办,那么这篇博文就总结一下如何修改系统的通讯录吧. 代码GitHub:https://github.com/YRunIntoLove/YAddressBookUIDemo 修改系统通讯录的方法 两种方法 通过AddressBook.framework的各种函数来完成对AddressBook的操作. 通过AddressBookUI.framework中提供的系统UIViewControl

iOS开发之通讯录 AddressBook

如何访问用户的通讯录 在iOS中,有2个框架可以访问用户的通讯录 AddressBookUI.framework 提供了联系人列表界面.联系人详情界面.添加联系人界面等一般用于选择联系人 AddressBook.framework 纯C语言的API,仅仅是获得联系人数据 没有提供UI界面展示,需要自己搭建联系人展示界面 里面的数据类型大部分基于Core Foundation框架 从iOS6开始,需要得到用户的授权才能访问通讯录,因此在使用之前,需要检查用户是否已经授权 获得通讯录的授权状态:AB

【Robot Framework】robot framework 学习以及selenium、appnium实践

话说之前自己写了个selenium的自动化框架,然后又研究了下RF,觉得RF这种基于关键字驱动的框架更为容易上手,当然在做一些比较繁琐的验证时,似乎还不是太灵活,不如自己写几行python来的实惠(也可能是自己还没有太精通吧),但总体来说,有很好的RIDE交互界面,对于无编程基础的人很容易上手,而且很给力,这里就来学习一下 (一)Robot Framework介绍 robot framework是个通用的开源测试框架,支持关键字驱动,支持BDD,其case采用表格形式易读,可以同时测试多种类型的

监听iPhone的通话状态之---CoreTelephony.framework

近期在做一个网络电话会议,需要判断手机的通话状态,通过在网上查找资料找到一个苹果私有框架,下面简单介绍如何使用: 1,要在项目中添加CoreTelephony.framework这个框架,怎么添加如下图: 点击“+”,添加即可: 2,在你需要用到该功能的class中,导入如下两个头文件 #import <CoreTelephony/CTCallCenter.h>#import <CoreTelephony/CTCall.h> 3,使用代码如下: CTCallCenter *cent

iphone通讯录的备份与恢复

最近在做iOS系统通讯录备份到服务器,并且可以从服务器中下载备份文件恢复到手机的功能,部分实现细节记录如下. 将iphone系统通讯录生成.vcf文件 ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef contacts = ABAddressBookCopyArrayOfAllPeople(addressBook); CFDataRef vcards = (CFDataRef)ABPersonCreateVCardR

Entity Framework 教程——Entity Framework中的实体类型

Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. POCO Entity (Plain Old CLR Object): POCO类是不依赖任何框架的类型,如同其他正常的一般类型,我们称之为"Plain Old CLR Objects"(这里不知道怎么翻译,普通的CLR对象?古老的CLR对象?大概意思就是没有什么特殊的对象吧). POC

利用Mocking Framework 单元测试Entity Framework

一.前言 在实际编写程序时,往往需要与数据库打交道,在单元测试中直接使用数据库又显得太重,如果可以方便的编写一些测试数据,这样更易于检测功能.如何模拟数据库行为便是本篇的主题.微软有教程说明Moq Entity Framework,需注意的是EF的版本必须是6以上.但在这篇教程中是直接使用DbContext,而自己的应用程序中都是用UnitOfWork模式.经过修改后也可以实现类似功能. 二.参考文献 https://msdn.microsoft.com/en-us/data/dn314429

如何查看是否安装.NET Framework、.NET Framework的版本号以及CLR版本号

查看是否安装.NET Framework→%SystemRoot%\System32→如果有mscoree.dll文件,表明.NET Framework已安装 查看安装了哪些版本的.NET Framwork→开始-运行→输入cmd→输入如下命令dir %WINDIR%\Microsoft.Net\Framework\v* 查看安装的所有CLR版本→打开"VS2012命令提示"→输入CLRVer.exe →输入CLRVer.exe -all,查看正在运行的进程使用CLR的版本号

.net平台 .net Framework 组织结构 .net Framework类库 CLR C# 介绍

一..net平台 .NET现在可以看成微软的一个品牌,微软有两个非常成功的品牌,那就是Windows和Office. .NET会成为微软的另一个品牌.它不仅仅是一组技术,产品,或服务(微软的服务包括MSN, Passport, MSDN订阅,等等)一个品牌具有一些特征,如Rolex是一个手表品牌,它代表了高质量,时尚,昂贵,成功,等等. 二..net Framework组织结构 主要包括三部分:1.公共语言规范 2..NET Framework类库 3.公共语言运行库CLR(托管和执行代码) 三