Магазин iCloud KeyValue не распознается при первом запуске

Мое приложение использует iCloud (хранилище ключей и значений) для синхронизации уникального идентификатора между несколькими устройствами. Это работает в тот момент, когда это действительно должно работать, при первом запуске приложения. Похоже, что устройство еще не знакомо со значениями из iCloud при первом запуске, только после того, как приложение установлено и какое-то время работает.

Я проверяю значение iCloud в функции viewDidLoad в главном представлении приложения.

Итак, мои вопросы:

  • Это ожидаемое поведение?
  • Если да, есть ли другое решение?
  • Может ли быть так, что это проблема только при запуске из Xcode, а не из поставляемой версии? Если да, то как протестировать?

Спасибо!

Джаспер


person Jasper Bel    schedule 16.07.2012    source источник
comment
См. этот вопрос: stackoverflow.com/questions/12539266/   -  person erkanyildiz    schedule 28.12.2012


Ответы (3)


Когда вы впервые запускаете приложение с поддержкой iCloud, оно должно получать все данные с серверов Apple. Время, необходимое для этого, зависит от многих факторов, например, от того, в какой сети вы сейчас находитесь (Edge, 3G, GPRS, WLAN). Это также зависит от того, какой объем трафика сервер iCloud в настоящее время должен обрабатывать, поэтому запрос к серверу iCloud может занять еще несколько секунд, независимо от того, какой тип сетевого подключения у вас есть.

Подводя итог: да, это звучит абсолютно нормально.

Если запуск вашего приложения зависит от этих настроек, рассмотрите возможность реализации представления «Ожидание» или «Загрузка», которое остается на экране до тех пор, пока приложение выполняет первоначальную синхронизацию и загружает все необходимые данные из облака. Чтобы не блокировать пользовательский интерфейс навсегда, также установите тайм-аут для этого представления (если данные iCloud не загружаются в течение X секунд, закройте представление и уведомите пользователя).

person Björn Kaiser    schedule 16.07.2012
comment
Спасибо за ваш ответ! Есть ли способ проверить, завершена ли первоначальная синхронизация iCloud? - person Jasper Bel; 16.07.2012
comment
Вы должны подписаться на уведомление NSUbiquitousKeyValueStoreDidChangeExternallyNotification. В документации есть пример :-) разработчик .apple.com/library/ios/documentation/cocoa/Conceptual/ - person Björn Kaiser; 16.07.2012
comment
@BjörnKaiser У меня та же проблема, но независимо от того, как долго я жду первого запуска приложения, уведомление никогда не приходит, и именно тогда я знаю, что данные присутствуют в keyValueStore в iCloud. - person pulkitsinghal; 28.09.2012
comment
Подано с Apple @ bugreport.apple.com, 12394404 — уведомления NSUbiquitousKeyValueStore не срабатывают при первом запуске приложения - person pulkitsinghal; 28.09.2012
comment
У меня такая же проблема... иногда надежность 50%, у других пользователей 100% отказ. - person CthulhuJon; 22.01.2014

У меня была аналогичная проблема, когда NSUbiquitousKeyValueStoreDidChangeExternallyNotification не срабатывал при первом запуске после установки, независимо от того, как долго я ждал. Установка начального ключа в NSUBiquitousKeyValueStore, похоже, решила эту проблему.

Сразу после добавления наблюдателя в хранилище по умолчанию я вызываю:

[[NSUbiquitousKeyValueStore defaultStore] setString:@"testValue" forKey:@"testKey"];
[[NSUbiquitousKeyValueStore defaultStore] synchronize];

Я использую разные ключи (т. е. не testKey) для фактических данных, которые хочу синхронизировать.

person Jellyjoey    schedule 20.11.2012
comment
Я реализовал это, и, похоже, это работает хорошо. Суть в том, что я не полагаюсь ни на какие данные, которые я получаю из iCloud, пока моя функция наблюдателя не будет вызвана впервые. После его вызова я вижу все значения, которые я сохранил в предыдущих экземплярах приложения. Я проверяю это, удаляя приложение, перезагружая телефон и выжидая около 10 минут. Не уверен, что все эти шаги необходимы, но кажется, что iOS сначала возвращает nil для данных, а затем он проходит правильно после вызова функции наблюдателя через несколько секунд. - person Nicholas; 08.01.2013
comment
не помогло. Просто кажется, что ответ серверов iCloud может быть очень медленным при доступе к сохранению или загрузке, и ваше приложение должно иметь возможность обрабатывать эти асинхронные события. данные обычно доступны .... позже, но редко в течение 30 секунд после запуска приложения. - person CthulhuJon; 23.01.2014

У вас нет гарантии, что NSUbiquitousKeyValueStore завершит первую синхронизацию, так как ваше приложение запускается в первый раз. (На самом деле, в iOS 5 синхронизация часто начинается при первом запуске приложения).

Невозможно узнать, произошла ли первая начальная синхронизация, продолжается ли она или уже завершена. Вы можете (на самом деле должны) подписаться на NSUbiquitousKeyValueStoreDidChangeExternallyNotification. Хитрость заключается в том, что если ваш магазин на сервере iCloud пуст, вы не получите никаких уведомлений после первоначальной синхронизации (поскольку ваш локальный магазин пуст и облачный магазин тоже пуст, ничего не изменилось «внешне» после первоначальной синхронизации). синхронизировать…)

Обычно вы не должны полагаться на первоначальную синхронизацию.

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

Наконец, если вы действительно думаете, зная о завершении начальной синхронизации или нет, отправьте сообщение об ошибке на bugreport.apple.com и объясните, почему вам это действительно нужно.

person Julien    schedule 20.07.2012