通过使用两个框架:AddressBook.framework和AddressBookUI.framework,我们可以在程序中访问并显示iPhone数据库中的联系人信息。

1、AddressBookUI显示部分

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

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

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

ABNewPersonViewController:增加一个新的联系人

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

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

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

(b)设置其代理(delegate)

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

- (IBAction)showPicker:(id)sender

{
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
[self presentModalViewController:picker animated:YES];

[picker release];
}

ABPeoplePickerNavigationControllerDelegate的方法介绍

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

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

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

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker

{
// assigning control back to the main controller
[picker dismissModalViewControllerAnimated:YES];
}

- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{
//获取联系人姓名
name.text = (NSString*)ABRecordCopyCompositeName(person);

//获取联系人电话
ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person, kABPersonPhoneProperty);
NSMutableArray *phones = [[NSMutableArray alloc] init];
int i;
for (i = 0; i < ABMultiValueGetCount(phoneMulti); i++)
  {
NSString *aPhone = [(NSString*)ABMultiValueCopyValueAtIndex(phoneMulti, i) autorelease];
NSString *aLabel = [(NSString*)ABMultiValueCopyLabelAtIndex(phoneMulti, i) autorelease];
NSLog(@"PhoneLabel:%@ Phone#:%@",aLabel,aPhone);

if([aLabel isEqualToString:@"_$!<Mobile>!$_"])
{
[phones addObject:aPhone];
}
}

phoneNo.text=@"" ;
if([phones count]>0)
{
NSString *mobileNo = [phones objectAtIndex:0];
phoneNo.text = mobileNo;
//NSLog(mobileNo);
}

//获取联系人邮箱
ABMutableMultiValueRef emailMulti = ABRecordCopyValue(person, kABPersonEmailProperty);
NSMutableArray *emails = [[NSMutableArray alloc] init];
for (i = 0;i < ABMultiValueGetCount(emailMulti); i++)
{
NSString *emailAdress = [(NSString*)ABMultiValueCopyValueAtIndex(emailMulti, i) autorelease];
[emails addObject:emailAdress];
}

email.text=@"" ;
if([emails count]>0)
{
NSString *emailFirst=[emails objectAtIndex:0];
email.text = emailFirst;
//NSLog(emailFirst);
}

[peoplePicker dismissModalViewControllerAnimated:YES];
return NO;
}

- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker
           shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property 
            identifier:(ABMultiValueIdentifier)identifier
{
return NO;
}

2、AddressBook部分

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

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

(a)常用方法

CFTypeRef ABRecordCopyValue (

ABRecordRef record,

ABPropertyID property

);

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

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

CFStringRef ABRecordCopyCompositeName (

ABRecordRef record

);

获取联系人完整的姓名。

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

CFTypeRef ABMultiValueCopyValueAtIndex (

ABMultiValueRef multiValue,

CFIndex index

);

返回对应位置处的属性值

CFStringRef ABMultiValueCopyLabelAtIndex (

ABMultiValueRef multiValue,

CFIndex index

);

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

CFArrayRef ABMultiValueCopyArrayOfAllValues (

ABMultiValueRef multiValue

);

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

CFIndex ABMultiValueGetCount (

ABMultiValueRef multiValue

);

返回属性值的个数

转载于:https://my.oschina.net/potato512/blog/647798

手机通讯录AddressBook的使用相关推荐

  1. android+读取电话权限,【uniapp】 读取手机通讯录权限

    现在很多APP,市场需求都需要读取我们手机上的相关权限,例如WX要读取通讯录,相册,照相机等权限,其他APP亦如此 但是在获得这些权限之前我们首先需要征得用户的统一之后才能读取 官方讲解: https ...

  2. 【uniapp】 读取手机通讯录权限

    现在很多APP,市场需求都需要读取我们手机上的相关权限,例如WX要读取通讯录,相册,照相机等权限,其他APP亦如此 但是在获得这些权限之前我们首先需要征得用户的统一之后才能读取 官方讲解: https ...

  3. python手机通讯录

    python手机通讯录 基本思路:列表嵌套字典 [{'姓名':张三,'手机号':XX,'邮箱:XX,'地址':XX}, {'姓名':李四,'手机号':XX,'邮箱:XX,'地址':XX}, {'姓名' ...

  4. iOS导入手机通讯录

    ABAddressBookRef addressBooks = nil; if ([[UIDevice currentDevice].systemVersion floatValue] >= 6 ...

  5. ios 简书 获取通讯录信息_iOS9以后获取手机通讯录

    一.iOS 9 以前的通讯录框架 AddressBookUI框架:提供了联系人列表界面.联系人详情界面.添加联系人界面等,一般用于选择联系人. AddressBook 框架:纯 C 语言的 API,仅 ...

  6. c++对象数组模拟手机通讯录Demo

    文章目录 一.需求说明 二.效果 三.整体思路 四.详细思路 五.代码实现 一.需求说明 使用c++开发一个个人版通讯录,要求简单实现下面功能: 1.向通讯录添加联系人 2.从通讯录删除联系人 3.查 ...

  7. 通讯录_怎么恢复手机通讯录?最完整手机通讯录恢复方法大公开

    怎么恢复手机通讯录?因为疫情影响,手机更新的速度也慢了下来,但是2020年下半年会上新苹果新机确实铁板钉钉的事,苹果公司整个上半年都没有关于5G手机的消息,很多朋友在猜测,是不是苹果公司正在卯足了劲整 ...

  8. 安卓通讯录系统mysql_Android手机通讯录项目开发--联系人数据库contacts2.db介绍

    项目描述:该项目为基于Android平台的手机通讯录,主要模块分为四个部分:联系人管理模块,通话记录管理模块,短信管理模块,系统设置模块. 系统结构图如下: 本项目启动时间:2014年5月28日 说明 ...

  9. 利用FluidMoveBehavior制作出手机通讯录平滑的效果

    最近学习Blend,原来Blend制作动画等效果非常棒.下面演示一下FluidMoveBehavior应用,利用Blend中行为中的FluidMoveBehavior制作出手机通讯录平滑的效果 1.在 ...

最新文章

  1. 【错误记录】Groovy 闭包使用报错 ( 闭包中不能直接使用外部对象的方法 | 需要先设置 delegate 代理 )
  2. glance was not installed properly
  3. 关键字搜索 c语言,c语言-以关键字搜索程序
  4. 【图像超分辨率】Remote Sensing Image Super-resolution: Challenges and Approaches
  5. IE 中的一些脚本问题
  6. IOS 多线程04-GCD详解 底层并发 API
  7. 前端学习(586):在元素中动态添加类与伪类
  8. Python time 获取本地时间戳(包含毫秒)
  9. 文末送书 | 自动机器学习(AutoML):方法、系统与挑战
  10. MVC 从客户端中检测到有潜在危险的 Request.Form 值
  11. jquery 验证email
  12. BZOJ.4650.[NOI2016]优秀的拆分(后缀数组 思路)
  13. linux机顶盒界面,基于嵌入式Linux的IPTV机顶盒的设计与实现
  14. Android 第三方桌面,怎么请求Widget的android.permission.BIND_APPWIDGET
  15. abaqus钢结构螺栓连接分析
  16. <转载>项目工程中的WebRoot与WebContent有什么区别?
  17. Android面试题,framework源码
  18. html国内旅游计划,Web实验一 国内旅游界面
  19. Prometheus_additional传统配置
  20. 大话C#的进阶业务场景必知点解析 第8节 算法上道C#根据时间起卦像程序

热门文章

  1. 软件工程毕业设计课题(89)微信小程序毕业设计PHP医院预约挂号小程序系统设计与实现
  2. 2021-2027全球与中国CCTV长焦变焦镜头市场现状及未来发展趋势
  3. IT猎头瞄准IT高管 高端技术人才引进仍是难题
  4. JS时间戳和时间之间转换
  5. Java线程池的原理
  6. [网络]无线AP启用WIFI模式设置步骤
  7. 如何打造一个理想的团队
  8. TP4054或LTH7锂电充电芯片灯不灭解决处理方法和充电不转灯解决方式
  9. java版 推箱子,俄罗斯方块,诗歌默写,坦克!由瑶哥特改造哦!
  10. javascript 弹弹球小游戏