Action Extension: що це, як працює та розробка розширення

Автор: IT Sectr Опубліковано: 2026-06-15 Час читання: 10 хв

Action Extension — це розширення iOS, яке виконує користувацькі дії з контентом з інших застосунків без перемикання контексту. На відміну від Share Extension, який надсилає дані в інший застосунок, Action Extension трансформує вміст прямо на місці: перекладає текст, змінює фільтри зображення, перевіряє орфографію або генерує PDF. За даними Apple (2024), Action Extension — другий за популярністю тип розширень після Share Extension, який використовується в 42% застосунків категорії «Продуктивність». Миттєва дія без запуску основного застосунку — ключова перевага для користувача.

Головне

  • Action Extension — розширення iOS для трансформації контенту в хост-застосунку.
  • NSExtensionContext — контекст виконання з вхідними та вихідними даними.
  • UTI — Uniform Type Identifiers для визначення типу оброблюваного контенту.
  • UIActivity — застарілий механізм для реалізації дій в iOS 6–7.
  • App Groups — передача оброблених даних назад у застосунок.

Що таке Action Extension

Action Extension — це тип iOS app extension, який дозволяє виконати дію з контентом прямо в контексті хост-застосунку. Користувач виділяє текст у Safari, натискає «Дії» та вибирає, наприклад, «Перевірити орфографію» — розширення обробляє текст і повертає результат, не залишаючи браузер. Розширення отримує вхідні дані через NSExtensionContext і може повернути модифікований контент назад.

Action Extension з'явився в iOS 8 як частина архітектури app extensions. Його ключова особливість — розширення не має власного інтерфейсу (опціонально) і виконується в контексті хост-застосунку. Користувач не залишає поточний екран, що забезпечує мінімальний когнітивний розрив. За даними Apple, Action Extension — єдиний тип розширення, який може одночасно читати та модифікувати контент хост-застосунку (через NSExtensionContext з поверненням результату).

Де застосовується Action Extension

Action Extension використовується в різноманітних сценаріях: переклад тексту в браузері, створення PDF з веб-сторінки, застосування фільтра до фотографії в галереї, перевірка орфографії в будь-якому текстовому полі, скорочення URL, шифрування тексту та додавання в закладки. Універсальність Action Extension робить його популярним інструментом для застосунків категорії «Утиліти» та «Продуктивність».

Action Extension проти Share Extension

Action Extension і Share Extension часто плутають, але їхнє призначення принципово різне. Share Extension надсилає контент із хост-застосунку у ваш; Action Extension обробляє контент і повертає його назад. Відмінність впливає на архітектуру, користувацький досвід і вимоги до конфігурації Info.plist.

ХарактеристикаAction ExtensionShare Extension
ПризначенняТрансформація контентуПередача контенту в застосунок
ІнтерфейсОпціонально (кастомний)SLComposeServiceViewController
Повернення данихТак, через completeRequestНі
КонтекстЗалишається в хост-застосункуПеремикається в розширення
Позиція в менюAction Sheet (верхня частина)Share Sheet (нижня частина)
Типова діяПереклад, корекція, фільтрЗбереження, публікація

Як користувач вибирає дію

Action Extension з'являється в меню дій (Action Sheet) при натисканні кнопки «Поділитися» або «...». iOS автоматично розміщує Action Extensions у верхній частині листа (дії), а Share Extensions — у нижній (застосунки). Користувацький сценарій: виділив текст → натиснув «Дії» → вибрав ваш Action Extension → отримав оброблений результат без перемикання застосунків.

Архітектура Action Extension

Action Extension складається з таргета в Xcode, UIViewController для відображення інтерфейсу (опціонально), NSExtensionContext для введення-виведення даних і конфігурації Info.plist. Архітектура простіша, ніж у Share Extension: немає обов'язкового compose-інтерфейсу, і розширення може працювати повністю без UI.

Компоненти Action Extension

Таргет — окремий bundle з ідентифікатором, успадкованим від основного застосунку. UIViewController — опціональний інтерфейс для відображення прогресу, налаштувань або результату. NSExtensionContext — контейнер із вхідними даними (inputItems) і методом completeRequest для повернення результату. Info.plist — конфігурація активації через NSExtensionActivationRule та атрибути (NSExtensionAttributes) для вказівки підтримуваних типів контенту.

NSExtensionContext і потоки даних

Action Extension отримує вхідні дані через extensionContext?.inputItems — масив NSExtensionItem. Кожен елемент містить attachment-и з даними та UTI. Після обробки розширення викликає completeRequest(returningItems:) з масивом вихідних NSExtensionItem. Хост-застосунок отримує оброблені дані та відображає їх. Асинхронна модель: розширення може виконувати тривалі операції, утримуючи контекст до 30 секунд.

Створення Action Extension

Розглянемо створення Action Extension на Swift для перекладу виділеного тексту. Розширення отримує текст із хост-застосунку, надсилає його на сервер перекладу та повертає результат. ActionViewController — базовий контролер, створюваний Xcode при додаванні таргета.

swift
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, а одразу повертає оброблений контент.

swift
// 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 надсилає результат. Вибір режиму залежить від складності дії та необхідності користувацького введення.

Завантаження даних із attachment

Метод loadItem(forTypeIdentifier:) працює асинхронно — дані можуть бути великими (зображення, відео). NSItemProvider керує потоковим завантаженням і кешуванням. Для зображень використовуйте kUTTypeImage, для файлів — kUTTypeFileURL. Важливо: loadItem може викликатися на фоновому потоці — оновлюйте UI тільки через DispatchQueue.main.

Повернення модифікованих даних

Action Extension повертає оброблені дані через completeRequest з масивом NSExtensionItem. Кожен елемент відповідає типу вихідних даних. Хост-застосунок може замінити оригінальний контент на оброблений — наприклад, замінити оригінальне зображення на відфільтроване. NSExtensionItem підтримує ті ж UTI, що й на вході, плюс додаткові (наприклад, public.html для веб-контенту).

Сценарії використання Action Extension

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 без відкриття сторонніх сервісів.

Часто задавані питання

У чому ключова відмінність Action Extension від Share Extension?

Share Extension надсилає контент із хост-застосунку у ваш застосунок. Action Extension обробляє контент на місці та повертає результат назад. Share — передача, Action — трансформація. Це фундаментальне розрізнення визначає архітектуру та UX.

Чи може Action Extension не мати інтерфейсу?

Так. Якщо дія не потребує введення від користувача (наприклад, підрахунок символів), розширення може виконати її у фоні та одразу повернути результат через completeRequest. В Info.plist потрібно вказати NSExtensionActivationSupportsWebURL або інший UTI, що відповідає типу даних.

У яких застосунках з'являється Action Extension?

У будь-яких застосунках, які підтримують UIActivityViewController або стандартні контролери дій. Це Safari, Фото, Файли, Нотатки, Пошта та тисячі сторонніх застосунків. Action Extension не працює в застосунках, які не використовують стандартні механізми iOS для дій.

Як повернути оброблений контент у хост-застосунок?

Через extensionContext.completeRequest(returningItems:) з масивом NSExtensionItem. Кожен вихідний елемент містить NSItemProvider з обробленими даними. Хост-застосунок отримує результат у делегаті UIActivityViewController або аналогічному callback-у.

Які обмеження у Action Extension?

Розширення працює до 30 секунд, після чого iOS примусово завершує його. Немає доступу до основного застосунку безпосередньо — тільки через App Groups. Action Extension не може виконувати фонові завдання після завершення. Для тривалих операцій використовуйте фонові NSURLSession з повідомленням при наступному запуску.

Підсумки

  • Action Extension — розширення iOS для трансформації контенту прямо в хост-застосунку.
  • Від Share Extension відрізняється поверненням оброблених даних через NSExtensionContext.
  • Може працювати з UI або повністю у фоні без інтерфейсу.
  • Підтримує всі типи контенту: текст, зображення, URL, файли через UTI.
  • Використовується для перекладу, фільтрів, PDF-генерації, OCR та перевірки орфографії.
  • Обмеження часу виконання — 30 секунд, доступ до застосунку — через App Groups.
  • Action Extension використовується в 42% застосунків категорії «Продуктивність».

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також