0

我有一个视图控制器,我试图在 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。

4

3 回答 3

2

我终于想通了。删除应用程序和“所有数据”是您的 iPhone 提供的误导性对话。关于使用隐私设置进行测试,您必须转到设置 > 常规 > 重置 > 重置位置和隐私。通过这样做,您将获得一个真正“新鲜”的环境,允许您测试您的“隐私访问”代码。请记住,这将删除您为您使用的所有其他应用程序设置的位置和隐私设置。

于 2014-03-11T18:14:44.617 回答
2

我在你的代码中看到的一个错误是你有这个:

if (ABAddressBookRequestAccessWithCompletion != NULL) {

这应该是:

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {

您的原始代码的问题在于ABAddressBookRequestAccessWithCompletion它不是任何东西:它需要参数,就像您稍后在同一if语句中使用的那样。我很惊讶你没有从 Xcode 中得到错误。ABAddressBookGetAuthorizationStatus是 iOS 6 中的新功能。

此外,您应该在获得许可创建地址簿参考,而不是之前。

也有可能是因为该应用程序在某个时候在您的 iPhone 上,它会记住您已授予该应用程序使用您的联系人的权限。在 iOS 模拟器中,有一个重置内容和设置选项。这会使模拟器忘记您为应用提供的任何权限设置。我发现您不太可能想重置您的 iPhone,对吗?

于 2014-03-10T00:26:49.980 回答
0

使用此代码......

if (ABAddressBookGetAuthorizationStatus == ABAuthorizationStatusNotDetermined){

代替.....

 if (ABAddressBookRequestAccessWithCompletion != NULL) {
于 2014-03-10T05:34:07.380 回答