要求用户访问地址簿中的联系人

时间:2014-03-09 21:35:12

标签: ios iphone objective-c abaddressbook addressbookui

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

3 个答案:

答案 0 :(得分:2)

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

if (ABAddressBookRequestAccessWithCompletion != NULL) {

这应该是:

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {

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

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

也可能因为应用程序在某个时刻出现在您的iPhone上,它会记得您允许该应用程序使用您的联系人。在iOS模拟器中,有一个“重置内容和设置”选项。这使模拟器忘记了您为应用提供的任何权限设置。我发现你不太可能想重置你的iPhone,对吗?

答案 1 :(得分:2)

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

答案 2 :(得分:0)

使用此代码.....

if (ABAddressBookGetAuthorizationStatus == ABAuthorizationStatusNotDetermined){

而不是......

 if (ABAddressBookRequestAccessWithCompletion != NULL) {