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 разширение, което ви позволява да извършите действие върху съдържание директно в контекста на хост приложението. Потребителят маркира текст в Safari, натиска „Действия” и избира например „Проверка на правописа” — разширението обработва текста и връща резултата, без да напуска браузъра. Разширението получава входни данни чрез NSExtensionContext и може да върне модифицираното съдържание обратно.

Action Extension се появи в iOS 8 като част от архитектурата на разширенията за приложения. Неговата ключова характеристика е, че разширението няма собствен интерфейс (по избор) и работи в контекста на хост приложението. Потребителят не напуска текущия екран, което осигурява минимално когнитивно прекъсване. Според 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 се състои от target в Xcode, UIViewController за показване на интерфейс (по избор), NSExtensionContext за вход-изход на данни и конфигурация на Info.plist. Архитектурата е по-проста от тази на Share Extension: няма задължителен compose интерфейс и разширението може да работи напълно без UI.

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

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

NSExtensionContext и потоци от данни

Action Extension получава входни данни чрез extensionContext?.inputItems — масив от NSExtensionItem. Всеки елемент съдържа прикачени файлове с данни и UTI. След обработка, разширението извиква completeRequest(returningItems:) с масив от изходни NSExtensionItem. Хост приложението получава обработените данни и ги показва. Асинхронен модел: разширението може да извършва дълги операции, задържайки контекста до 30 секунди.

Създаване на Action Extension

Нека разгледаме създаването на Action Extension в Swift за превод на маркиран текст. Разширението получава текст от хост приложението, изпраща го на преводачески сървър и връща резултата. ActionViewController — основният контролер, който Xcode създава при добавяне на target.

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
// Връщане на обработен текст към хост приложението
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 се прилага в десетки сценарии — от прости инструменти до сложни бизнес процеси. Класически примери включват текстови, графични и файлови операции, както и интеграция с уеб съдържание.

Текстови сценарии

Action Extension за текст: превод, проверка на правопис, броене на символи, промяна на регистър, криптиране, създаване на QR код от текст. Потребителят маркира текст във всяко приложение с текстово поле (Safari, Бележки, Поща) и с едно кликване изпълнява действието. Оцветяване на синтаксис на код, форматиране на 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 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също