Action Extension — это расширение iOS, которое выполняет пользовательские действия с контентом из других приложений без переключения контекста. В отличие от Share Extension, который отправляет данные в другое приложение, Action Extension трансформирует содержимое прямо на месте: переводит текст, меняет фильтры изображения, проверяет орфографию или генерирует PDF. По данным Apple (2024), Action Extension — второй по популярности тип расширений после Share Extension, используемый в 42% приложений категории "Производительность". Мгновенное действие без запуска основного приложения — ключевое преимущество для пользователя.
Главное
Action Extension — это тип iOS app extension, который позволяет выполнить действие с контентом прямо в контексте хост-приложения. Пользователь выделяет текст в Safari, нажимает "Действия" и выбирает, например, "Проверить орфографию" — расширение обрабатывает текст и возвращает результат, не покидая браузер. Расширение получает входные данные через NSExtensionContext и может вернуть модифицированный контент обратно.
Action Extension появился в iOS 8 как часть архитектуры app extensions. Его ключевая особенность — расширение не имеет собственного интерфейса (опционально) и выполняется в контексте хост-приложения. Пользователь не покидает текущий экран, что обеспечивает минимальный когнитивный разрыв. По данным Apple, Action Extension — единственный тип расширения, который может одновременно читать и модифицировать контент хост-приложения (через NSExtensionContext с возвратом результата).
Action Extension используется в самых разных сценариях: перевод текста в браузере, создание PDF из веб-страницы, применение фильтра к фотографии в галерее, проверка орфографии в любом текстовом поле, сокращение URL, шифрование текста и добавление в закладки. Универсальность Action Extension делает его популярным инструментом для приложений категории "Утилиты" и "Производительность".
Action Extension и Share Extension часто путают, но их назначение принципиально различно. Шеар-расширение отправляет контент из хост-приложения в ваше; Action-расширение обрабатывает контент и возвращает его обратно. Различие влияет на архитектуру, пользовательский опыт и требования к конфигурации Info.plist.
| Характеристика | Action Extension | Share Extension |
|---|---|---|
| Назначение | Трансформация контента | Передача контента в приложение |
| Интерфейс | Опционально (кастомный) | SLComposeServiceViewController |
| Возврат данных | Да, через completeRequest | Нет |
| Контекст | Остаётся в хост-приложении | Переключается в расширение |
| Позиция в меню | Action Sheet (верхняя часть) | Share Sheet (нижняя часть) |
| Типичное действие | Перевод, коррекция, фильтр | Сохранение, публикация |
Action Extension появляется в меню действий (Action Sheet) при нажатии кнопки "Поделиться" или "...". iOS автоматически помещает Action Extensions в верхнюю часть листа (действия), а Share Extensions — в нижнюю (приложения). Пользовательский сценарий: выделил текст → нажал "Действия" → выбрал ваш Action Extension → получил обработанный результат без переключения приложений.
Action Extension состоит из таргета в Xcode, UIViewController для отображения интерфейса (опционально), NSExtensionContext для ввода-вывода данных и конфигурации Info.plist. Архитектура проще, чем у Share Extension: нет обязательного compose-интерфейса, и расширение может работать полностью без UI.
Таргет — отдельный bundle с идентификатором, наследуемым от основного приложения. UIViewController — опциональный интерфейс для отображения прогресса, настроек или результата. NSExtensionContext — контейнер с входными данными (inputItems) и методом completeRequest для возврата результата. Info.plist — конфигурация активации через NSExtensionActivationRule и атрибуты (NSExtensionAttributes) для указания поддерживаемых типов контента.
Action Extension получает входные данные через extensionContext?.inputItems — массив NSExtensionItem. Каждый элемент содержит attachment-ы с данными и UTI. После обработки расширение вызывает completeRequest(returningItems:) с массивом выходных NSExtensionItem. Хост-приложение получает обработанные данные и отображает их. Асинхронная модель: расширение может выполнять длительные операции, удерживая контекст до 30 секунд.
Рассмотрим создание Action Extension на Swift для перевода выделенного текста. Расширение получает текст из хост-приложения, отправляет его на сервер перевода и возвращает результат. ActionViewController — базовый контроллер, создаваемый Xcode при добавлении таргета.
import UIKit
import MobileCoreServices
class ActionViewController: UIViewController {
@IBOutlet var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
extractTextAndTranslate()
}
func extractTextAndTranslate() {
guard let item = extensionContext?.inputItems.first
as? NSExtensionItem
else { return }
for attachment in item.attachments ?? [] {
attachment.loadItem(
forTypeIdentifier: kUTTypePlainText as String
) { [weak self] (text, error) in
guard let inputText = text as? String else { return }
TranslationService().translate(inputText, from: "en", to: "ru") {
translated in
DispatchQueue.main.async {
self?.resultLabel?.text = translated
}
}
}
}
}
}
После обработки расширение возвращает результат в хост-приложение. completeRequest с выходными данными — альтернативный сценарий, когда расширение не показывает UI, а сразу возвращает обработанный контент.
// Returning processed text to host app
let resultItem = NSExtensionItem()
let resultData = translated.data(using: .utf8)!
let attachment = NSItemProvider(
item: resultData,
typeIdentifier: kUTTypePlainText as String
)
resultItem.attachments = [attachment]
extensionContext?.completeRequest(
returningItems: [resultItem], completionHandler: nil
)
Action Extension может работать в двух режимах: с UI и без UI. В режиме без UI расширение выполняет действие полностью в фоне и вызывает completeRequest сразу после обработки. В режиме с UI расширение показывает контроллер, пользователь подтверждает действие, и только после этого completeRequest отправляет результат. Выбор режима зависит от сложности действия и необходимости пользовательского ввода.
Метод loadItem(forTypeIdentifier:) работает асинхронно — данные могут быть большими (изображения, видео). NSItemProvider управляет поточной загрузкой и кэшированием. Для изображений используйте kUTTypeImage, для файлов — kUTTypeFileURL. Важно: loadItem может вызываться на фоновом потоке — обновляйте UI только через DispatchQueue.main.
Action Extension возвращает обработанные данные через completeRequest с массивом NSExtensionItem. Каждый элемент соответствует типу выходных данных. Хост-приложение может заменить исходный контент на обработанный — например, заменить оригинальное изображение на отфильтрованное. NSExtensionItem поддерживает те же UTI, что и на входе, плюс дополнительные (например, public.html для веб-контента).
Action Extension применяется в десятках сценариев — от простых утилит до сложных бизнес-процессов. Классические примеры охватывают текстовые, графические и файловые операции, а также интеграцию с веб-контентом.
Action Extension для текста: перевод, проверка орфографии, подсчёт символов, изменение регистра, шифрование, создание QR-кода из текста. Пользователь выделяет текст в любом приложении с текстовым полем (Safari, Notes, Mail) и одним нажатием выполняет действие. Подсветка синтаксиса кода, форматирование Markdown и сокращение URL — популярные примеры Action Extension для продвинутых пользователей.
Для изображений Action Extension предлагает: применение фильтров, обрезку, изменение размера, конвертацию форматов (HEIC в JPEG), добавление водяного знака, распознавание текста (OCR) и сжатие. Обработка изображений должна быть быстрой — пользователь ожидает результат за 2–3 секунды. Для тяжёлых операций используйте Core Image на GPU или фоновые очереди.
Action Extension для URL: создание PDF из веб-страницы, сохранение в Pocket/Pinterest, проверка скорости сайта, архивирование страницы, получение метаданных Open Graph, генерация скриншота страницы. PDF-генерация — один из самых востребованных сценариев: пользователь конвертирует веб-страницу в PDF без открытия сторонних сервисов.
Часто задаваемые вопросы
Share Extension отправляет контент из хост-приложения в ваше приложение. Action Extension обрабатывает контент на месте и возвращает результат обратно. Share — передача, Action — трансформация. Это фундаментальное различие определяет архитектуру и UX.
Да. Если действие не требует ввода от пользователя (например, подсчёт символов), расширение может выполнить его в фоне и сразу вернуть результат через completeRequest. В Info.plisi нужно указать NSExtensionActivationSupportsWebURL или другой UTI, соответствующий типу данных.
В любых приложениях, которые поддерживают UIActivityViewController или стандартные контроллеры действий. Это Safari, Фото, Файлы, Заметки, Почта и тысячи сторонних приложений. Action Extension не работает в приложениях, которые не используют стандартные механизмы iOS для действий.
Через extensionContext.completeRequest(returningItems:) с массивом NSExtensionItem. Каждый выходной элемент содержит NSItemProvider с обработанными данными. Хост-приложение получает результат в делегате UIActivityViewController или аналогичном callback-е.
Расширение работает до 30 секунд, после чего iOS принудительно завершает его. Нет доступа к основному приложению напрямую — только через App Groups. Action Extension не может выполнять фоновые задачи после завершения. Для длительных операций используйте фоновые NSURLSession с уведомлением при следующем запуске.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также