2015-03-02 5 views
0

Я добавляю синхронизацию iCloud Core Data к уже выпущенному приложению. Я смущен различием между стандартным и настраиваемым контейнером.iCloud container default vs custom

То, что я узнал от тестирования:

Когда я использую по умолчанию контейнер мое приложение хранит данные в ICloud, но не синхронизировать его на различных устройствах. Итак, скажем, у меня есть приложение на iPhone (устройство A). Когда я использую контейнер по умолчанию, я могу удалить свое приложение, переустановить его, выполнить синхронизацию iCLoud и восстановить ранее сохраненные данные в iCloud. Таким образом, он работает как резервная копия в iCloud. Но что не работает, он синхронизирует данные на разных устройствах, таких как iPhone (устройство A), с другим устройством, например iPad (устройство B).

Когда я использую пользовательский контейнер, он выполняет синхронизацию на разных устройствах. Он работает так, как будто я хочу, чтобы он работал. Мои данные синхронизируются на разных устройствах, и у меня есть те же данные на iPhone (устройство A) и iPad (устройство B).

Это то, чему я научился просто проверять его. Но пока моя учетная запись, похоже, действительно перепуталась со всеми тестами и удалила и уничтожила данные iCloud с устройства, и так как вы не можете удалять контейнеры и делать какую-то новую установку, это действительно немного испортилось. И я смущен документально. Он говорит, что somethig как использование пользовательских контейнеров, если несколько приложений используют один и тот же контейнер. Но означает ли несколько приложений одно и то же приложение на разных устройствах? Или они действительно разные приложения?

Я прав? Разве разница между стандартными и настраиваемыми контейнерами?

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

Спасибо за помощь!

ответ

0

У меня (все еще есть) такая же проблема. Мне действительно нужен только один контейнер, который мое приложение использует для синхронизации между многими устройствами. После использования стандартного (iCloud и bundleID с именем container) и неудачной синхронизации с моей настройкой. Я вернулся к тестированию предыдущего (ранее приложение использовало контейнер с префиксом команды) «custom», и похоже, что я могу выполнить все необходимые для синхронизации тесты.

Результаты, по-видимому, различаются в зависимости от настройки тестирования (только устройства, комбинации, только симулятор). Тестирование iCloud всегда должно быть устройствами исключительно потому, что они настроены действовать по-другому (не жадные, в отличие от симулятора). В любом случае все, что вам нужно, - это реальные результаты.

Моя ограниченная установка состоит из одного (бесплатного) приложения на устройстве и симулятора с использованием iCloud с iCCoud Drive перенесенной учетной записью (iOS 8.4). Синхронизация происходит в моем случае это:

с контейнером по умолчанию ICloud $ (CFBundleIdentifier).
Устройство < -> ICloud (Все данные)
Simulator < -> ICloud (могут видеть только тренажерных созданные данные)

С пользовательского контейнера $ (TeamIdentifier) ​​$ (CFBundleIdentifier):
устройство < -> ICloud (Все данные)
Simulator < -> ICloud (Все данные)

В соответствии с Руководством по проектированию iCloud:
«Когда вы включаете документы iCloud или CloudKit, Xcode настраивает ваше приложение для доступа к контейнеру iCloud, имя которого основано на идентификаторе пакета приложения.В большинстве приложений должен быть доступ только к контейнеру по умолчанию. Если ваши приложения совместно используют данные между собой, включите опцию «Определить пользовательские идентификаторы контейнеров» и добавьте один или несколько идентификаторов контейнера , которые вы используете для обмена данными. Когда приложение имеет доступ к нескольким идентификаторам контейнера, первый идентификатор в списке доступа является особым, потому что он является основным контейнером iCloud приложения. »

Как я понимаю, каждое приложение имеет свой собственный контейнер по умолчанию (имя основано . на BundleID приложений). Например:
iCloud.com.company.myApp_free
iCloud.com.company.myApp_nonfree

Большинство приложений получает доступ только то, что собственный контейнер по умолчанию, однако это разумно думать, что myApp_free и myApp_nonfree должны используйте тот же контейнер. Затем, скажем, бесплатный пользователь начнет платить, данные все равно будут доступны. Таким образом, myApp_nonfree будет использовать контейнер оплачиваемых версий для бесплатных обновлений.

Мое подозрение в том, что это еще одна проблема с симулятором. Симулятор с iOS 8+ вернет контейнер nil, если вы обращаетесь (URLForUbiquityContainerIdentifier: containerIdentifier) ​​с учетной записью iCloud, которая не перенесена на iCloud Drive.