【转】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 ...
随机推荐
- 【Linux】linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲ta ...
- android 开发-数据存储之共享参数
android提供5中数据存储方式 数据存储之共享参数 内部存储 扩展存储 数据库存储 网络存储 而共享存储提供一种可以让用户存储保存一些持久化键值对在文件中,以供其他应用对这些共享参数进行调用.共 ...
- spring mvc 注解扫描问题 ,扫描不到controller, use-default-filters="false"
今天搭了个spring mvc项目,怎么也扫描不到controller,最后发现问题在use-default-filters="false"上面,乱copy出的问题 (默认值是tr ...
- 《C#高效编程》读书笔记07-理解GetHashCode()的陷阱
GetHashCode()函数仅会在一个地方用到,即为基于散列(hash)的集合定义的散列键时,此类集合包括HashSet和Dictionary<K,V>容器等. 但object基类提供的 ...
- C 碎片二 数据类型
一.概述 C 语言包含的数据类型如下图所示: 二.各种数据类型介绍 2.1 整型 整形包括短整型.整形和长整形. 2.1.1 短整形 short a=1; 2.1.2 整形 一般占4个字节(32位), ...
- git 如何生成 SSH 公钥
1.打开你的git bash 窗口 2.进入.ssh目录:cd ~/.ssh 3.找到id_rsa.pub文件:ls 4.查看公钥:cat id_rsa.pub 或者vim id_rsa.pub ...
- js禁止浏览器页面后退功能
js禁止浏览器页面后退功能: <script> $(function(){ ) { //防止页面后退 history.pushState(null, null, document.URL) ...
- CSS文档优化
首先了解下CSS的渲染逻辑,它是从标记的最后一位开始搜索的,例如:.myclass li a,首选它会遍历所有的<a>,然后看哪些<a>之前有<li>,然后再看哪些 ...
- 解决The Network Adapter could not establish the connection
解决1 主机与虚拟机ping不通 解决2 状态: 失败 -测试失败: IO 错误: The Network Adapter could not establish the connection 本次尝 ...
- Eucalyptus管理页面密码设置
桉树环境什么的都已经是配置好了的,但是过了一段时间不用,也不知道密码是什么了,看着下面的页面也不知道如何进去,这里我们通过命令行的方式重置用户名和密码信息. 登陆clc所在机器,输入下命令: euar ...