【问题标题】:ABAddressBookGetPersonCount returns -1 in iOSABAddressBookGetPersonCount 在 iOS 中返回 -1
【发布时间】:2012-11-14 02:01:30
【问题描述】:

我遇到了 ABAddressBookGetPersonCount 返回 -1 的情况。测试人员向我保证通讯录中确实存在联系人。所有手机均运行 iOS 6.0.1。

代码如下:

NSMutableDictionary *myAddressBook = [[NSMutableDictionary alloc] init];
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef people  = ABAddressBookCopyArrayOfAllPeople(addressBook);
int numEntries = ABAddressBookGetPersonCount(addressBook);
if (numEntries == 0)
{
    NSString *title = NSLocalizedString(@"error", nil);
    NSString *description =  NSLocalizedString(@"error_empty_contacts", nil);
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
                                                    message:description
                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];


    return;
}

NSLog(@"emails: found %d", numEntries);

我无法在我的任何手机上重现这一点,但测试人员已经在 3 部手机上进行了测试。它在 iPhone 5 上正常工作,但在 iPhone 4 或 3 上无法正常工作;

我找不到任何说明 -1 值意味着什么的文档。我假设这是某种错误,但是什么?

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    在 iOS 6 下,此代码无效。您必须验证您的应用是否有权访问通讯录。最有可能的是,-1 表示应用在这些设备上没有权限(或未知权限状态)。

    来自ABAddressBookRequestAccessCompletionHandler 的文档:

    CFErrorRef myError = NULL;
    ABAddressBookRef myAddressBook = ABAddressBookCreateWithOptions(NULL, &myError);
    APLViewController * __weak weakSelf = self;  // avoid capturing self in the block
    ABAddressBookRequestAccessWithCompletion(myAddressBook,
      ^(bool granted, CFErrorRef error) {
        if (granted) {
            NSArray *theSmiths = CFBridgingRelease(
              ABAddressBookCopyPeopleWithName(myAddressBook,
                CFSTR("Smith")
              )
            );
            weakSelf.numberOfSmiths = [theSmiths count];
        } else {
            // Handle the error
        }
    });
    CFRelease(myAddressBook);
    

    如果您需要支持 iOS 5.x 或 4.x,您需要正确检查是否存在新方法。

    【讨论】:

    • 在 iOS 6 中,如果用户在应用首次启动时尚未点击隐私提示上的选项,我也会得到 -1。在这种情况下,ABAddressBookCreateWithOptions 返回一个有效的通讯录,但 ABAddressBookGetPersonCount 返回 -1。一旦用户选择允许或拒绝访问,ABAddressBookCreateWithOptions 将返回实际地址簿或 null。我正在使用 -1 返回来检测用户是否已授予访问权限。
    • @Nicholas 检查的正确方法是调用ABAddressBookGetAuthorizationStatus 函数并检查其返回值。
    • 谢谢@rmaddy。我之前曾尝试过,但无法从中获得可靠的数据。现在我对它的工作原理和测试方法有了更多的了解,它似乎给了我我需要知道的东西。然而,来自 ABAddressBookGetPersonCount 的关于 -1 的答案仍然成立。很清楚,虽然没有记录,但当 ABAddressBookGetAuthorizationStatus 返回 kABAuthorizationStatusNotDetermined 时返回 -1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2012-07-23
    相关资源
    最近更新 更多