본문 바로가기
프로그래밍 놀이터/iOS

[iOS Study] 연락처 프로그래밍 가이드 in iOS - Direct Interacting

by 돼지왕 왕돼지 2017. 6. 20.
반응형

 [iOS Study] 연락처 프로그래밍 가이드 in iOS - Direct Interacting


https://developer.apple.com/library/ios/documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/Chapters/DirectInteraction.html


ABAddressBookAddRecord, ABAddressBookCopyArrayOfAllGroups, ABAddressBookCopyArrayOfAllPeople, ABAddressBookCopyPeopleWithName, abaddressbookcreate, ABAddressBookGetGroupCount, ABAddressBookGetGroupWithRecordID, ABAddressBookGetPersonWithRecordID, abaddressbookref, ABAddressBookRemoveRecord, ABGroupAddMember, ABGroupRemoveMember, ABMultiValueCopyValueAtIndex, ABMultiValueGetCount, ABMultiValueRef, ABPersonComparePeopleByName, ABPersonGetSortOrdering, ABPersonSortOrdering, abrecordcopyvalue, ABRecordGetRecordID, abrecordref, address book, CFArrayCreateMutableCopy, CFArrayGetCount, CFArraySortValues, CFComparatorFunction, CFRangeMake, CFRelease, confirm, direct interacting, filteredarrayusingpredicate, filtering, Group, hasprefix, ID, id 로 group 찾기, id 로 person 찾기, IOS, kABPersonPhoneProperty, kCFAllocatorDefault, Name, name 으로 person 찾기, NSArray, NSPredicate, Operation, predicateWithBlock, record, record id, record 삭제, record 추가, User, [iOS Study] 연락처 프로그래밍 가이드 in iOS - Direct Interacting, __bridge, __bridge_transfer, 연락처, 프로그래밍 가이드


-

address book 은 유저의 정보이기 떄문에 다룰 때 주의해야 한다.

보통 변경사항에 대해 user 에게 confirm 을 받는다.

group 에 대해서도 마찬가지이다.



-

record 에는 id 가 있는데, 이 id 를 오랫동안 잡고 있는 것은 정확성이 떨어질 수 있다.

그래서 이 id 와 pair 로 name 을 가지고 있어서, operation 을 하기 전에 name 을 비교하는 것이 추천된다.



-

record 의 id 를 얻으려면 ABRecordGetRecordID 함수를 사용하면 된다.

id 로 person 을 찾으려면 ABAddressBookGetPersonWithRecordID 를 사용하면 된다.

id 로 group 을 찾으려면 ABAddressBookGetGroupWithRecordID 를 사용한다.


name 으로 person 을 찾으려면 ABAddressBookCopyPeopleWithName 을 사용하면 된다.




Person Record 와 놀기

-

ABAddressBookAddRecord 와 ABAddressBookRemoveRecord 를 통해 추가하고 지울 수 있다.



-

AddressBook db 에서 person 을 찾는 것은 2가지로 가능하다.

한 가지는 이름, 두번째는 id 이다.


이름으로 찾기는 ABAddressBookCopyPeopleWithName

id 로 찾기는 ABAddressBookGetPersonWithRecordId 이다.


다른 종류의 search 는 ABAddressBookCopyArrayOfAllPeople 함수를 통해 모든 record 를 가져와서,

NSArray 의 filteredArrayUsingPredicate: 함수를 사용하여 filtering 한다.


NSArray* allContacts = /* assume this exists */ ;


// 010 으로 시작하는 번호 찾기

NSPredicate* predicate = [NSPredicate predicateWithBlock: ^(id record, NSDictionary* bindings) {

    ABMultiValueRef phoneNumbers = ABRecordCopyValue( (__bridge ABRecordRef)record, kABPersonPhoneProperty);

    BOOL result = NO;


    for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) {

        NSString* phoneNumber = (__bridge_transfer NSString*) ABMultiValueCopyValueAtIndex(phoneNumbers, i);

        if ([phoneNumber hasPrefix:@"(010)"]) {

            result = YES;

            break;

        }

    }


    CFRelease(phoneNumbers);

    return result;

}];


NSArray* filteredContacts = [allContacts filteredArrayUsingPredicate:predicate];



-

people array 를 sort 하기 위해서는 CFArraySortValues 함수를 활용한다.

ABPersonComparePeopleByName 과 ABPersonSortOrdering() 을 전달한다.


ABAddressBookRef addressBook = ABAddressBookCreate();

CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);

CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(kCFAllocatorDefault, CFArrayGetCount(people), people);


CFArraySortValues(peopleMutable, CFRangeMake(0, CFArrayGetCount(peopleMutable)), (CFComparatorFunction) ABPersonComparePeopleByName, (void*) ABPersonGetSortOrdering());


CFRelease(addressBook);

CFRelease(people);

CFRelease(peopleMutable);




Group Record 와 놀기


-

ABAddressBookGetGroupWithRecordID 를 통해 특정 그룹을 조회할 수 있다.

ABAddressBookCopyArrayOfAllGroups 를 통해 모든 그룹을 가져올 수도 있다.

ABAddressBookGetGroupCount 를 통해 모든 그룹의 수를 가져올 수 있다.



-

그룹에 사람을 추가하면 ABGroupAddMember 를 사용하고, 그룹에서 사람을 제거하려면 ABGroupRemoveMember 를 사용하면 된다.




반응형

댓글