获取 ios 申请中的所有 iphone 联系人 iOS 7
get all iphone Contact in ios Application with iOS 7
我正在开发一个应用程序,我想在其中从我的 iphone 中获取所有联系人,包括详细信息(名字、姓氏、电子邮件和手机号码)。应用程序的部署目标是 iOS 7 及更高版本。
我试过下面的代码,但它根本不起作用。
My code is here
__block NSMutableArray *myContacts = [[NSMutableArray alloc]init];
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
__block BOOL userDidGrantAddressBookAccess;
CFErrorRef addressBookError = NULL;
if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined ||
ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized )
{
addressBook = ABAddressBookCreateWithOptions(NULL, &addressBookError);
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
{
userDidGrantAddressBookAccess = granted;
dispatch_semaphore_signal(sema);
if (addressBook!=nil)
{
NSArray *allContacts = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSUInteger i = 0;
for (i = 0; i<[allContacts count]; i++)
{
ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
NSString *firstName = (__bridge_transfer NSString*)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
[myContacts addObject:firstName];
}
CFRelease(addressBook);
}
else
{
NSLog(@"Error");
}
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else
{
if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied ||
ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted )
{
NSLog(@"denied");
// Display an error.
}
}
NSLog(@"%@", myContacts);
您的代码几乎完全正确。您只需在地址簿请求的完成块中打印出 myContacts
数组。
我已经为您做了一些代码更改:
__block NSMutableArray *myContacts = [[NSMutableArray alloc]init];
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
__block BOOL userDidGrantAddressBookAccess;
CFErrorRef addressBookError = NULL;
if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined ||
ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized )
{
addressBook = ABAddressBookCreateWithOptions(NULL, &addressBookError);
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
userDidGrantAddressBookAccess = granted;
dispatch_semaphore_signal(sema);
if (addressBook!=nil)
{
NSArray *allContacts = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSUInteger i = 0;
for (i = 0; i<[allContacts count]; i++)
{
ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
NSString *firstName = (__bridge_transfer NSString*)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
// you need to do a nil check before adding a firstName to the array
//
// some contacts won't have first names, after all
if([firstName length] > 0)
{
[myContacts addObject:firstName];
}
}
CFRelease(addressBook);
}
else
{
NSLog(@"Error");
}
// *** HERE is where to print out the myContacts array***
NSLog(@"addresses are %@", myContacts);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else
{
if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied ||
ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted )
{
NSLog(@"denied");
// Display an error.
}
}
// don't NSLog here, as myContacts array likey won't be filled out here...
// print it out in the completion block instead
// NSLog(@"%@", myContacts);
B.T.W.,如果您的代码仅在 iOS 9 和更新版本上 运行,请考虑改用 CNContactStore,因为地址簿 API 是已弃用,最终可能会从 iOS.
中删除
我正在开发一个应用程序,我想在其中从我的 iphone 中获取所有联系人,包括详细信息(名字、姓氏、电子邮件和手机号码)。应用程序的部署目标是 iOS 7 及更高版本。
我试过下面的代码,但它根本不起作用。
My code is here
__block NSMutableArray *myContacts = [[NSMutableArray alloc]init];
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
__block BOOL userDidGrantAddressBookAccess;
CFErrorRef addressBookError = NULL;
if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined ||
ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized )
{
addressBook = ABAddressBookCreateWithOptions(NULL, &addressBookError);
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
{
userDidGrantAddressBookAccess = granted;
dispatch_semaphore_signal(sema);
if (addressBook!=nil)
{
NSArray *allContacts = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSUInteger i = 0;
for (i = 0; i<[allContacts count]; i++)
{
ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
NSString *firstName = (__bridge_transfer NSString*)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
[myContacts addObject:firstName];
}
CFRelease(addressBook);
}
else
{
NSLog(@"Error");
}
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else
{
if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied ||
ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted )
{
NSLog(@"denied");
// Display an error.
}
}
NSLog(@"%@", myContacts);
您的代码几乎完全正确。您只需在地址簿请求的完成块中打印出 myContacts
数组。
我已经为您做了一些代码更改:
__block NSMutableArray *myContacts = [[NSMutableArray alloc]init];
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
__block BOOL userDidGrantAddressBookAccess;
CFErrorRef addressBookError = NULL;
if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined ||
ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized )
{
addressBook = ABAddressBookCreateWithOptions(NULL, &addressBookError);
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
userDidGrantAddressBookAccess = granted;
dispatch_semaphore_signal(sema);
if (addressBook!=nil)
{
NSArray *allContacts = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSUInteger i = 0;
for (i = 0; i<[allContacts count]; i++)
{
ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
NSString *firstName = (__bridge_transfer NSString*)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
// you need to do a nil check before adding a firstName to the array
//
// some contacts won't have first names, after all
if([firstName length] > 0)
{
[myContacts addObject:firstName];
}
}
CFRelease(addressBook);
}
else
{
NSLog(@"Error");
}
// *** HERE is where to print out the myContacts array***
NSLog(@"addresses are %@", myContacts);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else
{
if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied ||
ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted )
{
NSLog(@"denied");
// Display an error.
}
}
// don't NSLog here, as myContacts array likey won't be filled out here...
// print it out in the completion block instead
// NSLog(@"%@", myContacts);
B.T.W.,如果您的代码仅在 iOS 9 和更新版本上 运行,请考虑改用 CNContactStore,因为地址簿 API 是已弃用,最终可能会从 iOS.
中删除