При сохранении подписки CKDatabaseSubscription появляется сообщение “Доступ к CloudKit был запрещен пользовательскими настройками”

#ios #swift #cocoa-touch #cloudkit

#iOS #swift #cocoa-touch #cloudkit

Вопрос:

Я пытаюсь настроить CloudKit CKDatabaseSubscription и пытаюсь сохранить его, я получаю следующую ошибку:

‘»Не аутентифицирован» (9/1002); «Доступ к CloudKit был запрещен пользовательскими настройками»; Повторите попытку через 3,0 секунды’

Я могу без проблем создавать записи в частной базе данных через приложение, но подписка не сохраняется.

 <snip>
       container = CKContainer(identifier: "<valid identifier>")
       publicDB = container.publicCloudDatabase
       privateDB = container.privateCloudDatabase
       createSubscriptions()
</snip>

   func createSubscriptions()
   {
     let sub = CKDatabaseSubscription(subscriptionID: "main")
     let noteInfo = CKNotificationInfo()
     noteInfo.shouldSendContentAvailable = true
     sub.notificationInfo = noteInfo

     let op = CKModifySubscriptionsOperation(subscriptionsToSave: [sub], subscriptionIDsToDelete: nil)
     op.qualityOfService = .utility
     op.modifySubscriptionsCompletionBlock = {(subscriptions, name, error) in
                print ("error-(error)")
            }
     privateDB.add(op)
   }
  

Итак, в приведенном выше коде вышеуказанная ошибка выводится из печати в блоке. Все находится в области видимости, компилируется нормально, пользователь вошел в iCloud и т. Д. Происходит как на симуляторе, так и на устройстве.

Требуется ли сертификат ASPN для подписки на CloudKit? Или я допускаю какую-то ошибку?

Комментарии:

1. Вы повторили попытку через 3 секунды? Существует множество возможных ошибок, которые могут потребовать повторной попытки после небольшой задержки.

2. ДА. Я добавил asyncAfter в случае сбоя вызова и повторной попытки сохранения. Последующие попытки завершаются успешно, хотя подписки не отображаются на панели мониторинга, выборка подписок для базы данных возвращает ожидаемый вложенный файл, и уведомления никогда не поступают (выполняется на двух устройствах). Похоже, что первоначальный вызов не ВСЕГДА должен завершаться неудачей, и даже если последующий вызов работает.

3. Ну, похоже, это определенно относится к CKDatabaseSubscription. CKQuerySubscription работает так, как ожидалось.

Ответ №1:

Я получал ту же ошибку, и она исчезла после того, как я включил «iCloud Drive» в учетной записи iCloud.