Connect with us

Разработка

Обмен контентом между приложениями с использованием протоколов AppEntity и Transferable

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

Опубликовано

/

     
     

Фундаментальная характеристика пользовательского опыта в экосистеме Apple заключается в том, что всё ощущается как единая взаимосвязанная система, независимо от того, на каком из ваших устройств Apple вы работаете: вспомните, например, возможность скопировать что-либо с вашего Mac и без труда вставить это на ваш iPhone, или технологию AirDrop, которая позволяет мгновенно обмениваться файлами между находящимися рядом устройствами, не задумываясь о файловых системах или методах передачи. Это же ощущение и философия теперь применяются и к приложениям на одном устройстве.

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

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

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

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

  1. Приведем AppEntity в соответствие с протоколом Transferable
  2. Проверим результат с помощью приложения Shortcuts

Прежде чем начать

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

Папка View:

  • BooksListView — отображает сохраненные книги в виде списка
  • BookDetailView — отображает подробную информацию о сохраненной книге
  • AddBookView — обрабатывает добавление новой книги
  • WebView — рендерит файл

Папка Model, содержащая все файлы моделей:

  • Book — определяет тип книги
  • DataModel — данные, сохраняемые с помощью SwiftData

Папка Manager:

  • NavigationManager — обрабатывает навигацию внутри приложения
  • DataManager — обрабатывает операции с данными

Файл BooksShelfTrasferableApp — точка входа в приложение.

Папка Intents — содержит все файлы, связанные с интентами:

  • BookEntity — обрабатывает AppEntity для модели Book
  • OpenBookIntent — обрабатывает AppIntent, позволяющий открыть определенную книгу
  • ShorcutsProviders — обрабатывает AppShortcutsProvider, соответствующий типу, который позволяет вызывать интенты с помощью голосовых команд
  • SearchIntent — обрабатывает AppIntent, позволяющий выполнять поиск внутри вашего приложения
  • AddBookIntent — обработка AppIntent, создающиего новый экземпляр книги
  • AddTestingBooksListIntent — обработка AppIntent, создающего новые экземпляры книги для целей тестирования

NavigationManager и общий Modelcontainer инициализируются в точке входа приложения. Запустите приложение и начните сохранять свои книги; они понадобятся для запуска и тестирования.

Приведите BookEntity в соответствие с протоколом Transferable

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

Протокол Transferable отвечает за подготовку контента к отправке за пределы приложения- он гарантирует, что переданный объект будет доступен системе таким образом, чтобы он был понятен другим приложениям.

Шаг 1 — Приведите ваш AppEntity в соответствие с протоколом Transferable

// 1. 
import CoreTransferable
...

// 2.
extension BookEntity: Transferable{
  
}
  1. Импортируйте фреймворк CoreTransferable
  2. Приведите BookEntity в соответствие с протоколом Transferable

На этом этапе вы получите сообщение об ошибке: Xcode запросит у вас тело сборки для свойства transferRepresentation. Не беспокойтесь об этом; мы скоро это исправим.

Шаг 2 — Реализуйте свойство transferRepresentation

extension BookEntity: Transferable{
    // 1.
    static var transferRepresentation: some TransferRepresentation {
    }
    
}
  1. Реализуйте свойство transferRepresentation

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

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

Таким образом, протокол Transferable гарантирует, что вы храните в transferRepresentation комбинацию нескольких существующих представлений передачи, описывающих, как передать элемент в различных сценариях, в основном опираясь на встроенные типы, которые легко распознаются; например, вы можете предоставить книгу как данные, вы можете создать строку, представляющую ее содержимое, или вы можете представить ее как другой пользовательский тип, распознаваемый другим вашим приложением. Эта коллекция предоставляет доступ системе, и когда другим приложениям потребуется импортировать ваш кастомный тип, они увидят из этого списка только то, что они могут распознать и обработать.

В нашем примере, поскольку мы хотим поделиться содержимым Book с приложением Notes, мы будем использовать представление типа String.

extension BookEntity: Transferable{
    // 1.
    var plainText: String {
        let body =
        """
        📘 \(title ?? "Untitled")
        ✍️ Author: \(author ?? "Unknown")
        📚 Type: \( contentType?.rawValue ?? "—")
        🏷 Genre: \(genre ?? "—")
        """
        return body
    }
    
    static var transferRepresentation: some TransferRepresentation {
        // 2.
        ProxyRepresentation(exporting: \.plainText)
        // 3.
        .visibility(.all)
    }
  1. Определите вычисляемое свойство в виде простого текстового представления книги в виде строки.
  2. Определите для него ProxyRepresentation.
    Существуют различные варианты TransferRepresentation, в зависимости от того, какое приложение будет получать данные и как они будут использоваться; вы сами решаете, как представить свой объект. В нашем примере мы представили наш объект как ProxyRepresentation, поскольку мы используем тип String, встроенный тип, распознаваемый приложением «Заметки».
  3. При желании установите TransferRepresentationVisibility в all с помощью метода visibility(_:), чтобы определить, какие приложения и процессы могут видеть объект для передачи.

Тестируем через приложение Shortcuts

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

1. Соберите приложение на своем устройстве.

2. В приложении Shortcuts создайте новый ярлык, добавив намерение «Добавить список тестовых книг на свою полку».

Обмен контентом между приложениями с использованием протоколов AppEntity и Transferable

3. Запустите ярлык, нажав кнопку воспроизведения. Это легко отобразит список книг в вашем приложении.

4. В приложении Shortcuts создайте новый ярлык:

a. Добавьте намерение «Открыть книгу» и выберите одну книгу для открытия.

Обмен контентом между приложениями с использованием протоколов AppEntity и Transferable

b. Добавьте намерение «Поделиться с приложениями».

Обмен контентом между приложениями с использованием протоколов AppEntity и Transferable

c. Выберите «Открытая книга» в качестве контента.

Обмен контентом между приложениями с использованием протоколов AppEntity и Transferable

d. Выберите Notes в качестве цели.

Обмен контентом между приложениями с использованием протоколов AppEntity и Transferable

e. Нажмите «Открыть книгу» и выберите тип текст.

Обмен контентом между приложениями с использованием протоколов AppEntity и Transferable

f. Запустите ярлык, нажав кнопку воспроизведения.

g. Сохраните заметку.

Обмен контентом между приложениями с использованием протоколов AppEntity и Transferable

Теперь, если вы заглянете в приложение Notes , вы увидите новую заметку, созданную в текстовом формате, аналогичном тому, что вы видите в книге.

Обмен контентом между приложениями с использованием протоколов AppEntity и Transferable

Вкратце, мы рассмотрели, как адаптировать AppEntity к протоколу Transferable, как создать transferRepresentation для представления пользовательского типа в виде строки, чтобы он был распознан приложениями, работающими с такими типами, и, наконец, как протестировать обмен контентом между нашим приложением и Notes.

Это заключительный проект.

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

Siri работает не с пользовательским интерфейсом, а с данными и интентами приложений. Для перемещения контента между приложениями ей сначала необходимо понять, какой тип контента он представляет. Это относится и к ярлыкам, и к автоматизации. Как мы только что видели, для этого система использует AppEntity вашего пользовательского объекта, а TransferRepresentation позволяет передавать контент между приложениями, делая его понятным для ярлыков — мы надеемся, что очень скоро и для Siri.

 

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: