【转】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 ...
随机推荐
- 新浪php面试题
1. echo count("abc"); 输出什么?答:"1" count — 计算数组中的单元数目或对象中的属性个数int count ( mixed $v ...
- Maven的学习资料收集--(九) 构建SSH项目以及专栏maven
在这里整合一下,使用Maven构建一个SSH项目 1.新建一个Web项目 可以参照前面的博客 2.添加依赖,修改pom.xml <project xmlns="http://maven ...
- android 开发-Toast控件的实现
Toast吐司: Toast内容简单,不做过多介绍,Toast支持自带简单吐司,自定义吐司.内容简单可见代码,详见API.A toast provides simple feedback about ...
- .net中Response.End() 和Response.Redirect("http://dotnet.aspx.cc");
问:什么情况下需要Response.End()语句,加这句有什么好处 答: 首先你要理解Response.End()的意思,它的意思是终止执行下面的语句!但有时不加和加上都一样,但还要加上好,为什么呢 ...
- WCF 内置绑定在不同的传输安全模式下的信道层
basicHttpBinding Transport安全模式信道层 Message安全模式信道层 TransportWithMessageCredential安全模式信道层 TransportCred ...
- C 碎片五 数组
构造类型数据是有基本类型数据按照一定规则组成的.数组,结构体,共用体都属于构造类型的数据.数组是有序数据的集合,C语言数组中的每一个元素都属于同一个数据类型,用数组名和下标来唯一确定数组中的元素. 一 ...
- Spring相关理解
日常拖完整患者............... 待续...
- kickstart2019 round_A B. Parcels
思路: 利用了曼哈顿距离和切比雪夫距离之间的转化. 参考: https://blog.csdn.net/Dylan_Frank/article/details/88985444 https://www ...
- pat乙级1067
1.用cin输入数据后,再用getline 输入,还是会输入cin已经输入的数据,即cin和getline互相独立. 2.题目中没有说尝试的密码不包含空格,因此不能用cin,而用getline. #i ...
- Python开发第四篇
文件操作 一.文件基本操作 打开文件方法:open f = open("test",encoding="") r:只读模式(只能读取文件,不能做写操作,文件不存 ...