Разработка
Обмен контентом между приложениями с использованием протоколов AppEntity и Transferable
В эпоху, когда Apple явно движется в сторону интентов приложений, автоматизации, интеграции с Siri и искусственного интеллекта, умение структурированно предоставлять системе доступ к данным и делиться ими становится основополагающим для обеспечения взаимодействия с контентом в вашем и других приложениях.
Фундаментальная характеристика пользовательского опыта в экосистеме Apple заключается в том, что всё ощущается как единая взаимосвязанная система, независимо от того, на каком из ваших устройств Apple вы работаете: вспомните, например, возможность скопировать что-либо с вашего Mac и без труда вставить это на ваш iPhone, или технологию AirDrop, которая позволяет мгновенно обмениваться файлами между находящимися рядом устройствами, не задумываясь о файловых системах или методах передачи. Это же ощущение и философия теперь применяются и к приложениям на одном устройстве.
Пользователи редко работают только в одном приложении от начала до конца: они могут создать что-то в одном приложении, отправить это в другое для внесения определённых изменений, а затем передать в третье для повторного использования конечного результата. Это часть повседневного рабочего процесса большинства пользователей.
В таких ситуациях пользователям не нужны сложности. Они не хотят вручную экспортировать то, что им нужно передать в другое приложение, неудобно копировать и вставлять контент, который им нужно переместить, или временно сохранять файлы, которые они собираются снова открыть в другом приложении. Пользовательский опыт должен быть естественным, плавным и мгновенным.
С точки зрения разработчика, поддержка такого рода пользовательского опыта означает создание приложений, которые хорошо интегрируются с системой, приложений, которые работают со всем остальным, или почти со всем, что есть на устройстве пользователя.
В этом кратком руководстве мы рассмотрим, как предоставлять доступ к контенту приложения и обмениваться им между различными приложениями. Для достижения такого результата мы:
- Приведем
AppEntityв соответствие с протоколомTransferable - Проверим результат с помощью приложения Shortcuts
Прежде чем начать
Для рассмотрения этих тем мы будем использовать простой пример проекта: приложение для библиотеки книг, которое позволяет отслеживать книги на вашей полке.
Папка View:
BooksListView— отображает сохраненные книги в виде спискаBookDetailView— отображает подробную информацию о сохраненной книгеAddBookView— обрабатывает добавление новой книгиWebView— рендерит файл
Папка Model, содержащая все файлы моделей:
Book— определяет тип книгиDataModel— данные, сохраняемые с помощью SwiftData
Папка Manager:
NavigationManager— обрабатывает навигацию внутри приложенияDataManager— обрабатывает операции с данными
Файл BooksShelfTrasferableApp — точка входа в приложение.
Папка Intents — содержит все файлы, связанные с интентами:
BookEntity— обрабатываетAppEntityдля моделиBookOpenBookIntent— обрабатывает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{
}
- Импортируйте фреймворк
CoreTransferable - Приведите
BookEntityв соответствие с протоколомTransferable
На этом этапе вы получите сообщение об ошибке: Xcode запросит у вас тело сборки для свойства transferRepresentation. Не беспокойтесь об этом; мы скоро это исправим.
Шаг 2 — Реализуйте свойство transferRepresentation
extension BookEntity: Transferable{
// 1.
static var transferRepresentation: some TransferRepresentation {
}
}
- Реализуйте свойство
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)
}
- Определите вычисляемое свойство в виде простого текстового представления книги в виде строки.
- Определите для него
ProxyRepresentation.
Существуют различные вариантыTransferRepresentation, в зависимости от того, какое приложение будет получать данные и как они будут использоваться; вы сами решаете, как представить свой объект. В нашем примере мы представили наш объект какProxyRepresentation, поскольку мы используем типString, встроенный тип, распознаваемый приложением «Заметки». - При желании установите
TransferRepresentationVisibilityвallс помощью методаvisibility(_:), чтобы определить, какие приложения и процессы могут видеть объект для передачи.
Тестируем через приложение Shortcuts
Чтобы проверить, действительно ли содержимое наших книг доступно для совместного использования между нашим приложением и приложением Notes , мы создадим ярлык в приложении Shortcuts.
1. Соберите приложение на своем устройстве.
2. В приложении Shortcuts создайте новый ярлык, добавив намерение «Добавить список тестовых книг на свою полку».
3. Запустите ярлык, нажав кнопку воспроизведения. Это легко отобразит список книг в вашем приложении.
4. В приложении Shortcuts создайте новый ярлык:
a. Добавьте намерение «Открыть книгу» и выберите одну книгу для открытия.
b. Добавьте намерение «Поделиться с приложениями».
c. Выберите «Открытая книга» в качестве контента.
d. Выберите Notes в качестве цели.
e. Нажмите «Открыть книгу» и выберите тип текст.
f. Запустите ярлык, нажав кнопку воспроизведения.
g. Сохраните заметку.
Теперь, если вы заглянете в приложение Notes , вы увидите новую заметку, созданную в текстовом формате, аналогичном тому, что вы видите в книге.
Вкратце, мы рассмотрели, как адаптировать AppEntity к протоколу Transferable, как создать transferRepresentation для представления пользовательского типа в виде строки, чтобы он был распознан приложениями, работающими с такими типами, и, наконец, как протестировать обмен контентом между нашим приложением и Notes.
Это заключительный проект.
В эпоху, когда Apple явно движется в сторону интентов приложений, автоматизации, интеграции с Siri и искусственного интеллекта, умение структурированно предоставлять системе доступ к данным и делиться ими становится основополагающим для обеспечения взаимодействия с контентом в вашем и других приложениях.
Siri работает не с пользовательским интерфейсом, а с данными и интентами приложений. Для перемещения контента между приложениями ей сначала необходимо понять, какой тип контента он представляет. Это относится и к ярлыкам, и к автоматизации. Как мы только что видели, для этого система использует AppEntity вашего пользовательского объекта, а TransferRepresentation позволяет передавать контент между приложениями, делая его понятным для ярлыков — мы надеемся, что очень скоро и для Siri.
-
Вовлечение пользователей2 недели назад
Большинство приложений терпят неудачу не из-за плохой «идеи»
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2026.3
-
Новости2 недели назад
Видео и подкасты о мобильной разработке 2026.4
-
Видео и подкасты для разработчиков2 недели назад
Изоляционно-плагинная архитектура в Dart-приложениях, переносимость на Flutter








