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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође