ABAddressBookCopyArrayOfAllPeople 不返回任何人
ABAddressBookCopyArrayOfAllPeople Not returning any People
我开始使用 ABAddress Book 并使用一个非常简单的起点...我想获取我的地址簿中的所有条目并将其放入一个数组中。它一直显示 0 个元素。
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
NSArray *allContacts = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
ABAddressBookCopyArrayOfAllPeople
不是真的从您的联系人列表中获取了所有人,还是我误解了什么。
管理员注意事项 我的问题与 Objective C 相关,与 SWIFT 无关,因此此答案不适用。在推荐的答案中,它解释了为什么 OP 从 Objective C 到 Swift 的代码迁移存在缺陷并且不起作用。我的问题不是。我试图理解为什么当我在我的 iPhone 上安装它时,它有数百个联系人 allContacts
却没有任何项目。我试图了解将所有联系人放入数组的正确方法。主要是因为业务需要,我正在做自己的联系人选择器,因为我不想使用 Apple 的内置联系人选择器。
首先,您正在尝试使用已弃用的 API。这可能就是 ABAddressBookCreateWithOptions 不起作用的原因。
但是,根据您的编辑(您说要构建自己的 UI),我的建议是使用 Contacts framework。
#import <Contacts/Contacts.h>
@implementation ContactsScan
- (void) contactScan
{
if ([CNContactStore class]) {
//ios9 or later
CNEntityType entityType = CNEntityTypeContacts;
if( [CNContactStore authorizationStatusForEntityType:entityType] == CNAuthorizationStatusNotDetermined)
{
CNContactStore * contactStore = [[CNContactStore alloc] init];
[contactStore requestAccessForEntityType:entityType completionHandler:^(BOOL granted, NSError * _Nullable error) {
if(granted){
[self getAllContact];
}
}];
}
else if( [CNContactStore authorizationStatusForEntityType:entityType]== CNAuthorizationStatusAuthorized)
{
[self getAllContact];
}
}
}
-(void)getAllContact
{
if([CNContactStore class])
{
//iOS 9 or later
NSError* contactError;
CNContactStore* addressBook = [[CNContactStore alloc]init];
[addressBook containersMatchingPredicate:[CNContainer predicateForContainersWithIdentifiers: @[addressBook.defaultContainerIdentifier]] error:&contactError];
NSArray * keysToFetch =@[CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey];
CNContactFetchRequest * request = [[CNContactFetchRequest alloc]initWithKeysToFetch:keysToFetch];
BOOL success = [addressBook enumerateContactsWithFetchRequest:request error:&contactError usingBlock:^(CNContact * __nonnull contact, BOOL * __nonnull stop){
[self parseContactWithContact:contact];
}];
}
}
- (void)parseContactWithContact :(CNContact* )contact
{
NSString * firstName = contact.givenName;
NSString * lastName = contact.familyName;
NSString * phone = [[contact.phoneNumbers valueForKey:@"value"] valueForKey:@"digits"];
NSString * email = [contact.emailAddresses valueForKey:@"value"];
NSArray * addrArr = [self parseAddressWithContac:contact];
}
- (NSMutableArray *)parseAddressWithContac: (CNContact *)contact
{
NSMutableArray * addrArr = [[NSMutableArray alloc]init];
CNPostalAddressFormatter * formatter = [[CNPostalAddressFormatter alloc]init];
NSArray * addresses = (NSArray*)[contact.postalAddresses valueForKey:@"value"];
if (addresses.count > 0) {
for (CNPostalAddress* address in addresses) {
[addrArr addObject:[formatter stringFromPostalAddress:address]];
}
}
return addrArr;
}
@end
注意:这段代码不是我写的。可以在 github.
上找到源代码
我开始使用 ABAddress Book 并使用一个非常简单的起点...我想获取我的地址簿中的所有条目并将其放入一个数组中。它一直显示 0 个元素。
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
NSArray *allContacts = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
ABAddressBookCopyArrayOfAllPeople
不是真的从您的联系人列表中获取了所有人,还是我误解了什么。
管理员注意事项 我的问题与 Objective C 相关,与 SWIFT 无关,因此此答案不适用。在推荐的答案中,它解释了为什么 OP 从 Objective C 到 Swift 的代码迁移存在缺陷并且不起作用。我的问题不是。我试图理解为什么当我在我的 iPhone 上安装它时,它有数百个联系人 allContacts
却没有任何项目。我试图了解将所有联系人放入数组的正确方法。主要是因为业务需要,我正在做自己的联系人选择器,因为我不想使用 Apple 的内置联系人选择器。
首先,您正在尝试使用已弃用的 API。这可能就是 ABAddressBookCreateWithOptions 不起作用的原因。
但是,根据您的编辑(您说要构建自己的 UI),我的建议是使用 Contacts framework。
#import <Contacts/Contacts.h>
@implementation ContactsScan
- (void) contactScan
{
if ([CNContactStore class]) {
//ios9 or later
CNEntityType entityType = CNEntityTypeContacts;
if( [CNContactStore authorizationStatusForEntityType:entityType] == CNAuthorizationStatusNotDetermined)
{
CNContactStore * contactStore = [[CNContactStore alloc] init];
[contactStore requestAccessForEntityType:entityType completionHandler:^(BOOL granted, NSError * _Nullable error) {
if(granted){
[self getAllContact];
}
}];
}
else if( [CNContactStore authorizationStatusForEntityType:entityType]== CNAuthorizationStatusAuthorized)
{
[self getAllContact];
}
}
}
-(void)getAllContact
{
if([CNContactStore class])
{
//iOS 9 or later
NSError* contactError;
CNContactStore* addressBook = [[CNContactStore alloc]init];
[addressBook containersMatchingPredicate:[CNContainer predicateForContainersWithIdentifiers: @[addressBook.defaultContainerIdentifier]] error:&contactError];
NSArray * keysToFetch =@[CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey];
CNContactFetchRequest * request = [[CNContactFetchRequest alloc]initWithKeysToFetch:keysToFetch];
BOOL success = [addressBook enumerateContactsWithFetchRequest:request error:&contactError usingBlock:^(CNContact * __nonnull contact, BOOL * __nonnull stop){
[self parseContactWithContact:contact];
}];
}
}
- (void)parseContactWithContact :(CNContact* )contact
{
NSString * firstName = contact.givenName;
NSString * lastName = contact.familyName;
NSString * phone = [[contact.phoneNumbers valueForKey:@"value"] valueForKey:@"digits"];
NSString * email = [contact.emailAddresses valueForKey:@"value"];
NSArray * addrArr = [self parseAddressWithContac:contact];
}
- (NSMutableArray *)parseAddressWithContac: (CNContact *)contact
{
NSMutableArray * addrArr = [[NSMutableArray alloc]init];
CNPostalAddressFormatter * formatter = [[CNPostalAddressFormatter alloc]init];
NSArray * addresses = (NSArray*)[contact.postalAddresses valueForKey:@"value"];
if (addresses.count > 0) {
for (CNPostalAddress* address in addresses) {
[addrArr addObject:[formatter stringFromPostalAddress:address]];
}
}
return addrArr;
}
@end
注意:这段代码不是我写的。可以在 github.
上找到源代码