Разработка для Документов в iCloud

Принятие хранения документов iCloud делает документы Вашего приложения доступными на всех устройствах пользователя. Документ (на основе UIDocument класс в iOS или NSDocument класс в OS X), совокупность связанных данных, которые могут быть записаны в диск как единственный файл или как пакет файла. Пакет файла, в свою очередь, каталог, представленный пользователю как единственный файл и сделанный доступным для Вашего приложения через NSFileWrapper объект.

Документы автоматически реализуют большую часть поведения, ожидаемого приложений iCloud. В частности документ автоматически гарантирует, что локальные изменения безопасно координируются с порожденными из iCloud изменениями. Это делает это путем найма координатора файла (NSFileCoordinator) возразите и путем принятия предъявителя файла (NSFilePresenter) протокол. В OS X v10.8 и позже, автоматически обеспечивают документы, открывают/сохраняют/переименовывают UI и функциональность; в iOS Ваше приложение должно реализовать эти вещи. Использование координаторов файла и предъявителей обязательно при работе с документами iCloud.

Как Работы Хранения документов iCloud

Когда Вы пишете файлы и каталоги к хранению документов iCloud, система передает те элементы автоматически iCloud и другим устройствам пользователя. Используя iCloud хранение документов подобно использованию локальной файловой системы, за исключением следующих требований:

Чтобы понять, как хранение документов iCloud работает, оно помогает видеть его в действии. Рисунок 3-1 показывает упрощенное представление локального хранения на устройстве. В дополнение к локальным каталогам данных приложения приложения могут также получить доступ к любым контейнерам iCloud, для которых у них есть надлежащие права. Сами контейнеры iCloud также живут на устройстве, но находятся в другой части файловой системы и должны быть сконфигурированы, прежде чем они смогут использоваться. Для конфигурирования контейнера iCloud для использования Вы вызываете URLForUbiquityContainerIdentifier: метод NSFileManager от фонового потока (шаг 1), указывая контейнер, к которому Вы хотите получить доступ. Система конфигурирует контейнер (шаг 2) и возвращает базовый URL контейнерного каталога. Вы используете тот URL для создания дальнейшего URLs для указания файлов и каталогов, и Вы используете URL для создания запросов метаданных для поиска контейнера (шаг 3).

  Данные рисунка 3-1 и обменивающиеся сообщениями взаимодействия для приложений iCloud

Используя координацию файла для доступа к файлам и каталогам

При доступе к файлам и каталогам в контейнере, приложения iCloud требуются, чтобы использовать координацию файла, чтобы сделать так. Координация файла использует координатора файла, и предъявитель файла возражает для сериализации доступа к файлам и каталогам для сохранения целостности данных. Предъявители файла контролируют файл и уведомляются каждый раз, когда другой поток или процесс принимают меры на нем. Все действия с файлом должны произойти через координатора файла, координирующего те действия с любыми заинтересованными предъявителями файла. Например, при перемещении файла от одного расположения до другого, координатор файла уведомляет любых заинтересованных предъявителей файла нового расположения. И при записи в файл, координатор файла задерживает операцию записи, пока все предъявители файла не указывают, что безопасно сделать так.

Приложения то использование объекты документа (UIDocument в iOS и NSDocument в OS X), получают координацию файла бесплатно. Объекты документа реализуют предъявителя (NSFilePresenter) протокол и использование его методы для управления базовым файлом или пакетом файла. При чтении или записи содержания файла, объекты документа также используют координаторов файла (экземпляры NSFileCoordinator класс) автоматически. Если Вы не используете объекты документа для доступа к файлам, необходимо обработать координацию файла сами. Для получения дополнительной информации, о как к координации файла поддержки в Ваших собственных объектах, посмотрите Роль Координаторов Файла и Предъявителей в Руководстве по программированию Файловой системы.

Передача Данных к и от iCloud

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

Рисунок 3-2  , Передающий файл iCloud в первый раз

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

Рисунок 3-3  , Передающий просто файл, изменяется на iCloud

Когда новый файл появляется в iCloud, тот файл должен быть загружен на другие устройства пользователя, как показано на рисунке 3-4. Для каждого устройства iCloud сначала отправляет метаданные того документа так, чтобы устройство знало о существовании файла. После этого синхронизация для получения данных файла зависит от типа устройства. В iOS приложения должны попросить, чтобы система (или явно или неявно) загрузила файл. Вы неявно загружаете файл путем попытки получить доступ к тому файлу, или можно явно загрузить файл путем вызова startDownloadingUbiquitousItemAtURL:error: метод NSFileManager. Mac загружает файлы автоматически, как только он обнаруживает их на сервере. Поэтому Mac иногда упоминается как “жадная коллега”. Если Ваше приложение Mac видит метаданные для нового документа, но сам документ еще не локален, это, вероятно, уже загружается системой от имени Вашего приложения.

Рисунок 3-4  , Получающий файл от iCloud впервые

После загрузки файл удовлетворяют в первый раз, когда последующие операции загружают только части файла, изменившегося, как показано на рисунке 3-5. Как со всеми передачами, первый шаг в процессе передачи должен загрузить обновленные метаданные документа для файла. После получения метаданных устройства автоматически вытягивают изменения в подходящее время. На устройствах на iOS изменения вытягивают в подходящее время, такой как тогда, когда приложение, которому принадлежат файлы, прибывает в передний план. В OS X изменения сразу вытягивают.

Рисунок 3-5  , Получающий, изменил данные от iCloud

Для проверки загрузки или прогресса загрузки файла получите значение NSURLUbiquitousItemDownloadingStatusKey от соответствия NSURL объект. Значение того ключа говорит Вам, локален ли файл уже для устройства или в процессе того, чтобы быть загруженным. Можно получить более определенные данные о прогрессе загрузки путем получения других атрибутов NSURL объект. Для списка соответствующих ключей см. Ссылку класса NSURL.

Обязанности за приложение по Использованию Документов iCloud

Изменения в документах Вашего приложения могут поступить от iCloud в любое время, таким образом, Ваше приложение должно быть подготовлено обработать их. NSDocument класс в OS X выполняет большую часть этой работы для Вас, но в iOS существует больше для Вас для обработки явно. При реализации iOS и приложений OS X, сделайте следующий, чтобы удостовериться, что приложения обрабатывают изменения iCloud соответственно:

Разработка Формата Файла документа для iCloud

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

Если Вы обеспечиваете версии своего приложения для iOS и Mac, разрабатываете Ваш формат файла документа, чтобы быть межплатформенные совместимый.

Проект для сетевого коэффициента передачи

Если Ваш формат данных документа состоит из многократных отличных частей, используйте пакет файла для своего формата файла документа. Пакет файла, к которому Вы получаете доступ посредством NSFileWrapper возразите, позволяет Вам сохранить элементы документа как отдельные файлы и папки, которые могут быть считаны и записаны отдельно — при тихом появлении пользователю как единственный файл. Загрузка iCloud и машинное оборудование загрузки используют этот факторинг содержания в пакете файла; только измененные элементы загружаются или загружаются.

Зарегистрируйте свой формат файла документа и его связанное расширение файла, в Вашем приложении Info.plist файл списка свойств в XCode. В частности используйте ключ CFBundleDocumentTypes для указания форматов файлов, которые приложение распознает и в состоянии открыться. Укажите и расширение файла и универсальный идентификатор типа (UTI), соответствующий содержанию файла. Система использует эту информацию для соединения пакетов файла к приложению, и, в OS X, к пакетам дисплейного файла пользователю, как будто они - нормальные файлы.

Проект для персистентного состояния документа

Много основанных на документе приложений получают преимущества от поддержания состояния на основе на документ. Например, пользователь основанного на векторе приложения получения хотел бы, чтобы каждый документ помнил, какой инструмент для рисования последний раз использовался и какой элемент получения был выбран.

Существует два места, можно сохранить специфичное для документа состояние:

  • В пакете файла (или формат плоского файла) для документа. Этот выбор поддерживает держащий состояние вместе с документом, если, например, пользователь отправляет его по электронной почте.

  • Связанный с документом, но за пределами его пакета файла (или формат файла). Этот выбор поддерживает случаи, в которых пользователь не хотел бы делиться информацией. Но, будучи за пределами данных, которыми управляют Ваши объекты документа, такое состояние не прослежено функциональностью разрешения конфликтов документа. Вам решать сделать так.

Какой бы ни схема, которую Вы выбираете, заботятся, в приложении, поддерживающем редактирование, чтобы никогда сохранить состояние документа, если не было отредактировано содержание документа. Иначе, Вы приглашаете тривиальные и бесполезные сценарии конфликта, использующие сетевую пропускную способность и заряд батареи.

Например, предположите, что пользователь редактировал документ длинного текста о ее iPad, работая на странице 1. Немного позже она открывает документ о своем iPhone и прокручивает к последней странице. Это плохо себя ведомое приложение в качестве примера настойчиво сохраняет позицию прокрутки конца документа — даже при том, что пользователь не внес никакие другие изменения. Когда пользователь позже открывает документ о ее iPad, чтобы продолжить редактировать, существует бесполезный конфликт вследствие данных позиции прокрутки. Система отметила документ как в конфликте (UIDocumentStateInConflict), и более новая версия (автоматически назначенный победителем конфликта) является той, прокрученной до последней страницы. Чтобы быть приложением iCloud хорошего поведения, этот текстовый редактор должен был проигнорировать изменение в позиции прокрутки на iPhone, потому что пользователь не редактировал содержание.

Продумайте различные сценарии использования для своего приложения и разработайте соответственно для улучшения пользовательского опыта. Заботьтесь с состоянием как:

  • Позиция прокрутки документа

  • Выбор элемента

  • Открытые в последний раз метки времени

  • Табличный порядок сортировки

  • Размер окна (в OS X)

Стратегия рассмотреть состоит в том, чтобы сохранить такое состояние, но только когда пользователь также внес изменение, заслуживающее сохранения. В OS X встроенная функция Resume обеспечивает все поведение сохранения состояния, в котором нужно большинство основанных на документе приложений. Если Вы хотите дополнительное управление, можно использовать в своих интересах NSChangeDiscardable тип изменения документа.

Проект для устойчивости и межплатформенной совместимости

Помните следующие факторы при разработке формата файла документа для iCloud:

  • Используйте межплатформенное представление данных. Подобно названные классы — те, префиксами которых является «UI» для iOS и «NS» для OS X — не непосредственно совместимы. Это - истина для цветов (UIColor и NSColor), изображения (UIImage и NSImage), и пути Безье (UIBezierPath и NSBezierPath), а также для других классов.

    Например, OS X NSColor объект определяется с точки зрения цветового пространства (NSColorSpace), но в iOS нет никакого класса цветового пространства.

    При использовании такого класса в свойстве формата документа необходимо разработать промежуточное представление iCloud, которое можно искренне перераспределить в собственное представление на любой платформе, как изображено на рисунке 3-6. Когда NSDocument объект сохраняет свои данные к диску (шаг 1), это преобразовывает каждый специфичный для платформы тип данных в промежуточное межплатформенное представление. Те межплатформенные данные сохраняются к iCloud и загружаются на другие устройства пользователя (шаги 2 и 3). Когда версия iOS Вашего приложения извлекает те данные (шаг 4), это преобразовывает данные из межплатформенного представления в специфичную для iOS версию.

    Рисунок 3-6  Используя межплатформенное представление данных

    Храня документ из Вашего приложения для iOS для более позднего просмотра на любой платформе, Вы инвертировали бы процесс, показанный на рисунке 3-6 — запуск, храня Ваш документ iOS с помощью межплатформенного представления данных.

    Для каждого специфичного для платформы типа данных Вы используете в своем формате документа, проверяете, существует ли надлежащий, тип данных низшего уровня, совместно использованный обеими платформами, которые можно использовать в промежуточном представлении. Например, каждый цветной класс (UIColor и NSColor) имеет метод инициализации, позволяющий Вам создать цветовой объект из Базового Изображения CIColor экземпляр.

    При подготовке данных к записи в iCloud преобразуйте в промежуточное представление; при чтении основанного на iCloud файла преобразуйте из промежуточного представления. Если Вы вызываете методы от NSCoder или его конкретные подклассы, чтобы закодировать и декодировать граф объектов Вашего документа, выполните эти преобразования в тех методах.

  • Примите специфичные для платформы системы координат во внимание. Системы координаты экрана по умолчанию в iOS и OS X отличаются, приводя к различиям в том, как Вы рисуете и в том, как Вы располагаете представления. Примите это во внимание при хранении и извлечении информации о координате экрана с межплатформенным представлением. Для получения дополнительной информации посмотрите Системы координат и Рисующий в iOS в Рисовании и Печати Руководства для iOS.

  • Всегда используйте нечувствительные к регистру имена файлов. OS X, по умолчанию, и для почти всех пользователей, использует нечувствительную к регистру файловую систему. Например, файл mydoc.txt и файл MyDoc.TXT не может оба существовать в том же каталоге в OS X. В отличие от этого, iOS обрабатывает те имена файлов, как являющиеся отличающимся.

    Чтобы заставить Ваш файл документа отформатировать межплатформенный совместимый, необходимо считать и записать файлы нечувствительным к регистру способом.

  • Используйте число версии формата. Поскольку можно хотеть изменить формат документа в будущем, разработайте нумерацию версии формата и примените номер версии как свойство формата документа.

    Управление версиями Ваш формат документа всегда был хорошей идеей, и с iCloud и кросс-платформенными форматами, это еще более важно. Например, у пользователя iCloud, вероятно, будут многократные устройства, на которых можно просмотреть содержание; но пользователь не мог бы добросовестно обновить Ваше приложение на всех ее устройствах сразу. Так, например, Mac пользователя мог бы иметь новейшую версию Вашего приложения OS X, но его iPad мог бы иметь версию года Вашего приложения для iOS.

    Ранняя версия Вашего приложения могла бы быть только для iOS; когда Вы позже распределите версию OS X, Вы, вероятно, захотите изменить формат документа. Путем встраивания версии формата в каждом документе код может корректно обработать документы независимо от их версии. Вы могли бы, например, сделать старый, формат только для iOS только для чтения в OS X. Продумайте различные сценарии, включающие многократные устройства на каждой платформе, каждый выполняющий различную версию Вашего приложения. Удостоверьтесь, что Вы обеспечиваете самый лучший пользовательский опыт для основанных на iCloud документов.

Для получения дополнительной информации о методах для разработки форматов файлов, посмотрите Types Выбора, Formats, и Strategies for Document Data in Document-Based App Programming Guide for iOS или Handling a Shared Data Model in OS X и iOS в Основанном на документе Руководстве по программированию Приложения для Mac.

Основанные на документе потоки операций

Таблица 3-1 перечисляет некоторые типичные потоки операций для основанных на документе приложений. Для каждого потока операций таблица приводит основные классы, которые Вы обычно используете, вместе с кратким описанием задачи.

Таблица 3-1  Типичные основанные на документе потоки операций приложения

Поток операций

Реализация

Описание

Создайте новый стандартный документ

UIDocument (iOS)

NSDocument  (OS X)

Используйте объект документа, чтобы создать и управлять структурами данных в Вашем формате документа. Классы документа автоматически поддерживают сохраняющие новые документы к контейнеру iCloud или к локальному хранению.

Создайте новый Базовый документ Данных

UIManagedDocument (iOS)

NSPersistentDocument  (OS X)

Используйте Базовые подклассы документа Данных, чтобы создать и управлять Вашими Базовыми Хранилищами данных. Для получения дополнительной информации посмотрите Разработку для Базовых Данных в iCloud.

Получите URLs к документам iCloud

NSMetadataQuery (iOS)

Автоматический (OS X)

В iOS используйте объект запроса метаданных определить местоположение и получить живо обновленную информацию о документах iCloud.

В OS X v10.8 или позже, Открывается документ, диалоговое окно использует запрос метаданных автоматически.

Предложите пользователю открывать документ.

Пользовательский UI (iOS)

Автоматический как часть архитектуры документа (OS X)

В iOS Ваше приложение непосредственно ответственно за представление выбора UI для пользовательских документов в простом и очевидном способе, соответствующем хорошо остальной части проекта приложения.

В OS X v10.8 или позже, команда Open в основанном на документе приложении представляет диалоговое окно, позволяющее пользователю выбрать файлы iCloud.

Обработайте конфликты версий

UIDocument, NSFileVersion (iOS)

Автоматический (OS X)

В iOS документы обнаруживают и уведомляют Вас о конфликтах. Использовать NSFileVersion объекты (один на версию документа) для разрешения их, по мере необходимости.

Переместите, копируйте и удалите основанные на iCloud документы

NSFileCoordinator

NSFileManager

Управляйте файлами на диске с помощью NSFileManager класс, и всегда в контексте координатора файла объект.

Для получения дополнительной информации о том, как выполнить предыдущие потоки операций, посмотрите в основанном на документе руководстве по программированию для платформы, для которой Вы предназначаетесь. Для iOS см. Основанное на документе Руководство по программированию Приложения для iOS. Для Mac см. Основанное на документе Руководство по программированию Приложения для Mac.