Хранение Предпочтений в iCloud
Приложение может использовать хранилище значения ключа iCloud для совместного использования мелких сумм данных с другими экземплярами себя на других компьютерах и устройствах на iOS пользователя. Хранилище значения ключа предназначается для простых типов данных как те, Вы могли бы использовать для предпочтений. Например, приложение журнала могло бы сохранить текущую проблему и номер страницы, считанный пользователем так, чтобы другие экземпляры приложения могли открыться к той же странице, когда запущено. Вы не должны использовать это хранилище для больших объемов данных или для сложных типов данных.
Для использования хранилища значения ключа iCloud сделайте следующее:
В XCode сконфигурируйте
com.apple.developer.ubiquity-kvstore-identifier
право для Вашего приложения.В Вашем коде создайте совместно используемое
NSUbiquitousKeyValueStore
объект и регистр для уведомлений изменения.Используйте методы
NSUbiquitousKeyValueStore
получить и установить значения.
Данные значения ключа в iCloud ограничиваются простыми типами списка свойств (строки, числа, даты, и т.д.).
Стратегии Использования Хранилища Значения ключа iCloud
Хранилище значения ключа не предназначается для хранения больших объемов данных. Это предназначается для хранения данных конфигурации, предпочтений и мелких сумм связанных с приложением данных. Чтобы помочь Вам решить, является ли хранилище значения ключа подходящим для Ваших потребностей, рассмотрите следующее:
Каждое приложение ограничивается 1 МБ общего пространства в хранилище значения ключа. (Существует также отдельный предел на ключ 1 МБ, и максимум 1 024 ключей позволяются.) Таким образом Вы не можете использовать хранилище значения ключа для совместного использования больших объемов данных.
Хранилище значения ключа поддерживает только типы списка свойств. Типы списка свойств включают простые типы такой как
NSNumber
,NSString
, иNSDate
объекты. Можно также сохранить необработанные блоки данных вNSData
объекты и расположение все использование типовNSArray
иNSDictionary
объекты.Хранилище значения ключа предназначается для того, чтобы хранить данные, нечасто изменяющиеся. Если приложения на устройстве вносят частые изменения в хранилище значения ключа, система может задержать синхронизацию некоторых изменений для минимизации числа циклов обработки к серверу. Чем более часто приложения вносят изменения, тем более вероятно случается так, что более поздние изменения будут задержаны и не обнаружатся на других устройствах сразу же.
Хранилище значения ключа не является заменой для предпочтений или другими локальными методами для того, чтобы сохранить те же данные. Цель хранилища значения ключа состоит в том, чтобы совместно использовать данные между приложениями, но если iCloud не включен или не доступен на данном устройстве, Вы все еще могли бы хотеть сохранить локальную копию данных.
При использовании хранилища значения ключа для совместного использования предпочтений, один подход должен сохранить фактические значения в пользовательской базе данных значений по умолчанию и синхронизировать их использующий хранилище значения ключа. (Если Вы не хотите использовать предпочтительную систему, Вы могли бы также сохранить изменения в пользовательском файле списка свойств или некотором другом локальном хранении.) При изменении значения ключа локально запишите, что изменение и в пользовательской базе данных значений по умолчанию и в значении ключа iCloud хранит одновременно. Для получения изменений из внешних источников добавьте наблюдателя для уведомления NSUbiquitousKeyValueStoreDidChangeExternallyNotification
и используйте свой метод обработчиков обнаружить, какие ключи, измененные внешне и, обновляют соответствующие данные в пользовательской базе данных значений по умолчанию. Путем выполнения этого пользовательская база данных значений по умолчанию всегда содержит корректные значения конфигурации. Хранилище значения ключа iCloud просто становится механизмом для обеспечения, что пользовательская база данных значений по умолчанию имеет новые изменения.
Конфигурирование приложения для Использования хранилища значения ключа
Чтобы к использованию хранилища значения ключа, приложение должно быть явно сконфигурировано с com.apple.developer.ubiquity-kvstore-identifier
право. Вы используете XCode, чтобы включить это право и указать его значение для Вашего приложения, как описано в Добавлении Поддержки iCloud в Руководстве по Распределению приложений.
При включении хранилища значения ключа XCode автоматически заполняет значение по умолчанию для поля контейнеров, основывающегося на идентификаторе пакета приложения. Для большинства приложений значение по умолчанию - то, что Вы хотите. Однако, если Ваше приложение совместно использует свое хранение значения ключа с другим приложением, необходимо указать идентификатор пакета для другого приложения вместо этого. Например, если у Вас есть облегченная версия Вашего приложения, Вы могли бы хотеть, чтобы оно использовало то же хранилище значения ключа в качестве оплаченной версии.
Включение права является всем, что необходимо сделать для использования совместно используемого NSUbiquitousKeyValueStore
объект. Пока право сконфигурировано и содержит допустимое значение, объект хранилища значения ключа пишет свои данные в надлежащее расположение в учетной записи iCloud пользователя. Если будет присоединение задач к указанному контейнеру iCloud, то любые попытки читать или значения ключа записи перестанут работать. Гарантировать хранилище значения ключа сконфигурировано должным образом и доступное, необходимо выполнить код, подобный следующему рано в цикле запуска приложения:
NSUbiquitousKeyValueStore* store = [NSUbiquitousKeyValueStore defaultStore]; |
[[NSNotificationCenter defaultCenter] addObserver:self |
selector:@selector(updateKVStoreItems:) |
name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification |
object:store]; |
[store synchronize]; |
Создание значения ключа хранит объект рано в цикле запуска Вашего приложения, рекомендуется, потому что это гарантирует, что Ваше приложение получает обновления от iCloud своевременно. Лучший способ определить, были ли изменения внесены в ключи и значения, состоит в том, чтобы зарегистрироваться для уведомления NSUbiquitousKeyValueStoreDidChangeExternallyNotification
. И во время запуска, необходимо вызвать synchronize
метод вручную, чтобы обнаружить, если какие-либо изменения были внесены внешне. Вы не должны вызывать тот метод в других случаях во время Вас выполнение приложения.
Для получения дополнительной информации о том, как сконфигурировать права для приложения для iOS, посмотрите Добавляющие Возможности в Руководстве по Распределению приложений.
Доступ к значениям в хранилище значения ключа
Вы получаете и устанавливаете значения хранилища значения ключа с помощью методов NSUbiquitousKeyValueStore
класс. Этот класс имеет методы для получения и установки предпочтений со скалярными значениями булевской переменной типа, long long
, и double
. Это также имеет методы для того, чтобы получить и установить ключи, значения которых NSData
, NSDate
, NSString
, NSNumber
, NSArray
, или NSDictionary
объекты.
Если Вы используете хранилище значения ключа в качестве способа обновить локально сохраненные предпочтения, Вы могли использовать код, подобный этому в Перечислении 3-1 для координирования обновлений к пользовательской базе данных значений по умолчанию. Этот пример предполагает использование тех же ключевых имен и соответствующих значений и в iCloud и в пользовательской базе данных значений по умолчанию. Это также предполагает, что Вы ранее зарегистрировались updateKVStoreItems:
метод как метод для вызова в ответ на уведомление NSUbiquitousKeyValueStoreDidChangeExternallyNotification
.
Перечисление 3-1 , Обновляющее локальные предпочтительные значения с помощью iCloud
- (void)updateKVStoreItems:(NSNotification*)notification { |
// Get the list of keys that changed. |
NSDictionary* userInfo = [notification userInfo]; |
NSNumber* reasonForChange = [userInfo objectForKey:NSUbiquitousKeyValueStoreChangeReasonKey]; |
NSInteger reason = -1; |
// If a reason could not be determined, do not update anything. |
if (!reasonForChange) |
return; |
// Update only for changes from the server. |
reason = [reasonForChange integerValue]; |
if ((reason == NSUbiquitousKeyValueStoreServerChange) || |
(reason == NSUbiquitousKeyValueStoreInitialSyncChange)) { |
// If something is changing externally, get the changes |
// and update the corresponding keys locally. |
NSArray* changedKeys = [userInfo objectForKey:NSUbiquitousKeyValueStoreChangedKeysKey]; |
NSUbiquitousKeyValueStore* store = [NSUbiquitousKeyValueStore defaultStore]; |
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; |
// This loop assumes you are using the same key names in both |
// the user defaults database and the iCloud key-value store |
for (NSString* key in changedKeys) { |
id value = [store objectForKey:key]; |
[userDefaults setObject:value forKey:key]; |
} |
} |
} |
Определение объема изменений хранилища значения ключа
Каждый вызов к одному из NSUbiquitousKeyValueStore
методы обрабатываются как единственная атомарная транзакция. При передаче данных для той транзакции к iCloud целая транзакция или перестала работать или успешно выполняется. Если это успешно выполняется, все ключи записаны в хранилище и если это перестало работать, никакие ключи не записаны. Нет никакой частичной записи ключей к хранилищу. Когда отказ происходит, система также генерирует a NSUbiquitousKeyValueStoreDidChangeExternallyNotification
уведомление, содержащее причину отказа. При использовании хранилища значения ключа необходимо использовать то уведомление для обнаружения возможных проблем.
Если у Вас есть группа ключей, значения которых должны все быть обновлены одновременно, чтобы быть допустимыми, сохранить их вместе в единственной транзакции. Для записи многократных ключей и значений в единственной транзакции создайте NSDictionary
объект со всеми ключами и значениями. Тогда запишите объект словаря в хранилище значения ключа с помощью setDictionary:forKey:
метод. Запись всего словаря изменений гарантирует, что все ключи записаны, или ни один из них не.