码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-02-10 18:24:48      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

使用到的系统框架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);

 

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

标签:

原文地址:http://www.cnblogs.com/snail-007/p/4284443.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!