5

我遇到了 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 值意味着什么的文档。我假设这是某种错误,但是什么?

4

1 回答 1

3

在 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,您需要正确检查是否存在新方法。

于 2012-11-14T02:19:22.257 回答