通讯录联系人相关的应用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. phoneNo.text=@"";
  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.text=@"";
  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

 
 

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

  1. Swift - 访问通讯录-使用AddressBook.framework和AddressBookUI.framework框架实现

    1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...

  2. 【Robot Framework】robot framework 学习以及selenium、appnium、requests实践(一)

    话说之前自己写了个selenium的自动化框架,然后又研究了下RF,觉得RF这种基于关键字驱动的框架更为容易上手,当然在做一些比较繁琐的验证时,似乎还不是太灵活,不如自己写几行python来的实惠(也 ...

  3. [Entity Framework] MySQL @ Entity Framework 6

    原文 [Entity Framework] MySQL @ Entity Framework 6 要让MySQL能够用EF6,我花了一点时间,在此记录一下 安装元件 在设定档加入Provider 安装 ...

  4. Qt Framework 问题之 framework/Versions/A:bundle format unrecognized, invalid, or unsuitable

    在解决标题提到的问题之后,先来介绍下Qt Framework一些基本知识. 基于QT的Mac端工程,在打包时需要对所有需要嵌入到APP的framework及dylib文件进行手动签名处理. 一.签名处 ...

  5. ios Standard Framework和Umbrella Framework

    Standard Framework:标准库,通过引用对应的header文件而不是引用master header 文件来引用类(也可以通过引用Master Header file来引用需要使用的类), ...

  6. iphone通讯录的备份与恢复

    最近在做iOS系统通讯录备份到服务器,并且可以从服务器中下载备份文件恢复到手机的功能,部分实现细节记录如下. 将iphone系统通讯录生成.vcf文件 ABAddressBookRef address ...

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

    Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...

  8. 【Entity Framework】 Entity Framework资料汇总

    Fluent API : http://social.msdn.microsoft.com/Search/zh-CN?query=Fluent%20API&Refinement=95& ...

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

    一..net平台 .NET现在可以看成微软的一个品牌,微软有两个非常成功的品牌,那就是Windows和Office. .NET会成为微软的另一个品牌.它不仅仅是一组技术,产品,或服务(微软的服务包括M ...

随机推荐

  1. SQL中改变列的数据类型

    一.该列非主键.无default约束 直接更新: alter table 表名 alter column 列名 数据类型 二.该列为主键列.无default约束 (1)删除主键 alter table ...

  2. PHP面向对象编程一

    php面向对象编程(一)   类与对象关系: 类就像一个人类的群体 我们从类中实例化一个对象 就像是制定一个人. 面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,所以我们首先要做的就是如何 ...

  3. linux下使用shell脚本批处理命令

    1.新建脚本touch first.sh 2.写入命令vi first.sh #!/bin/bash #publish service and api echo "copy file&quo ...

  4. devExpress GridControl gridView笔记

    gridView1.Appearance.EvenRow.BackColor = Color.FromArgb(, , , ); gridView1.Appearance.OddRow.BackCol ...

  5. Servlet的生命周期以及线程安全问题

    一:Servlet生命周期图,以及注意事项 二:代码演示 LifeCycleServlet.java package cn.woo.servlet; import java.io.IOExceptio ...

  6. Ajax 使用 FormData做为data的参数时 出现Illegal invocation

    今天在用ajax向后台传递数据时出现此错误,在ajax的参数中加上 contentType: false, processData: false, 这两句即可.

  7. zblog去除文章页作者信息

    不想让zblog文章页显示作者信息怎么办? 1. 找到文章页模板文件:/zb_users/theme/default/template/post-single.php,删除相关代码 <span ...

  8. WPF创建SignalR服务端(转)

    在网上看到了一个帖子,比较详细,博主写的很好. 地址:http://blog.csdn.net/lordwish/article/details/51786200

  9. shell实现mysql数据库备份

    #!/bin/bash DB_USER="root" #数据库用户名 DB_PASS="12345678" #数据库密码 BACK_DIR="/bac ...

  10. 利用binlog2sql解析mysqlbinlog row行日志

    binlog2sql 项目作者:曹单锋 github项目地址:https://github.com/danfengcao/binlog2sql 也可在github.com上搜索“binlog2sql” ...