CloudKit - "Неверный идентификатор пакета для контейнера"

Я только что создал проект в Xcode 9 beta 6 и добавил этот код:

let privateDB = CKContainer.default().privateCloudDatabase
let greatID = CKRecordID(recordName: "GreatPlace")
let place = CKRecord(recordType: "Place", recordID: greatID)

privateDB.save(place) { (record, error) in
        if error != nil {
            let er = (error as! CKError).errorUserInfo
            print("Error: \n")
            print("CKErrorDescription: \(er["CKErrorDescription"]!)\n")
            print("ContainerID: \(er["ContainerID"]!)\n")
            print("NSDebugDescription: \(er["NSDebugDescription"]!)\n")
            print("NSUnderlyingError: \(er["NSUnderlyingError"]!)\n")
            print("NSLocalizedDescription: \(er["NSLocalizedDescription"]!)\n")
            print("ServerErrorDescription: \(er["ServerErrorDescription"]!)\n")
        }
        if record != nil {
            print("record: \(record!)")
        }
 }

и добавьте эти возможности:

и когда я запускаю код, я получаю это сообщение об ошибке:

Что я делаю не так?

8 ответов

Решение

Была ошибка, из-за которой некоторые ассоциации были пропущены. Эта ошибка была исправлена, и мы автоматически исправили ассоциации контейнеров / приложений, которые были нарушены в течение этого времени.

Если по какой-то причине вам все еще нужно восстановить ассоциацию, вы можете использовать панель "Возможности" в XCode или использовать developer.apple.com -> Сертификаты, идентификаторы и профили -> Идентификаторы приложений -> выбрать идентификатор -> Редактировать -> Редактировать в iCloud -> установите флажок для диссоциации контейнера, сохранения, а затем повторного связывания.

Если вы все еще застряли, пожалуйста, напишите cloudkit[at]apple.com

Благодаря Дэйву Браунингу, это основано на его ответе.

Следующее сработало для меня:

Проверьте идентификатор контейнера
  • Проверьте идентификатор контейнера, используемый для инициализацииCKContainer
  • Примечание. Если вы используетеNSPersistentCloudKitContainerмы бы не использовали идентификатор контейнера напрямую, он был бы автоматически выбран из файла прав.

Попробуйте отключить и включить iCloud в идентификаторе приложения.

Отключить и включить iCloud в идентификаторе приложения

  1. Перейдите на https://developer.apple.com и войдите в систему.
  2. ВыбиратьCertificates, Identifiers & Profiles
  3. ВыбиратьIdentifiers(идентификаторы приложений)
  4. Изменить идентификатор приложения для приложения
  5. Снимите флажок iCloud
  6. Сохранять
  7. Проверить iCloud
  8. Выйдите из Xcode и очистите DerivedData
  9. Запустить приложение

Используя Xamarin.IOS, мне пришлось выбрать ручную подготовку, а не автоматическую в файле info.plist.

В моем случае мне пришлось удалить приложение с устройства и инициализировать его заново. Потом это снова сработало.

Для меня проблема в том, что для создания контейнера я использую . У меня есть два разных идентификатора пакета (отладка и выпуск) иCKContainer.default()примет идентификатор контейнера CK таким же, как идентификатор пакета приложения. Когда я перехожу на создание контейнера для использованияCKContainer(identifier: “my_cloudkit_identifier”)Я мог бы использовать один и тот же контейнер CK для отладки и выпуска.

Была такая же проблема. что сработало для меня, так это изменение имени группы iCloud.

  • Раньше было примерно так: iCloud.com.companyName.appName.randomString

  • После изменения на: iCloud.com.companyName.randomStringон начал работать и синхронизироваться.

Если после добавления нового контейнера он красный, нажмите кнопку обновления (из-под групп) и попробуйте выполнить чистую установку на свой телефон, и она должна работать.

У меня и моего друга такая же проблема. Мы сделали 2 разных проекта, и у них обоих было одно и то же сообщение об ошибке "Неверный идентификатор пакета для контейнера", что является случаем CKError 10.

Мы вызываем нашу функцию извлечения, чтобы получить запись "Users" по умолчанию в viewDidLoad.

func fetchWorkoutCompleted(completion: @escaping (Error?) -> Void = { _ in }) {
    cloudKitManager.fetchRecord(ofType: "Users", sortDescriptors: nil) { (records, error) in
        if let error = error {
            print(error.localizedDescription)
            completion(error)
            return
        }
        guard let records = records else { completion(nil); return }
        completion(nil)
    }
}

Возникла та же проблема с CloudKit:"Неверный идентификатор пакета для контейнера", и Дэйв помог исправить и вернуться к делу!

Другие вопросы по тегам