iOS 读取通讯录

iOS9之前

#import <AddressBook/AddressBook.h>

// 先创建一个通讯录的对象。
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, nil);
// 从iOS6之后,读取用户通讯录需要先获得权限。
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
    // 当granted为YES时,表示用户同意访问通讯录。
    if (granted) {
        // 获取权限提醒只会在第一次使用的时候出现。
        // 获取权限之后可以在这里马上遍历通讯录,或者在其他任何地方。

        // 获取通讯录中的所有人。
         CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
         for(int i = 0; i < CFArrayGetCount(peopleArray); i++){
             // 获取第 i 个人
             ABRecordRef person = CFArrayGetValueAtIndex(peopleArray, i);
             // 用 ABRecordCopyValue 方法, 根据不同的 key 去获取通讯录中的人的属性、信息。
             // 至于属性的 key 我就不列出来了,可以去看看 ABPerson.h 。
             // 如获取 FirstName :
             NSString *personName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
             // 有些属性为一个Array, 需要再次遍历, 如获取电话号码就会有多个号码的情况:
             ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
             for (int j = 0; j < ABMultiValueGetCount(phones); j++){
                 NSString *phoneLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phones, j));
                 NSString *phoneNumber = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phones, j);
             }
         }
    }
    else {
        // 用户不同意应用访问通讯录。
    }
}

iOS9 - Contacts Framework

#import <Contacts/Contacts.h>


// 一样先要获得通讯录的权限。
// 新建一个 CNContactStore 的对象。
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts 
                completionHandler:^(BOOL granted, NSError * _Nullable error) {
    // 同样granted为YES时表示用户同意访问通讯录。
    if(granted){
        // Contacts Framework 读取的方式和数据库检索方式有点相似,需要先写一个条件去匹配提取。

// 匹配的方式有四种 :
        // + (NSPredicate *)predicateForContactsMatchingName:(NSString *)name;

        // + (NSPredicate *)predicateForContactsWithIdentifiers:(NSArray<NSString*> *)identifiers;

        // + (NSPredicate *)predicateForContactsInGroupWithIdentifier:(NSString *)groupIdentifier;

        // + (NSPredicate *)predicateForContactsInContainerWithIdentifier:(NSString *)containerIdentifier;

        // 如按名字的方式去匹配。
        NSPredicate *predicate = [CNContact predicateForContactsMatchingName:@"czbin"];
        // 根据条件去提取信息
        NSArray *contacts = [store unifiedContactsMatchingPredicate:predicate 
                                                        keysToFetch:@[CNContactGivenNameKey] 
                                                              error:nil];

        // 也可以根据一个请求(CNContactFetchRequest)去遍历通讯录中的联系人
        CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[CNContactGivenNameKey]];
        [store enumerateContactsWithFetchRequest:request 
                                           error:nil 
                                      usingBlock:^(CNContact *contact, BOOL *stop) {
            // 每一个 CNContact 对象就是一个联系人
            NSLog(@"%@",contact);
        }];
    }
}];

// 其中提取信息时的 keysToFetch 为指定需要提取联系人的信息。
// 有以下的值 :
            // CNContactIdentifierKey           
            // CNContactNamePrefixKey           
            // CNContactGivenNameKey            
            // CNContactMiddleNameKey           
            // CNContactFamilyNameKey           
            // CNContactPreviousFamilyNameKey   
            // CNContactNameSuffixKey           
            // CNContactNicknameKey             
            // CNContactPhoneticGivenNameKey    
            // CNContactPhoneticMiddleNameKey   
            // CNContactPhoneticFamilyNameKey   
            // CNContactOrganizationNameKey     
            // CNContactDepartmentNameKey       
            // CNContactBirthdayKey             
            // CNContactNonGregorianBirthdayKey 
            // CNContactNoteKey                 
            // CNContactImageDataKey
            // CNContactThumbnailImageDataKey   
            // CNContactImageDataAvailableKey
            // CNContactTypeKey                    
            // CNContactPhoneNumbersKey            
            // CNContactEmailAddressesKey          
            // CNContactPostalAddressesKey         
            // CNContactDatesKey                   
            // CNContactUrlAddressesKey            
            // CNContactRelationsKey               
            // CNContactSocialProfilesKey          
            // CNContactInstantMessageAddressesKey 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章