This code worked OK on iOS 5.1 and also does work in the iPhone simulator with iOS 6. It fails silently on my iPhone 4 running iOS 6. The end result is that I cannot add a per
I had the same issue and I could not get the Allow Access To Contacts alert to popup.
The Answer was posted by Kyle here: 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
}
This log message is an indication that your app is not (maybe not yet) allowed to access Contacts. iOS 6 gives users the possibility to deny apps the permission to access the address book.
The message disappears once the user has allowed your app access to Contacts - either via the pop up dialog, or by going to Settings -> Privacy -> Contacts.
For more infos on this topic, see WWDC 2012 session 710 "Privacy support in iOS and OS X".
If you got here from Google and you're using iOS's new CNContactStore
framework, and getting these errors, read on:
I thought it'd be cleaner to make my CNContactStore a member variable that was initialized with the class instance:
class foo {
var contactStore = CNContactStore()
func findByIdentifier(identifier: String) -> CNContact {
let contact = try self.contactStore.unifiedContactWithIdentifier(identifier...
return contact
}
}
After I called this about fifty times, it started erroring out with
AB: Could not compile statement for query (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties)
I tried rate-limiting my calls, but that didn't help. It turned out that instantiating a new CNContactStore for every call had zero performance ramifications and completely solved the problem for me:
class foo {
func findByIdentifier(identifier: String) -> CNContact {
let contactStore = CNContactStore()
let contact = try contactStore.unifiedContactWithIdentifier(identifier...
return contact
}
}
Hope this helps!