在iOS 6中无法访问设备上的联系人源

时间:2012-09-24 18:31:48

标签: ios addressbook

此代码在iOS 5.1上运行正常,并且在iOS 6的iPhone模拟器中也可以正常工作。它在运行iOS 6的iPhone 4上无声地失败。最终结果是我无法将人添加到“联系人”应用程序中。以下代码片段都不起作用(每个日志跟踪):

ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(_addressBook);
NSLog(@"2 - defaultSource = %@", defaultSource);

AB:无法编译查询语句(ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties): SELECT ROWID,Name,ExternalIdentifier,Type,ConstraintsPath,ExternalModificationTag,ExternalSyncTag,AccountID,Enabled,SyncData,MeIdentifier,Capabilities FROM ABStore WHERE Enabled =?;

2012-09-24 11:00:36.731 QR vCard [193:907] 2 - defaultSource =(CPRecord:0x1f59fd50 ABStore)

当我尝试将一个人添加到地址簿时,我得到了这个(似乎是因为源无效,即使从上面看起来可能没问题):

2012-09-24 11:18:32.231 QR vCard [220:907] ABAddressBookAddRecord error =操作无法完成。 (ABAddressBookErrorDomain错误1。)


我以为我可以获得所有来源然后选择一个,但以下都不会返回任何来源:

CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources (_addressBook);
NSLog(@"2 - allSources = %@", allSources);

AB:无法编译查询语句(ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties): SELECT ROWID,Name,ExternalIdentifier,Type,ConstraintsPath,ExternalModificationTag,ExternalSyncTag,AccountID,Enabled,SyncData,MeIdentifier,Capabilities FROM ABStore WHERE Enabled =?;

2012-09-24 10:58:09.908 QR vCard [177:907] 2 - allSources =()

3 个答案:

答案 0 :(得分:24)

我遇到了同样的问题,我无法弹出允许访问联系人提醒。

答案由Kyle发布: https://stackoverflow.com/a/12648938/480415

  // Request authorization to Address Book
  ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);

  if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
          // First time access has been granted, add the contact
    });
  }
  else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
        // The user has previously given access, add the contact
  }
  else {
        // The user has previously denied access
        // Send an alert telling user to change privacy setting in settings app
  }

答案 1 :(得分:3)

此日志消息表示您的应用不允许(可能尚未)访问“联系人”。 iOS 6允许用户拒绝应用程序访问通讯录的权限。

一旦用户允许您的应用访问联系人,该消息就会消失 - 通过弹出对话框或转到设置 - >隐私 - >触点。

有关此主题的更多信息,请参阅WWDC 2012会话710“iOS和OS X中的隐私支持”。

答案 2 :(得分:0)

如果您来自Google并且您正在使用iOS的新CNContactStore框架,并且遇到这些错误,请继续阅读:

我认为使CNContactStore成为使用类实例初始化的成员变量更清晰:

class foo {
    var contactStore = CNContactStore()

    func findByIdentifier(identifier: String) -> CNContact {
        let contact = try self.contactStore.unifiedContactWithIdentifier(identifier...
        return contact
    }
}

在我打了大约五十次后,它开始错误地用

  

AB:无法编译查询语句(ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties)

我尝试限制我的通话速度,但这并没有帮助。事实证明,为每次调用实例化一个新的CNContactStore没有性能分支,并完全解决了我的问题:

class foo {

    func findByIdentifier(identifier: String) -> CNContact {
        let contactStore = CNContactStore()
        let contact = try contactStore.unifiedContactWithIdentifier(identifier...
        return contact
    }
}

希望这有帮助!