Не удается получить доступ к источникам контактов на устройстве в iOS 6 - программирование
Подтвердить что ты не робот

Не удается получить доступ к источникам контактов на устройстве в 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 =()

4b9b3361

Ответ 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
    }
}

Надеюсь, это поможет!