我的应用使用地址簿框架。要显示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);
}
}
}
答案 0 :(得分:1)
我的经验是:当您在设备上安装应用时,它会要求您允许或不允许某些内容。如果您将其删除并再次安装,则不会再次询问您。例如,应用程序想知道您启用或禁用推送消息。如果您说:是,我启用,然后您从设备中删除该应用程序,再次下载后,安装它将不会再次询问您。它会自动出现在您的设置中。地址簿可以工作相同,但我不确定。 GPS不一样,应用程序要求您使用evertime来启用位置。