私のアプリは Address Book フレームワークを使用しています。iOS 6 以降ですべての連絡先を表示するには、アクセス許可を設定する必要があります。
初めてシミュレーターでアプリを実行したときに、以下のアラートが表示されましたが、もう一度表示しようとすると、アラートがもう一度表示されません。
コンテンツと設定をリセットしましたが、解決しません。そのため、アプリを再実行すると常に連絡先が表示されますが、最初はシミュレーターをリセットしたときにアプリにアラートを表示する必要があります。この問題に直面した人はいますか?
以下のコード:
- (void)getPersonOutOfAddressBook
{
if (self.tableData) {
[self.tableData removeAllObjects];
}
ABAddressBookRef addressBook = ABAddressBookCreate();
__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
accessGranted = granted;
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
}
else
{
// we're on iOS 5 or older
accessGranted = YES;
}
if (accessGranted)
{
if (addressBook != nil)
{
NSLog(@"Succesful.");
NSArray *allContacts = (__bridge_transfer NSArray
*)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSUInteger i = 0;
for (i = 0; i < [allContacts count]; i++)
{
Contact *contact = [[Contact alloc] init];
ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
NSString *firstName = (__bridge_transfer NSString
*)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transfer NSString
*)ABRecordCopyValue(contactPerson, kABPersonLastNameProperty);
NSString *fullName = [NSString stringWithFormat:@"%@ %@",
firstName, lastName];
NSData *imgData = (__bridge NSData *)ABPersonCopyImageData(contactPerson);
contact.firstName = firstName;
contact.lastName = lastName;
contact.fullName = fullName;
contact.image = [UIImage imageWithData:imgData];
[self.tableData addObject:contact];
}
CFRelease(addressBook);
}
}
}