13.0~13.9联系人通讯录相关操作

13.0. IntroductionAddress 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联系人的头像被设置成功了




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值