【转】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:这个方法进行显示整个通讯录页面
例子:
- - (IBAction)showPicker:(id)sender {
 - ABPeoplePickerNavigationController *picker =
 - [[ABPeoplePickerNavigationController alloc] init];
 - picker.peoplePickerDelegate = self;
 - [self presentModalViewController:picker animated:YES];
 - [picker release];
 - }
 
ABPeoplePickerNavigationControllerDelegate的方法介绍
(1)
- peoplePickerNavigationControllerDidCancel:
 
当用户选择取消时调用这个方法,可以在这个方法里取消整个通讯录页面的显示。
(2)
- peoplePickerNavigationController:shouldContinueAfterSelectingPerson:
 
当用户选择了通讯录中某一个联系人时调用这个方法,可以在这里获取联系人的信息。如果希望可以继续显示这个联系人更具体的信息,则return YES。否则取消整个通讯录页面的显示并return NO。
(3)
- eoplePickerNavigationController: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
 - );
 
返回属性值的个数
例子:
- //获取联系人姓名
 - 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];
 - }
 - }
 
by gqzhu
【转】iPhone通讯录AddressBook.framework和AddressBookUI.framework的应用的更多相关文章
- Swift - 访问通讯录-使用AddressBook.framework和AddressBookUI.framework框架实现
		
1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...
 - 【Robot Framework】robot framework 学习以及selenium、appnium、requests实践(一)
		
话说之前自己写了个selenium的自动化框架,然后又研究了下RF,觉得RF这种基于关键字驱动的框架更为容易上手,当然在做一些比较繁琐的验证时,似乎还不是太灵活,不如自己写几行python来的实惠(也 ...
 - [Entity Framework] MySQL @ Entity Framework 6
		
原文 [Entity Framework] MySQL @ Entity Framework 6 要让MySQL能够用EF6,我花了一点时间,在此记录一下 安装元件 在设定档加入Provider 安装 ...
 - Qt Framework 问题之 framework/Versions/A:bundle format unrecognized, invalid, or unsuitable
		
在解决标题提到的问题之后,先来介绍下Qt Framework一些基本知识. 基于QT的Mac端工程,在打包时需要对所有需要嵌入到APP的framework及dylib文件进行手动签名处理. 一.签名处 ...
 - ios Standard Framework和Umbrella Framework
		
Standard Framework:标准库,通过引用对应的header文件而不是引用master header 文件来引用类(也可以通过引用Master Header file来引用需要使用的类), ...
 - iphone通讯录的备份与恢复
		
最近在做iOS系统通讯录备份到服务器,并且可以从服务器中下载备份文件恢复到手机的功能,部分实现细节记录如下. 将iphone系统通讯录生成.vcf文件 ABAddressBookRef address ...
 - Entity Framework 教程——Entity Framework中的实体类型
		
Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...
 - 【Entity Framework】 Entity Framework资料汇总
		
Fluent API : http://social.msdn.microsoft.com/Search/zh-CN?query=Fluent%20API&Refinement=95& ...
 - .net平台 .net Framework 组织结构 .net Framework类库 CLR C# 介绍
		
一..net平台 .NET现在可以看成微软的一个品牌,微软有两个非常成功的品牌,那就是Windows和Office. .NET会成为微软的另一个品牌.它不仅仅是一组技术,产品,或服务(微软的服务包括M ...
 
随机推荐
- VMware下linux与window文件夹共享
			
这里说的是在虚拟机下来实现在windows下共享一个文件夹. 下面来说明一下是如何实现的: 1. 安装VMware.Workstation. 2. 安装Redhat Linux 9.0,在虚拟机下 ...
 - ubuntu 无法应用原保存的显示器配置
			
打开ubuntu之后的开启页面出现: 所选模式均不匹配可能的模式: 为 CRTC 63 尝试模式 CRTC 63:尝试 800x600@60Hz 模式输出在 1366x768@60Hz (通过 0) ...
 - HDU 5452——Minimum Cut——————【树链剖分+差分前缀和】ACdream 1429——Diversion——————【树链剖分】
			
Minimum Cut Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Tota ...
 - Java学习笔记--字符串和文件IO
			
1.Java中的字符串类和字符的表示 2.区分String,StringBuilder和StringBuffer 3.从命令行中给main方法传递参数 4.文件操作 1 Java中的字符串和字符 1. ...
 - 使用Pycharm开发python下django框架项目生成的文件解释
			
目录MyDjangoProject下表示工程的全局配置,分别为setttings.py.urls.py和wsgi.py,1.其中setttings.py包括了系统的数据库配置.应用配置和其他配置,2. ...
 - 属性(property)与成员变量(ivar)
			
类内使用成员变量{}, 类外使用属性@property /*********** --- Person.h */ @interface Person : NSObject { NSString *_n ...
 - Int与String之间相互转换
			
1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...
 - Hibernate笔记3--多表操作-导航查询
			
一.一对多操作 1.构造实体类及编写配置文件: 一方: // 一个Customer对应多个linkman private Set<Linkman> linkmans = new ...
 - Android——dpi相关知识总结
			
1.术语和概念 术语 说明 备注 Screen size(屏幕尺寸) 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸...... nexus4手机是4.7英寸 As ...
 - pecl install msgpack
			
Before the beginning: There are two php version, php5.5, php7.1. we need to install msgpack under ph ...