Action Extension е iOS разширение, което изпълнява персонализирани действия със съдържание от други приложения без превключване на контекст. За разлика от Share Extension, което изпраща данни към друго приложение, Action Extension трансформира съдържанието директно на място: превежда текст, променя филтри на изображения, проверява правопис или генерира PDF. Според данни на Apple (2024), Action Extension е вторият най-популярен тип разширение след Share Extension, използван в 42% от приложенията в категория „Производителност”. Незабавно действие без стартиране на основното приложение — ключово предимство за потребителя.
Основни точки
Action Extension — тип iOS разширение, което ви позволява да извършите действие върху съдържание директно в контекста на хост приложението. Потребителят маркира текст в Safari, натиска „Действия” и избира например „Проверка на правописа” — разширението обработва текста и връща резултата, без да напуска браузъра. Разширението получава входни данни чрез NSExtensionContext и може да върне модифицираното съдържание обратно.
Action Extension се появи в iOS 8 като част от архитектурата на разширенията за приложения. Неговата ключова характеристика е, че разширението няма собствен интерфейс (по избор) и работи в контекста на хост приложението. Потребителят не напуска текущия екран, което осигурява минимално когнитивно прекъсване. Според Apple, Action Extension е единственият тип разширение, което може едновременно да чете и модифицира съдържанието на хост приложението (чрез NSExtensionContext с връщане на резултат).
Action Extension се използва в различни сценарии: превод на текст в браузъра, създаване на PDF от уеб страница, прилагане на филтър към снимка в галерията, проверка на правопис във всяко текстово поле, съкращаване на URL, криптиране на текст и добавяне към отметки. Универсалността на Action Extension го прави популярен инструмент за приложения в категориите „Инструменти” и „Производителност”.
Action Extension и Share Extension често се бъркат, но предназначението им е коренно различно. Share Extension изпраща съдържание от хост приложението към вашето приложение; Action Extension обработва съдържанието и го връща обратно. Разликата влияе на архитектурата, потребителското изживяване и изискванията за конфигурация на 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 се състои от target в Xcode, UIViewController за показване на интерфейс (по избор), NSExtensionContext за вход-изход на данни и конфигурация на Info.plist. Архитектурата е по-проста от тази на Share Extension: няма задължителен compose интерфейс и разширението може да работи напълно без UI.
Target — отделен bundle с идентификатор, наследен от основното приложение. UIViewController — опционален интерфейс за показване на напредък, настройки или резултат. NSExtensionContext — контейнер с входни данни (inputItems) и метод completeRequest за връщане на резултат. Info.plist — конфигурация на активиране чрез NSExtensionActivationRule и атрибути (NSExtensionAttributes) за посочване на поддържаните типове съдържание.
Action Extension получава входни данни чрез extensionContext?.inputItems — масив от NSExtensionItem. Всеки елемент съдържа прикачени файлове с данни и UTI. След обработка, разширението извиква completeRequest(returningItems:) с масив от изходни NSExtensionItem. Хост приложението получава обработените данни и ги показва. Асинхронен модел: разширението може да извършва дълги операции, задържайки контекста до 30 секунди.
Нека разгледаме създаването на Action Extension в Swift за превод на маркиран текст. Разширението получава текст от хост приложението, изпраща го на преводачески сървър и връща резултата. ActionViewController — основният контролер, който Xcode създава при добавяне на target.
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, а веднага връща обработеното съдържание.
// Връщане на обработен текст към хост приложението
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, Бележки, Поща) и с едно кликване изпълнява действието. Оцветяване на синтаксис на код, форматиране на 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.plist трябва да се посочи 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също