Spec-Zone .ru
спецификации, руководства, описания, API

Библиотека Разработчика iOS

Разработчик

Руководство по программированию расширения приложения

PDF
На этой странице

Провайдер документа

В iOS рассмотрите создание расширения Провайдера Документа для любого приложения, удаленно хранящего обычно используемые форматы документов. Это расширение (иногда сокращаемый здесь к провайдеру документа) позволяет другим приложениям получать доступ к документам, которыми управляет Ваше приложение. Кроме того, приложения, строго связанные с определенным типом документа, могут получить преимущества от создания провайдера документа для их документов. Здесь, действие провайдера документа как локальный репозиторий для определенного типа документа, позволяя пользователю собрать все те документы в одно место.

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

Расширения провайдера документа

Расширение Провайдера Документа действует как интерфейс между файлами, которыми Ваше приложение управляет и другие приложения на устройствах пользователей. Это позволяет другим приложениям импортировать или открыть файлы, загружая и загружая их с Вашего сервера по мере необходимости. Приложения могут также экспортировать или переместить свои документы в совместно используемый контейнер Вашего расширения.

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

Для поддержки операций открытия и операций пересылки необходимо также создать расширение Провайдера Файла. Это расширение предоставляет доступ к приложениям узла файлам вне его песочницы. Это также создает заполнителей для удаленных файлов, загружает локальные копии при необходимости и загружает любые изменения, внесенные приложением узла.

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

Если Вы хотите только совместно использовать документы из своего приложения, можно создать a UIDocumentPickerViewController возразите, чтобы экспортировать или переместить Ваши документы. Также можно совместно использовать документы с помощью Диска iCloud.

Для выбора - в к Поддержке дисков iCloud откройте область возможностей XCode и включите документы iCloud. Затем, откройте приложение info.plist файл. Необходимо будет добавить запись для контейнеров iCloud, и затем определить, как Вы хотите совместно использовать каждый контейнер. Демонстрационная запись показана ниже:

  • <key>NSUbiquitousContainers</key>
  • <dict>
  • <key>iCloud.com.example.MyApp</key>
  • <dict>
  • <key>NSUbiquitousContainerIsDocumentScopePublic</key>
  • <true/>
  • <key>NSUbiquitousContainerSupportedFolderLevels</key>
  • <string>Any</string>
  • <key>NSUbiquitousContainerName</key>
  • <string>MyApp</string>
  • </dict>
  • </dict>

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

Расширение контроллера представления средства выбора документа

Расширение Контроллера Представления Средства выбора Документа обеспечивает пользовательский интерфейс для импорта, экспорта, открытых, и операций пересылки к или от совместно используемого контейнера Вашего расширения. Для создания расширения Контроллера Представления Средства выбора Документа (иногда сокращаемый здесь к средству выбора документа) разделите на подклассы UIDocumentPickerExtensionViewController класс. Когда пользователь выбирает Вашего провайдера документа из a, Ваш подкласс инстанцируют UIDocumentMenuViewController возразите или когда приложение узла откроет Вашего провайдера документа непосредственно с помощью a UIDocumentPickerViewController объект.

В любом случае приложение узла представляет контроллер представления средства выбора документа. Система тогда встраивает Ваше расширение Контроллера Представления Средства выбора Документа в контроллере представления приложения. Контроллер представления приложения предоставляет панели навигации имя провайдера документа, переключатель расположения и кнопку Done. Ваше расширение должно обеспечить остальную часть пользовательского интерфейса. Рисунок 10-1 показывает относительную позицию этих элементов UI.

Иллюстрация, 10-1Layout из контроллера представления средства выбора документа image: ../Art/UI_management_2x.png

Жизненный цикл

  1. Приложение узла представляет a UIDocumentMenuViewController объект.

  2. Пользователь выбирает Вашего провайдера документа из списка.

  3. Ваш UIDocumentPickerExtensionViewController подкласс инстанцируют.

  4. Ваше расширение Контроллера Представления Средства выбора Документа prepareForPresentationInMode: метод вызывают. Расширение должно представить надлежащий пользовательский интерфейс для данного режима. Открытые режимы и режимы импорта часто требуют различного набора средств управления, чем перемещение или экспортируют режимы. Ваше расширение должно поэтому проверить режим и представить соответствующий интерфейс пользователя.

    UIDocumentPickerExtensionViewController возразите действиям как корневому контроллеру представления для Вашего пользовательского интерфейса; поэтому, часто удобно сделать его контейнерным контроллером. Можно тогда создать отдельное дочернее представление контроллеры для каждого режима, и расширение просто представляет надлежащий дочерний контроллер представления в Вашем prepareForPresentationInMode: метод.

  5. Ваше расширение Контроллера Представления Средства выбора Документа представлено в приложении узла.

  6. Пользователь делает выбор.

  7. При выполнении экспорта или операции пересылки, расширение Контроллера Представления Средства выбора Документа должно выполнить любые требуемые передачи файлов и инициировать любые требуемые обновления сервера.

    • Ваше расширение Контроллера Представления Средства выбора Документа должно скопировать файл в выбранное расположение.

    • Если Вы не используете расширение Провайдера Файла, Ваше расширение Контроллера Представления Средства выбора Документа должно синхронизировать файл к Вашему серверу прежде, чем вызвать dismissGrantingAccessToURL: метод.

    • Если Вы используете расширение Провайдера Файла, и Вы копируете файл с помощью координатора файла, которому установили его идентификатор цели в идентификатор провайдера расширения, расширение Провайдера Файла itemChangedAtURL: метод не вызывают. Вместо этого Ваше расширение Контроллера Представления Средства выбора Документа должно синхронизировать файл к Вашему серверу прежде, чем вызвать dismissGrantingAccessToURL: метод.

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

    • Также, если Вы используете расширение Провайдера Файла, и Вы копируете файл с помощью координатора файла по умолчанию (координатор файла без идентификатора цели), тогда расширение Провайдера Файла itemChangedAtURL: метод вызывают. Расширение Провайдера Файла может синхронизировать файл к Вашему серверу.

      Этот подход позволяет Вам изолировать весь код, взаимодействующий с Вашим сервером в Вашем расширении Провайдера Файла.

  8. Ваше расширение Контроллера Представления Средства выбора Документа вызывает dismissGrantingAccessToURL: метод. Этот метод отклоняет пользовательский интерфейс и передает предоставленный URL назад приложению узла, вызывая делегата средства выбора документа documentPicker:didPickDocumentAtURL: метод.

  9. UIDocumentPickerExtensionViewController экземпляр отклонен

Создание расширения контроллера представления средства выбора документа

Для создания нового расширения Контроллера Представления Средства выбора Документа в XCode добавьте новую цель к проекту iOS использование шаблона Document Picker Extension. Для получения дальнейшей информации посмотрите Создание Расширения.

При создании расширения Контроллера Представления Средства выбора Документа у Вас есть опция создания соответствующего расширения Провайдера Файла одновременно. Для получения дополнительной информации посмотрите Создание Расширения Провайдера Файла.

Шаблон Document Picker Extension добавляет a UIDocumentPickerExtensionViewController разделите на подклассы к своему проекту. Это также добавляет раскадровку для Вашего пользовательского интерфейса средства выбора документа и info.plist файл.

Установка требуемых записей списка свойств

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

  • <key>NSExtension</key>
  • <dict>
  • <key>NSExtensionAttributes</key>
  • <dict>
  • <key>UIDocumentPickerModes</key>
  • <array>
  • <string>UIDocumentPickerModeImport</string>
  • <string>UIDocumentPickerModeOpen</string>
  • <string>UIDocumentPickerModeExportToService</string>
  • <string>UIDocumentPickerModeMoveToService</string>
  • </array>
  • <key>UIDocumentPickerSupportedFileTypes</key>
  • <array>
  • <string>public.content</string>
  • </array>
  • </dict>
  • <key>NSExtensionMainStoryboard</key>
  • <string>MainInterface</string>
  • <key>NSExtensionPointIdentifier</key>
  • <string>com.apple.fileprovider-ui</string>
  • </dict>

Эти записи автоматически установлены шаблоном Document Picker Extension. Отредактируйте их, только если Вы планируете изменить поведение своего расширения по умолчанию. В частности UIDocumentPickerModes массив содержит записи для всех режимов, которые поддерживает Ваше средство выбора документа. Если Вы не планируете реализовать расширение Провайдера Файла, удалите записи для UIDocumentPickerModeOpen и UIDocumentPickerModeMoveToService.

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

UIDocumentPickerSupportedFileTypes массив содержит список универсальных идентификаторов типов, которые поддерживает Ваше расширение. Ваше расширение появляется как опция только, когда тип файлов, передаваемых соответствие по крайней мере один из UTIs, перечислил в этом массиве. По умолчанию, public.content UTI соответствует все типы документов.

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

Например, если Вы заменяете NSExtensionMainStoryboard запись с NSExtensionPrincipalClass ключ, значение которого является именем Вашего UIDocumentPickerExtensionViewController подкласс, расширение тогда загружает контроллер представления непосредственно. Этот подход позволяет Вам загружать свой пользовательский интерфейс из a .xib файл, или создать Ваш пользовательский интерфейс программно.

Разделение на подклассы UIDocumentPickerExtensionViewController

Шаблон Document Picker Extension обеспечивает простое UIDocumentPickerExtensionViewController подкласс. Измените этот подкласс, чтобы управлять Вашим пользовательским интерфейсом и реагировать на взаимодействие с пользователем, как Вы были бы для большинства контроллеров представления. Однако, существуют несколько UIDocumentPickerExtensionViewController определенные методы и свойства, которые стоит отметить.

  • prepareForPresentationInMode:

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

  • dismissGrantingAccessToURL:

    Вызовите этот метод, чтобы отклонить контроллер представления средства выбора документа и предоставить доступ к предоставленному URL. Каждый режим имеет свои собственные требования для URL. Для полных подробных данных посмотрите Отклонение Пользовательского интерфейса.

  • documentPickerMode

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

  • originalURL

    Это свойство только для чтения содержит URL исходного файла когда в экспорте или режиме пересылки. Иначе это содержит nil.

  • validTypes

    Это свойство только для чтения содержит массив допустимого UTIs когда в импорте или открытом режиме. Иначе это содержит nil.

  • providerIdentifier

    Это свойство только для чтения содержит значение, возвращенное Вашим расширением Провайдера Файла providerIdentifier метод. Если Вы не обеспечиваете расширение Провайдера Файла, оно возвращается nil.

  • documentStorageURL

    Это свойство только для чтения содержит значение, возвращенное Вашим расширением Провайдера Файла documentStorageURL метод. Если Вы не обеспечиваете расширение Провайдера Файла, оно возвращается nil.

Создание пользовательского интерфейса

Основная цель расширения Контроллера Представления Средства выбора Документа состоит в том, чтобы позволить пользователям выбрать файлы для импорта или операций открытия, и выбрать места назначения для экспорта и операций пересылки.

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

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

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

Можно также решить обработать имя для входа в систему, загрузки и подобные задачи непосредственно в расширении Контроллера Представления Средства выбора Документа. Существует только два места, где можно непосредственно взаимодействовать с пользователем: в содержании приложения и в расширении Контроллера Представления Средства выбора Документа. Это означает, что все ведение счетов, уведомления об ошибке и обновления прогресса должны быть обработаны одним из этих двух компонентов.

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

Часто, можно обеспечить лучший пользовательский опыт путем обработки этих задач в расширении Контроллера Представления Средства выбора Документа непосредственно. Для большей информации посмотрите Обеспечение Большого Пользовательского Опыта в Неопределенном Мире.

Отклонение пользовательского интерфейса

Когда пользователь сделает надлежащий выбор, вызвать dismissGrantingAccessToURL: и возвратите должным образом отформатированный URL. URL Должен ответить всем следующим условиям:

  • Режим Import Document Picker. Обеспечьте URL для выбранного файла. URL должен указать на локальный файл, что расширение Контроллера Представления Средства выбора Документа может получить доступ. Если бы пользователь выбрал удаленный файл, то Ваше расширение должно загрузить файл и сохранить локальную копию прежде, чем вызвать dismissGrantingAccessToURL: метод. Также, если Вы также обеспечиваете расширение Провайдера Файла, можно просто обеспечить URL, удовлетворяющий требования для операции открытия, и позвольте провайдеру файла загрузить ее для Вас.

  • Открытый режим Document Picker. Обеспечьте URL для выбранного файла. Если файл еще не существует в этом расположении, Ваше расширение Провайдера Файла вызывают, чтобы создать заполнителя или произвести файл по мере необходимости. URL должен указать на расположение в иерархии каталогов, именуемой Вашим documentStorageURL свойство. Это свойство просто вызывает Вашего провайдера файла documentStorageURL метод и возвраты его значение.

  • Режим Export Document Picker. Как только пользователь выбирает место назначения, скопируйте файл в то место назначения. Ваши расширения также должны отследить файл и удостовериться, что он синхронизируется к Вашему серверу.

    После того, как копия завершена, отклоните пользовательский интерфейс, обеспечив URL для новой копии. Этот URL должен быть доступным только расширением Контроллера Представления Средства выбора Документа. Система возвращает URL приложению узла для указания успеха; однако, приложение узла не может получить доступ к документу в этом URL.

  • Режим Move Document Picker. Как только пользователь выбирает место назначения, скопируйте файл в то место назначения. Ваши расширения также должны отследить файл и удостовериться, что он синхронизируется к Вашему серверу.

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

Расширение провайдера файла

Расширение Провайдера Файла предоставляет доступ к файлам вне песочницы приложения узла с открытыми действиями и действиями перемещения. Это расширение (иногда сокращаемый здесь к провайдеру файла) также позволяет приложению узла загружать файлы, не представляя контроллер представления средства выбора документа. Эта функция позволяет доступу к приложениям узла, ранее открыл документы с помощью безопасных закладок URL, даже если те файлы больше не хранятся на устройстве.

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

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

Создание расширения провайдера файла

Можно создать расширение Провайдера Файла как часть шаблона Document Picker Extension. Посмотрите Создание Расширения Средства выбора Документа. При включении расширения Провайдера Файла шаблон создает отдельную цель для расширения. Это также создает NSFileProviderExtension подкласс для этой цели и Info.plist файл с требуемыми записями.

Установка требуемых записей списка свойств

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

  • <key>NSExtension</key>
  • <dict>
  • <key>NSExtensionFileProviderDocumentGroup</key>
  • <string>group.com.example.sharedContainerURL</string>
  • <key>NSExtensionPointIdentifier</key>
  • <string>com.apple.fileprovider-nonui</string>
  • <key>NSExtensionPrincipalClass</key>
  • <string>FileProvider</string>
  • </dict>

Эти записи автоматически создаются шаблоном Document Picker Extension. Измените их, только если Вы хотите изменить настройки по умолчанию расширения.

NSExtensionFileProviderDocumentGroup запись должна содержать идентификатор для совместно используемого контейнера, к которому можно получить доступ и Средством выбора Документа и расширением Провайдера Файла. Это используется расширением documentStorageURL метод.

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

Установка Совместно используемого Контейнера

По умолчанию дополнительный шаблон устанавливает совместно используемый контейнер, к которому можно получить доступ и расширением Контроллера Представления Средства выбора Документа и расширением Провайдера Файла. Как правило, хотя, Вы хотите совместно использовать этот контейнер с содержанием приложения также.

Откройте область возможностей XCode и включите возможность Групп приложений Вашего содержания приложения. Добавьте идентификатор для совместно используемой группы. Можно скопировать этот идентификатор с цели расширения Провайдера Файла.

Эта возможность добавляет a com.apple.security.application-groups запись в права целей.

  • <key>com.apple.security.application-groups</key>
  • <array>
  • <string>com.example.domain.MyFirstDocumentPickerExtension</string>
  • </array>

Для получения дополнительной информации о группах приложений, посмотрите Добавление Приложения к Группе приложений.

Разделение на подклассы NSFileProviderExtension

NSFileProviderExtension класс обеспечивает много различных методов — некоторые, что Вы не должны переопределять, некоторые, что можно переопределить и несколько, что необходимо переопределить. Эти методы описаны ниже.

Не переопределяйте эти методы класса

  • writePlaceholderAtURL:withMetadata:error:

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

  • placeholderURLForURL:

    Этот метод отображает файл URLs в их соответствующего заполнителя URLs. Вы обычно вызываете этот метод для генерации заполнителя URL прежде, чем вызвать writePlaceholderAtURL:withMetadata:error: метод.

  • providerIdentifier

    Идентификатор, уникальный для этого NSFileProviderExtension подкласс. По умолчанию этот метод возвращает идентификатор пакета содержания приложения.

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

    И расширение Контроллера Представления Средства выбора Документа и расширение Провайдера Файла должны передать идентификатор провайдера их координатору файла purposeIdentifier свойство. Совместное использование идентификатора цели позволяет расширениям скоординировать друг с другом и предотвращает возможные мертвые блокировки между ними.

  • documentStorageURL

    Корневой URL для всех обеспечил документы. По умолчанию, этот метод возвраты <контейнерный URL>/File Provider Storage, где контейнерный URL является значением, возвращенным containerURLForSecurityApplicationGroupIdentifier: метод.

    Контейнерный URL обращается к каталогу контейнера группы приложений, совместно использованному UIDocumentPickerExtensionViewController и NSFileProviderExtension расширения. Можно указать этот совместно используемый контейнер с помощью NSExtensionFileProviderDocumentGroup введите расширение Провайдера Файла info.plist файл.

Можно переопределить эти методы

Реализация по умолчанию этих методов должна работать на большинство расширений; однако, можно хотеть переопределить их для подстраивания поведения расширения.

Необходимо переопределить эти методы

Необходимо переопределить эти методы даже при обеспечении только пустого метода. Не вызывать super в Ваших реализациях.

  • providePlaceholderAtURL:completionHandler:

    Системные вызовы этот метод, когда к файлу получают доступ. Оба providePlaceholderAtURL:completionHandler: и startProvidingItemAtURL:completionHandler: методы могут быть инициированы, поскольку пользователь взаимодействует с контроллером представления средства выбора документа или со скоординированным чтением.

    Точно, какие методы инициированы, и какова их последовательность, зависьте от намерения доступа. Например, скоординированное чтение с помощью NSFileCoordinatorReadingImmediatelyAvailableMetadataOnly опция просто инициировала создание заполнителя. В результате Ваше расширение не должно создавать зависимости между этими методами. Их можно вызвать любым порядком.

  • startProvidingItemAtURL:completionHandler:

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

  • itemChangedAtURL:

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

  • stopProvidingItemAtURL:

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

Обеспечение большого пользовательского опыта в неопределенном мире

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

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

Помните, что Ваше расширение Провайдера Документа имеет широкие импликации через все устройство, потому что каждое приложение с контроллером представления средства выбора документа может получить доступ к нему. Поэтому Вы хотите обеспечить тело, полируемый, и надежный пользовательский опыт.

Координация файла

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

Для средства выбора документа и провайдера файла, необходимо также установить идентификатор цели координатора файла. Оба расширения обеспечивают a providerIdentifier метод. Вы передаете возвращаемое значение этого метода координатору файла purposeIdentifier свойство прежде, чем выполнить Ваше скоординированное чтение или запись. Путем совместного использования идентификатора цели два расширения приложения могут скоординировать друг с другом, предотвратив любые возможные мертвые блокировки между ними.

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

Загрузка файлов

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

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

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

  • Можно вывести на экран прогресс во время загрузки.

  • Вы имеете полный контроль над тем, как обрабатываются ошибки.

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

Можно использовать NSURLSession фоновая передача, чтобы загрузить файлы, но убедиться установить NSURLSessionConfiguration объект sharedContainerIdentifier свойство к контейнеру, совместно использованному расширением приложения и содержанием приложения. Это гарантирует, что к результатам можно получить доступ или расширением или содержанием приложения по мере необходимости.

Фоновые передачи выполняют загрузку в отдельном процессе, и загрузка продолжается, даже если завершается Ваше средство выбора документа. Если Ваше средство выбора документа не работает, когда загрузка завершается, система запускает Ваше содержание приложения в фоновом режиме и вызывает application:handleEventsForBackgroundURLSession:completionHandler: метод.

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

Даже при загрузке документов из расширения Контроллера Представления Средства выбора Документа все еще необходимо поддерживать загрузку с провайдера файла startProvidingItemAtURL:completionHandler: метод. Приложение узла может не всегда получать доступ к Вашим документам через контроллер представления средства выбора документа. Любое время пользователь открывает файл, приложение узла, может сохранить ограниченную по объему безопасностью закладку для того файла. Эта закладка позволяет приложению узла открыть тот файл непосредственно. Однако, если провайдер файла уже удалил локальную копию для высвобождения пространства памяти, это должно теперь загрузить новую копию.

При загрузке файлов в расширении Провайдера Файла у Вас нет доступа к пользовательскому интерфейсу. Если ошибка происходит, Вы не можете вывести на экран сообщение непосредственно. Вместо этого Вы передаете NSError возразите против startProvidingItemAtURL:completionHandler: обработчик завершения метода. Система тогда пасует назад эту ошибку к скоординированному чтению приложения узла.

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

Это означает, что можно хотеть тщательно сбалансировать желание сохранить пространство памяти с желанием избежать ненужных загрузок. Если Ваше расширение очень обеспокоено о замене файлов с заполнителями в расширении Провайдера Файла stopProvidingItemAtURL: метод, Ваши пользователи могут быть удивлены, когда приложение внезапно должно повторно загрузить файл, они просто продолжали работать. Кроме того, если Вы знаете, что Ваш пользователь захочет данный файл, можно хотеть преимущественно загрузить его на совместно используемый контейнер от содержания приложения. Это делает файл немедленно доступным, когда пользователь просит его.

Обнаружение и передача конфликтов

Каждый раз, когда пользователь может изменить файл на многократных устройствах, конфликты становятся неизбежными. Поэтому будьте подготовлены и обнаружить и обработать конфликты, когда они произойдут. Например, когда Ваше содержание приложения или расширения Провайдера Файла загружает обновленную версию файла, необходимо проверить и видеть, конфликтует ли обновленный файл с какими-либо локальными изменениями. Точно так же каждый раз, когда Вы загружаете локальные изменения назад в сервере, сервер должен быть в состоянии обнаружить и обработать любые конфликты, которые это могло бы найти.

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

Вход в систему и

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

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

Сохраните удостоверения пользователя в совместно используемой цепочке для ключей с помощью группы Доступа Цепочки для ключей. В области возможностей XCode включите совместное использование цепочки для ключей для содержания приложения и его расширений. Обязательно используйте тот же идентификатор группы для всех трех целей. Затем когда Вы создаете совместно используемый элемент цепочки для ключей, включаете kSecAttrAccessGroup введите словарь атрибутов элемента. Значение этого ключа должно быть Вашим совместно используемым идентификатором.

Для получения дополнительной информации о сохранении данных к цепочке для ключей посмотрите Задачи iOS Keychain Services.

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