我有一个视图控制器,我试图在 viewDidLoad 上访问用户的通讯录。当用户登陆视图控制器时,我希望弹出一个警报窗口,询问他们应用程序是否可以访问他们通讯录中的联系人,然后他们可以选择“确定”或“不允许”。
奇怪的是,我的印象是我的代码已正确设置以执行此操作。然而,每当我在我的 iPhone 上运行应用程序并访问这个视图控制器时,它甚至不会请求我的许可,而是自动访问我的联系人。我什至尝试从我的 iPhone 中删除该应用程序及其所有数据,然后在 xcode 和我的 iPhone 上重新运行。
我不确定这是否是一个小故障,因为我是开发人员,或者我的代码是否有问题。
下面是我在 viewDidLoad 中访问地址簿的代码:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//Asks for access to Address Book.
ABAddressBookRef m_addressbook = ABAddressBookCreateWithOptions(NULL, NULL);
ABAddressBookCopyArrayOfAllPeople(m_addressbook);
__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@autoreleasepool {
// Write your code here...
// Fetch data from SQLite DB
}
});
ABAddressBookRequestAccessWithCompletion(m_addressbook, ^(bool granted, CFErrorRef error)
{
accessGranted = granted;
NSLog(@"Has access been granted?: %hhd", accessGranted);
NSLog(@"Has there been an error? %@", error);
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else { // we're on iOS 5 or older
accessGranted = YES;
NSLog(@"Address book access has been granted.");
}
if (accessGranted) {
NSArray *allContacts = (__bridge_transfer NSArray
*)ABAddressBookCopyArrayOfAllPeople(m_addressbook);
然后基本上如果授予访问权限,我开始将所有姓名和电话号码加载到视图控制器的 UITableView 中。
我真的需要弄清楚为什么会这样,并且还想添加一个警报视图,询问用户是否允许访问地址簿联系人。
它实际上不是因为我的代码错误而要求访问吗?因为它知道我是开发者?就像我说的那样,我在从我的 iPhone 删除应用程序及其所有数据后运行它。
更新:如果有区别,我正在使用 iOS 7.0.4。