获取所有联系人姓名的主要步骤
- 导入框架:在项目中导入
AddressBook.framework
以及 AddressBookUI.framework
(如果需要使用联系人选择界面)。
- 请求授权:在iOS 6.0及以后,需要请求用户授权才能访问联系人数据。
- 打开地址簿数据库:使用
ABAddressBookCreateWithOptions
函数获取地址簿对象。
- 获取所有联系人:通过
ABAddressBookCopyArrayOfAllPeople
函数获取所有联系人的数组。
- 遍历联系人并获取姓名:遍历数组,使用
ABRecordCopyValue
函数获取每个联系人的姓名属性。
关键代码示例
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
// 请求授权
ABAddressBookRequestAccessWithCompletion(ABAddressBookCreateWithOptions(NULL, NULL), ^(bool granted, CFErrorRef error) {
if (granted) {
// 打开地址簿数据库
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
// 获取所有联系人
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for (CFIndex i = 0; i < nPeople; i++) {
ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
// 获取联系人姓名
CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
NSString *fullName = nil;
if (firstName && lastName) {
fullName = [NSString stringWithFormat:@"%@ %@", (NSString *)firstName, (NSString *)lastName];
} else if (firstName) {
fullName = (NSString *)firstName;
} else if (lastName) {
fullName = (NSString *)lastName;
}
if (fullName) {
NSLog(@"Contact Name: %@", fullName);
}
if (firstName) CFRelease(firstName);
if (lastName) CFRelease(lastName);
}
CFRelease(allPeople);
CFRelease(addressBook);
} else {
NSLog(@"Access to address book denied.");
}
});