* 对于每一个移动设备而言,都有一个内置的数据库-----通讯录。
* 在IOS上,通讯录放在SQLite3数据库中。
* 由于不同应用之间不能直接访问,我们想要实现对数据库的访问,必须使用苹果开放的API.
* 苹果公司对数据访问开放的API是AddressBook(低级API)和AddressBookUI(高级API).
* 为了安全考虑,访问通讯录需要经过用户授权,仅需一次授权即可。
* AddressBook属于低级API,可以获取通讯录中的数据,但是需要自构UI界面
* AddressBookUI属于高级API,为我们提供了UI界面,使用起来比较方便。
* 在AddressBook中,比较常用的类是ABAddressBook, ABPerson, ABGroup, ABRecord
* ABAddressBook :封装了通讯录的接口。(对应ABAddressBookRef)
* ABPerson :封装通信录个人的信息数据。(对应ABPersonRef)
* ABGroup :封装了通讯录组信息数据。(对应ABGroupRef)
* ABRecord :封装了数据库的一条记录。(对应ABRecordRef)
想要获取通信录的信息,第一步是要导入AddressBook的框架,并在头文件中写入头文件<AddressBook/AddressBook.h>
用户想要访问通讯录,第一步要创建通讯录对象,用于用户请求访问通讯录,代码如下:
1 ABAddressBookRef addressbook = ABAddressBookCreateWithOptions(NULL, NULL);
* 如果是第一次访问通信录,需要获取用户的授权,不是第一次,直接访问。系统给我们提供的函数是:
* ABAddressBookRequestAccessWithCompletion(<#ABAddressBookRef addressBook#>, <#^(bool granted, CFErrorRef error)completion#>)
* 如果第一次访问,点击允许访问,granted的值为一。
* 只要granted的值为真的情况下,才允许访问通讯录。
* 获取通讯录的所有记录的代码如下:
1 NSArray *array = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressbook);
* 接下来我们要获取通讯录的联系人的姓名:代码如下:
1 ABRecordRef record = array[i]; 2 NSString *name = (NSString *)ABRecordCopyCompositeName(record);
* 获取联系人的手机号的时候,是属于一个多值属性,跟后去联系人姓名的时候有点不同,联系人姓名属于单值属性,代码如下:
1 ABMultiValueRef ref = ABRecordCopyValue(record, kABPersonPhoneProperty); 2 NSString *phone = ABMultiValueCopyValueAtIndex(ref, 0);
* 整体代码为:(第二个函数的功能是去掉电话号码中的特殊字符,因为我们获取到得号码是苹果给我们分隔好的)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | -(void)getAddressbookContent{    ABAddressBookRef addressbook = ABAddressBookCreateWithOptions(NULL, NULL);    ABAddressBookRequestAccessWithCompletion(addressbook, ^(boolgranted, CFErrorRef error) {        if(granted == YES)        {            NSArray*array = (NSArray*)ABAddressBookCopyArrayOfAllPeople(addressbook);            for(inti = 0; i < array.count; i ++)            {                ABRecordRef record = array[i];                NSString*name = (NSString*)ABRecordCopyCompositeName(record);                ABMultiValueRef ref = ABRecordCopyValue(record, kABPersonPhoneProperty);                NSString*phone = ABMultiValueCopyValueAtIndex(ref, 0);                NSString*phone1 = phone;                phone1 = [selfdeleteSpecialString:phone1];                contact *c = [[contact alloc]initWithName:name withPhone:phone1];                [_arrayContact addObject:c];                [c release];                CFRelease(name);                CFRelease(phone);                CFRelease(ref);            }        }    });}-(NSString*)deleteSpecialString:(NSString*)string{    string = [string stringByReplacingOccurrencesOfString:@"("withString:@""];    string = [string stringByReplacingOccurrencesOfString:@")"withString:@""];    string = [string stringByReplacingOccurrencesOfString:@"-"withString:@""];    string = [string stringByReplacingOccurrencesOfString:@" "withString:@""];    returnstring;} | 
* 使用这个类我们可以直接调出通讯录的界面,代码如下:
| 1 2 | ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];[selfpresentViewController:picker animated:YEScompletion:nil]; | 
 效果图如下:
这个类有几个比较常用的代理方法,分别是:
点击取消按钮,相应该方法
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
点击联系人信息,是否跳转到详情界面
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
在联系人详情界面中点击了其它信息,是否跳转到其它界面(例如,点击时间,可以打开日历)
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
5.上面的介绍,只是通讯录的基本使用,当然通讯录的方法不止这些,例如可以修改,添加,删除联系人的信息,在此主要介绍了如何获取通讯录的信息。
原文:http://www.cnblogs.com/xhc1263478959/p/4809342.html