iOS 通讯录开发 AddressBook AddressBookUI框架的使用

使用到的系统框架AddressBook,AddressBookUI;IOS中的通讯录是存储在数据库中的,开发人员不能直接访问通讯录数据库,必须依靠AddressBook提供的API来实现通讯录操作,通过AddressBook.FrameWork可以操作通讯录信息,但是AddressBook框架是基于C语言编写的,无法使用ARC管理内存,需要自己手动管理。

AddressBook框架的常用类型:

ABAddressBookRef:代表通讯录对象。通过该对象,可以直接访问和保存通讯录信息。

ABRecordRef:代表一个通用的记录对象,常用。作为联系人,该对象完整记录了联系人信息(姓名,性别,电话,邮件),每个ABRecordRef 都有一条唯一的ID表示,(可以通过ABRecordGetRecordID())获得。

ABPersonRef:代表联系人信息,很少使用,实际开发中常使用kABPersonType 的ABPersonRef 来表示联系人;

ABGrounpRef:代表群组。

对通讯录的操作,关键是对ABRecordRef的操作,常用方法如下:

ABPersonCreate():创建一个类型为“kABPersonType”的ABRecordRef;

ABRecordCopyValue():取得联系人属性:官方文档的属性:

由于联系人访问时(读取、设置、删除时)牵扯到大量联系人属性,可以到ABPerson.h中查询或者直接到帮助文档“Personal Information Properties

ABRecordSetValue(): 设置ABRecordRef的属性值。分为单属性和多属性,单属性使用ABRecordSetValue();多属性通过创建一个ABMutableMultiValueRef类型的变量,然后通过ABMultiValueAddValueAndLabel ()方法依次添加属性值,最后通过ABRecordRefSetValue ()方法 将ABMutableMultiValueRef类型的变量设置为记录值。

ABRecordRmoveValue ():删除指定的属性值。

注意: 取出的对象为CF对象,编译器无法自动释放,可以通过 bridge-casts 转换成NSObject对象,例如 NSString*firstname=(__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);有关bridge-casts 可以参考这篇文章http://blog.csdn.net/chengwuli125/article/details/25497051

建议使用 CFBridgingRelease(),从 Core Foundation 传递所有权给 Objective-C;

使用 CFBridgingRetain(),从 Objective-C 传递所有权给 Core Foundation;这样就不用手动释放CF对象。

以上为AddressBook框架对象及方法的介绍,接下来就是读取联系人,项目中用到的是最简单的调用系统的AddressBookUI框架。

一、      使用ABPeoplePickerNavigationController 局限:只能选择一个联系人,且不能定制页面。优点:方便快捷,视图本身继承于UINavigationCotroller 不需要使用UInavigationcontroller 封装。

作为模态视图推出即可。

ABPeoplePickerNavigationController*ppvc=[[ABPeoplePickerNavigationController alloc]init];

ppvc.peoplePickerDelegate=self;//设置代理

[self.navigationController presentViewController:ppvc animated:YES completion:nil];

方法:代理ABPeoplePickerNavigationControllerDelegate;

// Called after a person has been selected by the user.

iOS8方法,选中联系人后的操作,

-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person NS_AVAILABLE_IOS(8_0);

可以根据自己需要对person 属性进行处理。

取姓名:NSString*firstname=(__bridgeNSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);

取电话:ABMultiValueRef phones=ABRecordCopyValue(person, kABPersonPhoneProperty);

for(int i=0;i<ABMultiValueGetCount(phones);i++)

{

NSString*phone=(__bridge NSString *)ABMultiValueCopyValueAtIndex(phones, i);

[_phoneNumber addObject:phone];

}

电话取出后为一数组,可能不止一个。

// Called after a property has been selected by the user.

iOS8 选中联系人属性后的方法,如果上一个方法实现 这个方法不会调用。

-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_AVAILABLE_IOS(8_0);

// Called after the user has pressed cancel.

点击取消后的操作

-(void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker;

注意:选择联系人或点击取消后 都要

[self dismissViewControllerAnimated:YES completion:nil];

以下为以前的方法,在iOS8 上选取联系人后会进入联系人详细页面,不会读取联系人信息,慎用。

// Deprecated, use predicateForSelectionOfPerson and/or -peoplePickerNavigationController:didSelectPerson: instead.

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person NS_DEPRECATED_IOS(2_0, 8_0);

//  , use predicateForSelectionOfProperty and/or -peoplePickerNavigationController:didSelectPerson:property:identifier: instead.

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_DEPRECATED_IOS(2_0, 8_0);

二、addressBookUI 还提供ABPersonViewController :用于查看联系人信息(需要设置displayedPerson属性 来显示或需要编辑的联系人);

ABNewPersonViewController :用于新增联系人。

ABUnknownPersonViewController :用于显示未知联系人。

以上均继承于UIViewController 在使用过程中必须使用一个UINavigationController 进行封装,否则只能看到视图,无法操作。封装后不必处理具体新增,修改联系人的逻辑,但必须处理关闭操作即调用 dismissViewControllerAnimated的方法。

更多时候开发中会自己定制通讯录,即通过addressBook框架进行开发。

开发步骤:1、创建通讯录对象ABAddressBookRef   ABAddressBookCreateWithOpio();

2、获得用户授权访问通讯录 ABAddressBookRrequestAccessWithCompletion();

3、查询联系人信息 ABAddressBookCopyArrayOfAllPeople(),ABAddressBookCopyPeopleWithName();

4、读取联系人后如果要显示联系人信息则可以调用ABRecord相关方法读取相应的数据;如果要进行修改联系人信息,则可以使用对应的方法修改ABRecord信息,然后调用ABAddressBookSave()方法提交修改;如果要删除联系人,则可以调用ABAddressBookRemoveRecord()方法删除,然后调用ABAddressBookSave()提交修改操作。

5、如果要修改或者删除都需要首先查询对应的联系人,然后修改或删除后提交更改。如果用户要增加一个联系人则不用进行查询,直接调用ABPersonCreate()方法创建一个ABRecord然后设置具体的属性,调用ABAddressBookAddRecord方法添加即可。

读取全部联系人信息:

1、ABAddressBookRef addressBook=ABAddressBookCreateWithOptions(nil, nil);

CFArrayRef allperson =ABAddressBookCopyArrayOfAllPeople(addressBook);

NSArray *array=CFBridgingRelease(allperson);

新建联系人:

//创建一条记录

ABRecordRef recordRef= ABPersonCreate();

ABRecordSetValue(recordRef, kABPersonFirstNameProperty, (__bridge CFTypeRef)(firstName), NULL);//添加名

ABRecordSetValue(recordRef, kABPersonLastNameProperty, (__bridge CFTypeRef)(lastName), NULL);//添加姓

ABMutableMultiValueRef multiValueRef =ABMultiValueCreateMutable(kABStringPropertyType);//添加设置多值属性

ABMultiValueAddValueAndLabel(multiValueRef, (__bridge CFStringRef)(workNumber), kABWorkLabel, NULL);//添加工作电话

ABRecordSetValue(recordRef, kABPersonPhoneProperty, multiValueRef, NULL);

//添加记录

ABAddressBookAddRecord(addressBook, recordRef, NULL);

//保存通讯录,提交更改

ABAddressBookSave(addressBook, NULL);

//释放资源

CFRelease(recordRef);

CFRelease(multiValueRef);

3、根据姓名删除联系人

CFStringRef personNameRef=(__bridge CFStringRef)(personName);

CFArrayRef recordsRef= ABAddressBookCopyPeopleWithName(addressBook, personNameRef);//根据人员姓名查找

CFIndex count= CFArrayGetCount(recordsRef);//取得记录数

for (CFIndex i=0; i<count; ++i) {

ABRecordRef recordRef=CFArrayGetValueAtIndex(recordsRef, i);//取得指定的记录

ABAddressBookRemoveRecord(self.addressBook, recordRef, NULL);//删除

}

ABAddressBookSave(self.addressBook, NULL);//删除之后提交更改

CFRelease(recordsRef);// 释放资源

4、修改联系人信息

ABRecordRef recordRef=ABAddressBookGetPersonWithRecordID(addressBook,recordID);

ABRecordSetValue(recordRef, kABPersonFirstNameProperty, (__bridge CFTypeRef)(firstName), NULL);//添加名

ABRecordSetValue(recordRef, kABPersonLastNameProperty, (__bridge CFTypeRef)(lastName), NULL);//添加姓

ABMutableMultiValueRef multiValueRef =ABMultiValueCreateMutable(kABStringPropertyType);

ABMultiValueAddValueAndLabel(multiValueRef, (__bridge CFStringRef)(workNumber), kABWorkLabel, NULL);

ABRecordSetValue(recordRef, kABPersonPhoneProperty, multiValueRef, NULL);

//保存记录,提交更改

ABAddressBookSave(self.addressBook, NULL);

//释放资源

CFRelease(multiValueRef);

时间: 2024-08-07 19:01:02

iOS 通讯录开发 AddressBook AddressBookUI框架的使用的相关文章

iOS通讯录开发

文/千煌89(简书作者)原文链接:http://www.jianshu.com/p/6acad14cf3c9著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 场景一:直接选择一个联系人的电话号码 这里不需要先获取所有的联系人自己做联系人列表,直接使用系统自带的AddressBookUI/ABPeoplePickerNavigationController.h就好. 首先需要引入如下三个文件 #import <AddressBookUI/ABPeoplePickerNavigatio

利用AddressBook.framework框架获取iOS系统通讯录数据

此方法是使用AddressBook.framework框架获取通讯录信息 第一步.在info.plist文件里面配置访问权限 第二步.导入头文件 1 #import <AddressBook/AddressBook.h> 2 #import <AddressBookUI/AddressBookUI.h> 第三步.获取通讯录数据 1 - (void)getSystemAddress{ 2 3 //新建一个通讯录类 4 ABAddressBookRef addressBooks = n

iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

这里接着前文<iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)>,主要是干货环节,列举了如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法. 三. 常用方法的封装 虽然 PhotoKit 的功能强大很多,但基于兼容 iOS 8.0 以下版本的考虑,暂时可能仍无法抛弃 ALAssetLibrary,这时候一个比较好的方案是基于 ALAssetLibrary 和 PhotoKit 封装出一系列模拟系统 Asset 类的自定义类,然后在其中封装好兼容 A

iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法. 这里引用一下前文中对 PhotoKit 基本构成的介绍: PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源 PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值 PHAssetCo

ReactiveCocoa - iOS开发的新框架

本文转载至 http://www.infoq.com/cn/articles/reactivecocoa-ios-new-develop-framework ReactiveCocoa(其简称为RAC)是由Github 开源的一个应用于iOS和OS X开发的新框架.RAC具有函数式编程和响应式编程的特性.它主要吸取了.Net的 Reactive Extensions的设计和实现.本文将详细介绍该框架试图解决什么问题,以及其用法与特点. ReactiveCocoa试图解决什么问题 经过一段时间的研

[转] iOS --- ReactiveCocoa - iOS开发的新框架

转载唐巧的博客:ReactiveCocoa - iOS开发的新框架

iOS App开发那些事:如何选择合适的人、规范和框架?

自从做Team Leader之后,身上权责发生了变化,于是让我烦恼的不再是具体某个功能,某个界面的实现,而是如何在现有代码的基础上做渐进式的改进,创造出比较合适规范和框架,使得组内成员更快更好地完成任务.一年下来,颇有点想法,于是啰嗦几句关于iOS App开发的那些事. 合适的人 首先明确一点,合适的人是指纯技术团队的建设.一支战斗力再强的技术团队,面对一个朝三暮四,分分钟推翻自己原有想法的产品经理/项目经理,再好的戏也唱不出来.花几个月加班加点做项目,还没发布,直接推翻重做,这时候你就得去楼下

网易新闻iOS版开发使用的第三方框架和组件列表

网易新闻iOS版在开发过程中曾经使用过的第三方开源类库.组件 1.AFNetworking AFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务端 API 进行数据交换, 操作简单, 功能强大, 现在许多人都用它取代 ASIHTTPRequest 2.Apple Reachability 网络监测,可以参考下这篇文章iOS网络监测如何区分2.3.4G? 3.DOUAudioStreamer 豆瓣的开源软件,DOUAudioStreamer

ios系统架构及常用框架

1.iOS基于UNIX系统,因此从系统的稳定性上来说它要比其他操作系统的产品好很多 2.iOS的系统架构分为四层,由上到下一次为:可触摸层(Cocoa Touch layer).媒体层(Media layer).核心服务层(Core Services layer).核心操作系统层(Core OS layer)如图: (1) 触摸层:为应用程序开发提供了各种常用的框架并且大部分框架与界面有关,本质上来说它负责用户在iOS设备上的触摸交互操作.它包括以下这些组件: Multi-Touch Event