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

这个代码在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.)


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

 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 =?

QRvCard [177:907] 2 – allSources =()

我有同样的问题,我无法获得允许访问联系人警报popup。

答案由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 } 

此日志消息表明您的应用程序不(可能尚未)被允许访问联系人。 iOS 6使用户有可能拒绝应用程序访问地址簿的权限。

一旦用户允许您的应用程序访问联系人 – 通过popup对话框,或转到设置 – >隐私 – >联系人,该消息将消失。

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

如果你是从Google那里得到的,而且你正在使用iOS的新的CNContactStore框架,并且得到这些错误,请阅读:

我认为把CNContactStore变成一个用类实例初始化的成员variables会更简洁:

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

我打了五十次这个电话后,就开始误会了

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

我尝试限制我的电话,但这并没有帮助。 事实certificate,为每个调用实例化一个新的CNContactStore没有任何性能影响,并完全解决了我的问题:

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

希望这可以帮助!