ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { ... });CFArrayRef groups = ABAddressBookCopyArrayOfAllGroups(addressBook);for (id group in (__bridge NSArray *)groups) {
CFArrayRef members = ABGroupCopyArrayOfAllMembers((__bridge ABRecordRef)group);
for (id person in (__bridge NSArray *)members) {
NSString *name = (__bridge_transfer NSString *)ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonFirstNameProperty);
// 同理獲取電話、郵箱等...
}
CFRelease(members);
}
CFRelease(groups);
CFRelease(addressBook);
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError *error) {
if (granted) {
NSArray *containers = [store containersMatchingPredicate:nil error:nil];
for (CNContainer *container in containers) {
NSPredicate *pred = [CNContact predicateForContactsInContainerWithIdentifier:container.identifier];
NSArray *contacts = [store unifiedContactsMatchingPredicate:pred keysToFetch:@[CNContactGivenNameKey, CNContactPhoneNumbersKey] error:nil];
// 處理 contacts...
}
}
}];
新項目直接使用 Contacts.framework,API 更現代(Swift 友好)、權限機制完善、支持鍵值觀察和批量操作。