13.0. Introduction(Address Book)
通过通讯录应用程序,我们可以添加、修改、删除联系人,联系人有些属性只有一个值,有些属性可以有多个值。
通过AddressBook.framework,可以访问通讯录,可以添加修改联系人。
13.1. Requesting Access to the Address Book
请求访问通讯录
kABAuthorizationStatusNotDetermined 用户还没决定是否让你的程序访问通讯录
kABAuthorizationStatusDenied 用户决定不让你的程序访问通讯录
kABAuthorizationStatusAuthorized用户授权你的程序访问通讯录
kABAuthorizationStatusRestricted 受限,不能访问
几个接口
ABAddressBookGetAuthorizationStatus
ABAddressBookCreateWithOptions
ABAddressBookRequestAccessWithCompletion
- (IBAction)buttonAction:(id)sender {
[selftestAuthorization];
}
-(void)testAuthorization
{
ABAddressBookRef addressBook;
CFErrorRef error = NULL;
switch (ABAddressBookGetAuthorizationStatus()){
casekABAuthorizationStatusAuthorized:{
NSLog(@"Authorized");
addressBook =ABAddressBookCreateWithOptions(NULL, &error);
/* Do your work and once you are finished ... */
if (addressBook != NULL){
CFRelease(addressBook);
}
break;
}
casekABAuthorizationStatusDenied:{
NSLog(@"Denied");
break;
}
casekABAuthorizationStatusNotDetermined:{
NSLog(@"NotDetermined");
addressBook =ABAddressBookCreateWithOptions(NULL, &error);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted,CFErrorRef error) {
if (granted){
NSLog(@"Access was granted");
}else {
NSLog(@"Access was not granted");
}
if (addressBook != NULL){
CFRelease(addressBook);
}
});
break;
}
casekABAuthorizationStatusRestricted:{
NSLog(@"Restricted");
break;
}
}
}
打印:
2014-07-01 10:35:04.788 cookbook7_12[594:a0b] NotDetermined
2014-07-01 10:36:43.457 cookbook7_12[594:41b] Access was granted
2014-07-01 10:36:46.385 cookbook7_12[594:a0b] Authorized
2014-07-01 10:36:49.113 cookbook7_12[594:a0b] Authorized
不知你是否想知道,如果多次调用ABAddressBookRequestAccessWithCompletion会是什么结果,会多次弹出询问框吗?貌似不太合理
我试了下
-(void)testAuth
{
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted){
NSLog(@"Access was granted");
}else {
NSLog(@"Access was not granted");
}
if (addressBook !=NULL){
CFRelease(addressBook);
}
});
}
结果不弹框,而是直接:
2014-07-02 09:40:56.326 cookbook7_12[338:1403] Access was granted
2014-07-02 09:41:11.615 cookbook7_12[338:3a0f] Access was granted
2014-07-02 09:41:12.431 cookbook7_12[338:3a0f] Access was granted
因为这个程序昨天已经 granted 了
13.2. Retrieving a Reference to an Address Book
获取通讯录接口的引用,保存或取消修改
几个接口
ABAddressBookHasUnsavedChanges
ABAddressBookSave
ABAddressBookRevert
-(void)testAuthorization
{
CFErrorRef error = NULL;
switch (ABAddressBookGetAuthorizationStatus()){
casekABAuthorizationStatusAuthorized:{
NSLog(@"Authorized");
addressBook =ABAddressBookCreateWithOptions(NULL, &error);
[selfuseAddressBook:addressBook];
if (addressBook != NULL){
CFRelease(addressBook);
}
break;
}
casekABAuthorizationStatusDenied:{
NSLog(@"Denied");
break;
}
casekABAuthorizationStatusNotDetermined:{
NSLog(@"NotDetermined");
addressBook =ABAddressBookCreateWithOptions(NULL, &error);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted){
NSLog(@"Access was granted");
}else {
NSLog(@"Access was not granted");
}
if (addressBook != NULL){
CFRelease(addressBook);
}
});
break;
}
casekABAuthorizationStatusRestricted:{
NSLog(@"Restricted");
break;
}
}
}
- (void) useAddressBook:(ABAddressBookRef)paramAddressBook{/* Work with the address book here */
/* Let's see whether we have made any changes to the
address book or not, before attempting to save it */
if (ABAddressBookHasUnsavedChanges(paramAddressBook)){/* Now decide if you want to save the changes to
the address book */
NSLog(@"Changes were found in the address book.");
BOOL doYouWantToSaveChanges = YES;
/* We can make a decision to save or revert the
address book back to how it was before */
if (doYouWantToSaveChanges){
CFErrorRef saveError = NULL;
if (ABAddressBookSave(paramAddressBook, &saveError)){
/* We successfully saved our changes to the address book */
} else {
/* We failed to save the changes. You can now
access the [saveError] variable to find out
what the error is */
}
} else {
/* We did NOT want to save the changes to the address
book so let's revert it to how it was before */
ABAddressBookRevert(paramAddressBook);
}
} else {
/* We have not made any changes to the address book */
NSLog(@"No changes to the address book.");
}
}
13.3. Retrieving All the People in the Address Book
获取所有联系人
几个接口
ABAddressBookCopyArrayOfAllPeople
CFArrayGetCount
CFArrayGetValueAtIndex
- (void) readFromAddressBook:(ABAddressBookRef)paramAddressBook{
NSArray *arrayOfAllPeople = (__bridge_transferNSArray *)ABAddressBookCopyArrayOfAllPeople(paramAddressBook);
NSUInteger peopleCounter = 0;
for (peopleCounter = 0; peopleCounter < [arrayOfAllPeoplecount];peopleCounter++){
ABRecordRef thisPerson =(__bridge ABRecordRef)[arrayOfAllPeople objectAtIndex:peopleCounter];
NSLog(@"%@", thisPerson);
/* Use the [thisPerson] address book record */
}
}
打印:
2014-07-01 15:13:21.200 cookbook7_12[408:a0b] Authorized
2014-07-01 15:13:21.206 cookbook7_12[408:a0b] <CPRecord: 0xa637c50 ABPerson>
2014-07-01 15:13:21.207 cookbook7_12[408:a0b] <CPRecord: 0xa637f10 ABPerson>
我在模拟器上添加了两个联系人
根据书上说明自己照猫画虎写了一个
-(void)readFromAddressBook2:(ABAddressBookRef)paramAddressBook{
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(paramAddressBook);
CFIndex count = CFArrayGetCount(allPeople);
for (int i = 0; i < count; i++) {
ABRecordRef record = (ABRecordRef)CFArrayGetValueAtIndex(allPeople, i);
NSLog(@"record%d=%@",i,record);
}
}
打印:
2014-07-01 15:20:26.846 cookbook7_12[456:a0b] Authorized
2014-07-01 15:20:26.852 cookbook7_12[456:a0b] record0=<CPRecord: 0xa1b4e30 ABPerson>
2014-07-01 15:20:26.853 cookbook7_12[456:a0b] record1=<CPRecord: 0xa1b4fa0 ABPerson>
13.4. Retrieving Properties of Address Book Entries
获取联系人信息
几个接口
ABAddressBookCopyArrayOfAllPeople
ABRecordCopyValue
ABMultiValueCopyLabelAtIndex
ABAddressBookCopyLocalizedLabel
ABMultiValueCopyValueAtIndex
- (void) readFromAddressBook:(ABAddressBookRef)paramAddressBook{
NSArray *allPeople = (__bridge_transferNSArray *)ABAddressBookCopyArrayOfAllPeople(paramAddressBook);
NSUInteger peopleCounter = 0;
for (peopleCounter = 0; peopleCounter < [allPeoplecount];peopleCounter++){
ABRecordRef thisPerson = (__bridge ABRecordRef)[allPeople objectAtIndex:peopleCounter];
NSString *firstName = (__bridge_transferNSString *)ABRecordCopyValue(thisPerson,kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transferNSString *)ABRecordCopyValue(thisPerson,kABPersonLastNameProperty);
NSString *email = (__bridge_transfer NSString *)ABRecordCopyValue(thisPerson,kABPersonEmailProperty);
NSLog(@"First Name = %@", firstName);
NSLog(@"Last Name = %@", lastName);
NSLog(@"Address = %@", email);
}
}
打印:
2014-07-01 15:55:31.363 cookbook7_12[514:a0b] Authorized
2014-07-01 15:55:31.371 cookbook7_12[514:a0b] First Name = First Name
2014-07-01 15:55:31.371 cookbook7_12[514:a0b] Last Name = Last Name
2014-07-01 15:55:31.372 cookbook7_12[514:a0b] Address = ABMultiValueRef 0xc03a8b0 with 2 value(s)
0: _$!<Home>!$_ (0xc03a440) - home email (0xc03aa90)
1: _$!<Work>!$_ (0xc03a420) - work email (0xc03ab00)
2014-07-01 15:55:31.372 cookbook7_12[514:a0b] First Name = First2
2014-07-01 15:55:31.373 cookbook7_12[514:a0b] Last Name = last2
2014-07-01 15:55:31.373 cookbook7_12[514:a0b] Address = ABMultiValueRef 0xa463db0 with 0 value(s)
修改下邮件信息的打印
- (void) logPersonEmails:(ABRecordRef)paramPerson{
if (paramPerson == NULL){
NSLog(@"The given person is NULL.");return;
}
ABMultiValueRef emails =
ABRecordCopyValue(paramPerson,kABPersonEmailProperty);
if (emails == NULL){
NSLog(@"This contact does not have any emails.");return;
}
/* Go through all the emails */
NSUInteger emailCounter = 0;
for (emailCounter = 0;emailCounter < ABMultiValueGetCount(emails); emailCounter++){
/* Get the label of the email (if any) */
NSString *emailLabel = (__bridge_transferNSString *)ABMultiValueCopyLabelAtIndex(emails, emailCounter);
NSString *localizedEmailLabel = (__bridge_transferNSString *)ABAddressBookCopyLocalizedLabel((__bridgeCFStringRef)emailLabel);
/* And then get the email address itself */
NSString *email = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(emails, emailCounter);
NSLog(@"Label = %@, Localized Label = %@, Email = %@",
emailLabel,
localizedEmailLabel,
email);
}
CFRelease(emails);
}
- (void) readFromAddressBook:(ABAddressBookRef)paramAddressBook{
NSArray *allPeople = (__bridge_transferNSArray *)ABAddressBookCopyArrayOfAllPeople(paramAddressBook);
NSUInteger peopleCounter = 0;
for (peopleCounter = 0; peopleCounter < [allPeoplecount];peopleCounter++){
ABRecordRef thisPerson = (__bridge ABRecordRef)[allPeople objectAtIndex:peopleCounter];
NSString *firstName = (__bridge_transferNSString *)ABRecordCopyValue(thisPerson,kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transferNSString *)ABRecordCopyValue(thisPerson,kABPersonLastNameProperty);
// NSString *email = (__bridge_transfer NSString *)ABRecordCopyValue(thisPerson, kABPersonEmailProperty);
NSLog(@"First Name = %@", firstName);
NSLog(@"Last Name = %@", lastName);
// NSLog(@"Address = %@", email);
[selflogPersonEmails:thisPerson];
}
}
打印:
2014-07-01 16:00:48.766 cookbook7_12[534:a0b] Authorized
2014-07-01 16:00:48.774 cookbook7_12[534:a0b] First Name = First Name
2014-07-01 16:00:48.775 cookbook7_12[534:a0b] Last Name = Last Name
2014-07-01 16:00:48.776 cookbook7_12[534:a0b] Label = _$!<Home>!$_, Localized Label = home, Email = home email
2014-07-01 16:00:48.777 cookbook7_12[534:a0b] Label = _$!<Work>!$_, Localized Label = work, Email = work email
2014-07-01 16:00:48.777 cookbook7_12[534:a0b] First Name = First2
2014-07-01 16:00:48.777 cookbook7_12[534:a0b] Last Name = last2
13.5. Inserting a Person Entry into the Address Book
添加联系人
需要用到的几个接口
ABPersonCreate
ABRecordSetValue
ABAddressBookAddRecord
ABAddressBookHasUnsavedChanges
ABAddressBookSave
-(void)testAddPerson
{
CFErrorRef error = NULL;
switch (ABAddressBookGetAuthorizationStatus()){
casekABAuthorizationStatusAuthorized:{
NSLog(@"Authorized");
addressBook =ABAddressBookCreateWithOptions(NULL, &error);
// [self useAddressBook:addressBook];
// [self readFromAddressBook:addressBook];
// [self readFromAddressBook2:addressBook];
[selfnewPersonWithFirstName:@"newFirst"lastName:@"newLast"inAddressBook:addressBook];
if (addressBook != NULL){
CFRelease(addressBook);
}
break;
}
default:{
NSLog(@"not Authorized");
}
}
}
- (ABRecordRef) newPersonWithFirstName:(NSString *)paramFirstName
lastName:(NSString *)paramLastName
inAddressBook:(ABAddressBookRef)paramAddressBook{
ABRecordRef result = NULL;
if (paramAddressBook == NULL){
NSLog(@"The address book is NULL.");
return NULL;
}
if ([paramFirstName length] == 0 &&
[paramLastNamelength] == 0){
NSLog(@"First name and last name are both empty.");
return NULL;
}
result = ABPersonCreate();
if (result == NULL){
NSLog(@"Failed to create a new person.");
return NULL;
}
BOOL couldSetFirstName = NO;
BOOL couldSetLastName = NO;
CFErrorRef setFirstNameError = NULL;
CFErrorRef setLastNameError = NULL;
couldSetFirstName =ABRecordSetValue(result,
kABPersonFirstNameProperty,
(__bridgeCFTypeRef)paramFirstName,
&setFirstNameError);
couldSetLastName =ABRecordSetValue(result,
kABPersonLastNameProperty,
(__bridgeCFTypeRef)paramLastName,
&setLastNameError);
CFErrorRef couldAddPersonError = NULL;
BOOL couldAddPerson = ABAddressBookAddRecord(paramAddressBook,
result,
&couldAddPersonError);
if (couldAddPerson){
NSLog(@"Successfully added the person.");
} else {
NSLog(@"Failed to add the person.");
CFRelease(result);
result = NULL;
return result;
}
if (ABAddressBookHasUnsavedChanges(paramAddressBook)){
CFErrorRef couldSaveAddressBookError = NULL;
BOOL couldSaveAddressBook = ABAddressBookSave(paramAddressBook, &couldSaveAddressBookError);
if (couldSaveAddressBook){
NSLog(@"Successfully saved the address book.");
} else {
NSLog(@"Failed to save the address book.");
}
}
if (couldSetFirstName &&couldSetLastName){
NSLog(@"Successfully set the first name and the last name of the person.");
} else {
NSLog(@"Failed to set the first name and/or last name of the person.");
}
return result;
}
打印:
2014-07-01 17:48:55.778 cookbook7_12[659:a0b] Authorized
2014-07-01 17:48:55.786 cookbook7_12[659:a0b] Successfully added the person.
2014-07-01 17:48:55.809 cookbook7_12[659:a0b] Successfully saved the address book.
2014-07-01 17:48:55.809 cookbook7_12[659:a0b] Successfully set the first name and the last name of the person.
2014-07-01 17:50:35.191 cookbook7_12[659:a0b] Authorized
2014-07-01 17:50:35.197 cookbook7_12[659:a0b] Successfully added the person.
2014-07-01 17:50:35.209 cookbook7_12[659:a0b] Successfully saved the address book.
2014-07-01 17:50:35.209 cookbook7_12[659:a0b] Successfully set the first name and the last name of the person.
2014-07-01 17:50:44.360 cookbook7_12[659:a0b] Authorized
2014-07-01 17:50:44.366 cookbook7_12[659:a0b] Successfully added the person.
2014-07-01 17:50:44.377 cookbook7_12[659:a0b] Successfully saved the address book.
2014-07-01 17:50:44.377 cookbook7_12[659:a0b] Successfully set the first name and the last name of the person.
回到通讯录,可以看到刚才添加的3个联系人,他们的名称都是一样的,你懂的
13.6. Inserting a Group Entry into the Address Book
Core Foundation 的内存管理比较复杂,所以用staticanalyzer的话,或产生很多的warning.不过你可以忽略他们,而用Instrument来检查有没有内存泄露。但是我还是强烈建议你去熟悉Core Foundation的内存管理,你可以去读读苹果官方文档“Memory Management Programming Guide for Core Foundation”
新增同名组时,将会新增组,但新增的组没有组成员(不过在下一节的测试中发现没这问题也)
几个接口
ABGroupCreate
ABRecordSetValue kABGroupNameProperty
ABAddressBookAddRecord
ABAddressBookHasUnsavedChanges
ABAddressBookSave
-(void)testNewGroup
{
CFErrorRef error = NULL;
addressBook =ABAddressBookCreateWithOptions(NULL, &error);
[selfcreateNewGroupInAddressBook:addressBook];
}
- (void) createNewGroupInAddressBook:(ABAddressBookRef)paramAddressBook{
ABRecordRef personalCoachesGroup =[selfnewGroupWithName:@"Personal Coaches"inAddressBook:paramAddressBook];
if (personalCoachesGroup != NULL){
NSLog(@"Successfully created the group.");
CFRelease(personalCoachesGroup);
} else {
NSLog(@"Could not create the group.");
}
}
- (ABRecordRef) newGroupWithName:(NSString *)paramGroupName inAddressBook:(ABAddressBookRef)paramAddressBook{
ABRecordRef result = NULL;
if (paramAddressBook == NULL){
NSLog(@"The address book is nil.");
return NULL;
}
result = ABGroupCreate();
if (result == NULL){
NSLog(@"Failed to create a new group.");
return NULL;
}
BOOL couldSetGroupName = NO;
CFErrorRef error = NULL;
couldSetGroupName =ABRecordSetValue(result,
kABGroupNameProperty,
(__bridgeCFTypeRef)paramGroupName,
&error);
if (couldSetGroupName){
BOOL couldAddRecord = NO;
CFErrorRef couldAddRecordError = NULL;
couldAddRecord =ABAddressBookAddRecord(paramAddressBook,
result,
&couldAddRecordError);
if (couldAddRecord){
NSLog(@"Successfully added the new group.");
if (ABAddressBookHasUnsavedChanges(paramAddressBook)){
BOOL couldSaveAddressBook = NO;
CFErrorRef couldSaveAddressBookError = NULL;
couldSaveAddressBook =ABAddressBookSave(paramAddressBook,&couldSaveAddressBookError);
if (couldSaveAddressBook){
NSLog(@"Successfully saved the address book.");
}else {
CFRelease(result);
result = NULL;
NSLog(@"Failed to save the address book.");
}
} else {
CFRelease(result);
result = NULL;
NSLog(@"No unsaved changes.");
}
} else {
CFRelease(result);
result = NULL;
NSLog(@"Could not add a new group.");
}
} else {
CFRelease(result);
result = NULL;
NSLog(@"Failed to set the name of the group.");
}
return result;
}
打印:
2014-07-02 10:47:05.775 cookbook7_12[418:a0b] Successfully added the new group.
2014-07-02 10:47:05.778 cookbook7_12[418:a0b] Successfully saved the address book.
2014-07-02 10:47:05.779 cookbook7_12[418:a0b] Successfully created the group.
13.7. Adding Persons to Groups
添加组成员
新增成员和新增组的方法实现请在前面的节中找
几个接口
ABGroupAddMember
ABAddressBookHasUnsavedChanges
ABAddressBookSave
-(void)testAddPersonAndGroupsToAddressBook
{
CFErrorRef error = NULL;
addressBook =ABAddressBookCreateWithOptions(NULL, &error);
[selfaddPersonsAndGroupsToAddressBook:addressBook];
}
- (BOOL) addPerson:(ABRecordRef)paramPerson toGroup:(ABRecordRef)paramGroup
saveToAddressBook:(ABAddressBookRef)paramAddressBook{
BOOL result = NO;
if (paramPerson == NULL ||
paramGroup ==NULL ||
paramAddressBook ==NULL){
NSLog(@"Invalid parameters are given.");
return NO;
}
CFErrorRef error = NULL;
/* Now attempt to add the person entry to the group */
result = ABGroupAddMember(paramGroup,
paramPerson,
&error);
if (result == NO){
NSLog(@"Could not add the person to the group.");
return result;
}
/* Make sure we save any unsaved changes */
if (ABAddressBookHasUnsavedChanges(paramAddressBook)){
BOOL couldSaveAddressBook = NO;
CFErrorRef couldSaveAddressBookError = NULL;
couldSaveAddressBook =ABAddressBookSave(paramAddressBook,&couldSaveAddressBookError);
if (couldSaveAddressBook){
NSLog(@"Successfully added the person to the group.");
result =YES;
} else {
NSLog(@"Failed to save the address book.");
}
} else {
NSLog(@"No changes were saved.");
}
return result;
}
- (void)addPersonsAndGroupsToAddressBook:(ABAddressBookRef)paramAddressBook{
ABRecordRef richardBranson = [selfnewPersonWithFirstName:@"Richard"
lastName:@"Branson"
inAddressBook:paramAddressBook];
if (richardBranson !=NULL){
ABRecordRef entrepreneursGroup = [selfnewGroupWithName:@"Entrepreneurs"
inAddressBook:paramAddressBook];
if (entrepreneursGroup !=NULL){
if ([self addPerson:richardBranson toGroup:entrepreneursGroup
saveToAddressBook:paramAddressBook]){
NSLog(@"Successfully added Richard Branson \
to the Entrepreneurs Group");
} else {
NSLog(@"Failed to add Richard Branson to the \
Entrepreneurs group.");
}
CFRelease(entrepreneursGroup);
} else {
NSLog(@"Failed to create the Entrepreneurs group.");
}
CFRelease(richardBranson);
} else {
NSLog(@"Failed to create an entity for Richard Branson.");
}
}
打印:
2014-07-02 11:10:42.639 cookbook7_12[447:a0b] Successfully added the person.
2014-07-02 11:10:42.734 cookbook7_12[447:a0b] Successfully saved the address book.
2014-07-02 11:10:42.735 cookbook7_12[447:a0b] Successfully set the first name and the last name of the person.
2014-07-02 11:10:42.735 cookbook7_12[447:a0b] Successfully added the new group.
2014-07-02 11:10:42.737 cookbook7_12[447:a0b] Successfully saved the address book.
2014-07-02 11:10:42.739 cookbook7_12[447:a0b] Successfully added the person to the group.
2014-07-02 11:10:42.739 cookbook7_12[447:a0b] Successfully added Richard Branson to the Entrepreneurs Group
2014-07-02 11:11:24.650 cookbook7_12[447:a0b] Successfully added the person.
2014-07-02 11:11:24.660 cookbook7_12[447:a0b] Successfully saved the address book.
2014-07-02 11:11:24.661 cookbook7_12[447:a0b] Successfully set the first name and the last name of the person.
2014-07-02 11:11:24.661 cookbook7_12[447:a0b] Successfully added the new group.
2014-07-02 11:11:24.663 cookbook7_12[447:a0b] Successfully saved the address book.
2014-07-02 11:11:24.665 cookbook7_12[447:a0b] Successfully added the person to the group.
2014-07-02 11:11:24.665 cookbook7_12[447:a0b] Successfully added Richard Branson to the Entrepreneurs Group
我故意增加了两次,结果发现通讯录中有两个“Entrepreneurs”组,而且两个组中都有“Richard Branson”成员
13.8. Searching the Address Book
联系人查找,找人,找组
接口:
ABAddressBookCopyArrayOfAllPeople
ABRecordCopyValue
ABAddressBookCopyPeopleWithName
-(void)testDoesExist
{
CFErrorRef error = NULL;
addressBook =ABAddressBookCreateWithOptions(NULL, &error);
if ([selfdoesPersonExistWithFirstName:@"Richard"lastName:@"Branson"inAddressBook:addressBook]) {
NSLog(@"Richard Branson is exist");
}else{
NSLog(@"Richard Branson is not exist");
}
if ([selfdoesGroupExistWithGroupName:@"Personal Coaches"inAddressBook:addressBook]) {
NSLog(@"Personal Coaches Group is exist");
}else{
NSLog(@"Personal Coaches Group is not exist");
}
if ([selfdoesPersonExistWithFullName:@"Richard Branson"inAddressBook:addressBook]) {
NSLog(@"fullName Richard Branson is exist");
}else{
NSLog(@"fullName Richard Branson is not exist");
}
if ([selfdoesPersonExistWithFullName:@"Richard"inAddressBook:addressBook]) {
NSLog(@"fullName Richard is exist");
}else{
NSLog(@"fullName Richard is not exist");
}
}
- (BOOL) doesPersonExistWithFirstName:(NSString *)paramFirstName
lastName:(NSString *)paramLastName
inAddressBook:(ABRecordRef)paramAddressBook{
BOOL result = NO;
if (paramAddressBook == NULL){
NSLog(@"The address book is null.");
return NO;
}
NSArray *allPeople = (__bridge_transferNSArray *)ABAddressBookCopyArrayOfAllPeople(paramAddressBook);
NSUInteger peopleCounter = 0;
for (peopleCounter = 0; peopleCounter < [allPeoplecount];peopleCounter++){
ABRecordRef person = (__bridge ABRecordRef)[allPeople objectAtIndex:peopleCounter];
NSString *firstName = (__bridge_transferNSString *)ABRecordCopyValue(person,kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transferNSString *)ABRecordCopyValue(person,kABPersonLastNameProperty);
BOOL firstNameIsEqual = NO;
BOOL lastNameIsEqual = NO;
if ([firstName length] == 0 && [paramFirstName length] == 0){
firstNameIsEqual =YES;
}
else if ([firstName isEqualToString:paramFirstName]){
firstNameIsEqual =YES;
}
if ([lastName length] == 0 && [paramLastName length] == 0){
lastNameIsEqual =YES;
}
else if ([lastName isEqualToString:paramLastName]){
lastNameIsEqual =YES;
}
if (firstNameIsEqual && lastNameIsEqual){
return YES;
}
}
return result;
}
- (BOOL) doesGroupExistWithGroupName:(NSString *)paramGroupName
inAddressBook:(ABAddressBookRef)paramAddressBook{
BOOL result = NO;
if (paramAddressBook == NULL){
NSLog(@"The address book is null.");
return NO;
}
NSArray *allGroups = (__bridge_transferNSArray *)ABAddressBookCopyArrayOfAllGroups(paramAddressBook);
NSUInteger groupCounter = 0;
for (groupCounter = 0;groupCounter < [allGroupscount];groupCounter++){
ABRecordRef group = (__bridge ABRecordRef)[allGroups objectAtIndex:groupCounter];
NSString *groupName = (__bridge_transferNSString *)ABRecordCopyValue(group,kABGroupNameProperty);
if ([groupName length] == 0 && [paramGroupName length] == 0){
return YES;
}
else if ([groupName isEqualToString:paramGroupName]){
return YES;
}
}
return result;
}
//此函数你不必真的用全名称,只给一部分就行,会匹配出包含这个名称的所有名称
- (BOOL) doesPersonExistWithFullName:(NSString *)paramFullName
inAddressBook:(ABAddressBookRef)paramAddressBook{
BOOL result = NO;
if (paramAddressBook == NULL){
NSLog(@"Address book is null.");
return NO;
}
NSArray *allPeopleWithThisName = (__bridge_transferNSArray *)ABAddressBookCopyPeopleWithName(paramAddressBook,(__bridgeCFStringRef)paramFullName);
if ([allPeopleWithThisName count] > 0){
result = YES;
}
return result;
}
打印:
2014-07-02 12:11:21.292 cookbook7_12[534:a0b] Richard Branson is exist
2014-07-02 12:11:21.292 cookbook7_12[534:a0b] Personal Coaches Group is exist
2014-07-02 12:11:21.294 cookbook7_12[534:a0b] fullName Richard Branson is exist
2014-07-02 12:11:21.295 cookbook7_12[534:a0b] fullName Richard is exist
13.9. Retrieving and Setting a Person’s Address Book Image
检索和设置联系人图片
几个接口
ABPersonHasImageData
ABPersonCopyImageData
ABPersonSetImageData
-(void)testPersonImageSet
{
CFErrorRef error = NULL;
addressBook =ABAddressBookCreateWithOptions(NULL, &error);
NSArray * allPeopleWithThisName = (__bridge_transferNSArray*)ABAddressBookCopyPeopleWithName(addressBook, (__bridgeCFStringRef)@"Richard");
if ([allPeopleWithThisName count] > 0) {
NSLog(@"people count with Richard = %d",[allPeopleWithThisNamecount]);
ABRecordRef person = (__bridge ABRecordRef)[allPeopleWithThisName objectAtIndex:0];
UIImage * img = [UIImage imageNamed:@"test.jpeg"];
NSData * data = UIImageJPEGRepresentation(img,1);
[selfsetPersonImage:person inAddressBook:addressBookwithImageData:data];
self.aImageView.image = [selfgetPersonImage:person];
}else{
NSLog(@"does not found people with this name");
}
}
- (UIImage *) getPersonImage:(ABRecordRef)paramPerson{
UIImage *result = nil;
if (paramPerson == NULL){
NSLog(@"The person is nil.");
return NULL;
}
NSData *imageData = (__bridge_transfer NSData *)ABPersonCopyImageData(paramPerson);
if (imageData != nil){
UIImage *image = [UIImage imageWithData:imageData];
result = image;
}
return result;
}
- (BOOL) setPersonImage:(ABRecordRef)paramPerson inAddressBook:(ABAddressBookRef)paramAddressBook withImageData:(NSData *)paramImageData{
BOOL result = NO;
if (paramAddressBook == NULL){
NSLog(@"The address book is nil.");
return NO;
}
if (paramPerson == NULL){
NSLog(@"The person is nil.");
return NO;
}
CFErrorRef couldSetPersonImageError = NULL;
BOOL couldSetPersonImage = ABPersonSetImageData(paramPerson,
(__bridgeCFDataRef)paramImageData,
&couldSetPersonImageError);
if (couldSetPersonImage){
NSLog(@"Successfully set the person's image. Saving...");
if (ABAddressBookHasUnsavedChanges(paramAddressBook)){
BOOL couldSaveAddressBook = NO;
CFErrorRef couldSaveAddressBookError = NULL;
couldSaveAddressBook =ABAddressBookSave(paramAddressBook,&couldSaveAddressBookError);
if (couldSaveAddressBook){
NSLog(@"Successfully saved the address book.");
result =YES;
} else {
NSLog(@"Failed to save the address book.");
}
} else {
NSLog(@"There are no changes to be saved!");
}
} else {
NSLog(@"Failed to set the person's image.");
}
return result;
}
打印:
2014-07-02 14:09:52.952 cookbook7_12[408:a0b] people count with Richard = 2
2014-07-02 14:09:52.994 cookbook7_12[408:a0b] Successfully set the person's image. Saving...
2014-07-02 14:09:52.998 cookbook7_12[408:a0b] Successfully saved the address book.
通过contacts也看到第一个Richard联系人的头像被设置成功了