Не удается получить доступ к источникам контактов на устройстве в iOS 6
Этот код работал нормально на iOS 5.1, а также работает в симуляторе iPhone с iOS 6. Он не работает на моем iPhone 4 под управлением iOS 6. В результате я не могу добавить человека в приложение "Контакты". Ни один из следующих фрагментов кода не работает (журнал следует за каждым):
ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(_addressBook);
NSLog(@"2 - defaultSource = %@", defaultSource);
AB: Не удалось скомпилировать оператор для запроса (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties):
SELECT ROWID, Name, ExternalIdentifier, Type, ConstraintsPath, ExternalModificationTag, ExternalSyncTag, AccountID, Enabled, SyncData, MeIdentifier, Возможности 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 = операция не может быть завершена. (Ошибка ABAddressBookErrorDomain 1.)
Я думал, что могу получить все источники, а затем выбрать один, но следующее возвращается вообще:
CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources (_addressBook);
NSLog(@"2 - allSources = %@", allSources);
AB: Не удалось скомпилировать оператор для запроса (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties):
SELECT ROWID, Name, ExternalIdentifier, Type, ConstraintsPath, ExternalModificationTag, ExternalSyncTag, AccountID, Enabled, SyncData, MeIdentifier, Возможности FROM ABStore WHERE Enabled =?;
2012-09-24 10: 58: 09.908 QR vCard [177: 907] 2 - allSources =()
Ответы
Ответ 1
У меня была такая же проблема, и я не смог получить всплывающее сообщение "Разрешить доступ к контактам".
Ответ был отправлен Кайлом здесь:
fooobar.com/questions/21771/...
// 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
}
Ответ 2
Это сообщение журнала является признаком того, что вашему приложению нет (возможно, еще нет) доступа к Контакты. iOS 6 дает пользователям возможность запретить приложениям доступ к адресной книге.
Сообщение исчезает после того, как пользователь разрешил вашему приложению доступ к контактам - либо через всплывающее диалоговое окно, либо выбрав Настройки → Конфиденциальность → Контакты.
Дополнительные сведения по этой теме см. в разделе WWDC 2012 года 710 "Поддержка конфиденциальности в iOS и OS X".
Ответ 3
Если вы попали сюда из Google и используете новую инфраструктуру CNContactStore
iOS и получаете эти ошибки, прочитайте:
Я думал, что было бы чище сделать мою 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
}
}
Надеюсь, это поможет!