Я думаю, что все получилось, поскольку у меня возникла та же проблема, несмотря на то, что я выполнил все шаги, описанные в документации Apple для NSPersistentCloudKitContainer
.
Чтобы убедиться, что все сущности базовых данных созданы правильно вв среде разработки перед развертыванием в производственной среде рекомендуется (один раз) запустить .shouldInitializeSchema
на вашем NSPersistentCloudKitContainer
.
. Проблема в том, что это недействительно в течение нескольких месяцев (подробнее см. ниже .. .) поэтому другой способ сделать это - и способ, которым я это сделал - состоял в том, чтобы создавать все мои данные на лету, сохраняя их в Core Data, которая создала схему в среде разработки с помощью NSPersistentCloudKitContainer
. Затем я развернул его в Production, когда он отлично работал на моих устройствах.
Хотя он отлично работал для моих данных, он не работал ни для одного из моих пользователей в реальном мире, использующих мою версию App Storeприложения. Это был настоящий головной убор.
Оказалось, что в схеме CloudKit для моей модели базовых данных было несколько пропущенных пользовательских полей в одном или двух пользовательских типах - атрибуты, которые существуют в моей модели, но которые ябольше не использовать (одна была просто пустая строка, которую я никогда не использую).
Проблема в том, что NSPersistentCloudKitContainer
это не нравится, даже если NSManagedObject
имеет атрибуты, которые вы не используете, они должны присутствовать в схеме CloudKit, чтобы он работал. Похоже, что требуется пользовательское поле, чтобы точно соответствовать каждому атрибуту в модели базовых данных.
Почему это работает на моих устройствах, может быть связано с тем фактом, что когда-то в прошлом эти пользовательские типы и пользовательские поля присутствовали в среде разработки до сброса, на каком этапе мои устройства имелив iCloud уже есть все для них.
Пользовательские типы (как видно на вашей информационной панели CloudKit) должны иметь пользовательские поля, которые соответствуют каждому базовому атрибуту данных для соответствующего объекта, а также настраиваемое поле для каждого 'отношения «один к одному» (у меня тоже был один из пропавших). Все эти поля начинаются с CD_
, которые автоматически генерируются с помощью NSPersistentCloudKitContainer
.
Кажется, что отношения «ко-многим» хранятся в другом месте.
С помощью Apple они предложилизапустить .shouldInitializeSchema
замену initializeCloudKitSchema(options:)
(пока нет в их документации!) на контейнере (только один раз), чтобы заполнить все пробелы.
Когда я это сделал, я заметил, что на самом деле он не добавляетникаких пропущенных пользовательских полей вообще, и когда я «развернул в производство», не было никаких изменений, и хотя они все еще работали на моих устройствах, производственные устройства не работали. При дальнейшем анализе пропущенные поля НЕ были добавлены ...
Таким образом, вместо этого я удостоверился, что некоторые данные были записаны в мое тестовое устройство для всех этих отсутствующих атрибутов и отношений «к одному», а затем попытался снова.
Я мог видеть, что все они теперь присутствуют в Схеме разработки, которую я развернул в производство. Все недостающие пользовательские типы и пользовательские поля были перечислены в изменении.
Теперь все это работает для моих пользователей!
Какой сложный процесс. Частично моя вина, частично Apple.