Action Extension je rozšíření iOS, které provádí uživatelské akce s obsahem z jiných aplikací bez přepínání kontextu. Na rozdíl od Share Extension, které odesílá data do jiné aplikace, Action Extension transformuje obsah přímo na místě: překládá text, mění filtry obrázků, kontroluje pravopis nebo generuje PDF. Podle údajů Apple (2024) je Action Extension druhým nejoblíbenějším typem rozšíření po Share Extension, používaným ve 42 % aplikací kategorie „Produktivita”. Okamžitá akce bez spuštění hlavní aplikace — klíčová výhoda pro uživatele.
Hlavní body
Action Extension je typ rozšíření iOS, který umožňuje provést akci s obsahem přímo v kontextu hostitelské aplikace. Uživatel vybere text v Safari, stiskne „Akce” a zvolí například „Kontrola pravopisu” — rozšíření zpracuje text a vrátí výsledek, aniž by opustil prohlížeč. Rozšíření přijímá vstupní data prostřednictvím NSExtensionContext a může vrátit upravený obsah zpět.
Action Extension se objevil v iOS 8 jako součást architektury rozšíření aplikací. Jeho klíčovou vlastností je, že rozšíření nemá vlastní rozhraní (volitelně) a běží v kontextu hostitelské aplikace. Uživatel neopouští aktuální obrazovku, což zajišťuje minimální kognitivní přerušení. Podle Apple je Action Extension jediným typem rozšíření, které může současně číst a upravovat obsah hostitelské aplikace (prostřednictvím NSExtensionContext s vrácením výsledku).
Action Extension se používá v různých scénářích: překlad textu v prohlížeči, vytvoření PDF z webové stránky, aplikace filtru na fotografii v galerii, kontrola pravopisu v libovolném textovém poli, zkrácení URL, šifrování textu a přidání do záložek. Univerzálnost Action Extension z něj činí oblíbený nástroj pro aplikace kategorií „Nástroje” a „Produktivita”.
Action Extension a Share Extension jsou často zaměňovány, ale jejich účel je zásadně odlišný. Share Extension odesílá obsah z hostitelské aplikace do vaší aplikace; Action Extension obsah zpracovává a vrací jej zpět. Rozdíl ovlivňuje architekturu, uživatelský zážitek a požadavky na konfiguraci Info.plist.
| Vlastnost | Action Extension | Share Extension |
|---|---|---|
| Účel | Transformace obsahu | Přenos obsahu do aplikace |
| Rozhraní | Volitelné (vlastní) | SLComposeServiceViewController |
| Vrácení dat | Ano, prostřednictvím completeRequest | Ne |
| Kontext | Zůstává v hostitelské aplikaci | Přepíná do rozšíření |
| Pozice v nabídce | Action Sheet (horní část) | Share Sheet (spodní část) |
| Typická akce | Překlad, korekce, filtr | Uložení, publikování |
Action Extension se zobrazí v nabídce akcí (Action Sheet) po stisknutí tlačítka „Sdílet” nebo „...”. iOS automaticky umísťuje Action Extensions do horní části listu (akce) a Share Extensions do spodní části (aplikace). Uživatelský scénář: vybral text → stiskl „Akce” → zvolil vaše Action Extension → obdržel zpracovaný výsledek bez přepínání aplikací.
Action Extension se skládá z targetu v Xcode, UIViewController pro zobrazení rozhraní (volitelně), NSExtensionContext pro vstup-výstup dat a konfigurace Info.plist. Architektura je jednodušší než u Share Extension: není povinné rozhraní pro skládání a rozšíření může fungovat zcela bez UI.
Target — samostatný bundle s identifikátorem zděděným z hlavní aplikace. UIViewController — volitelné rozhraní pro zobrazení průběhu, nastavení nebo výsledku. NSExtensionContext — kontejner se vstupními daty (inputItems) a metodou completeRequest pro vrácení výsledku. Info.plist — konfigurace aktivace prostřednictvím NSExtensionActivationRule a atributů (NSExtensionAttributes) pro určení podporovaných typů obsahu.
Action Extension přijímá vstupní data prostřednictvím extensionContext?.inputItems — pole NSExtensionItem. Každý prvek obsahuje přílohy s daty a UTI. Po zpracování rozšíření zavolá completeRequest(returningItems:) s polem výstupních NSExtensionItem. Hostitelská aplikace obdrží zpracovaná data a zobrazí je. Asynchronní model: rozšíření může provádět dlouhé operace, přičemž kontext udržuje až 30 sekund.
Podívejme se na vytvoření Action Extension v Swift pro překlad vybraného textu. Rozšíření obdrží text z hostitelské aplikace, odešle jej na překladový server a vrátí výsledek. ActionViewController — základní kontrolér vytvořený Xcode při přidání targetu.
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
}
}
}
}
}
}
Po zpracování rozšíření vrátí výsledek do hostitelské aplikace. completeRequest s výstupními daty — alternativní scénář, kdy rozšíření nezobrazuje UI, ale okamžitě vrací zpracovaný obsah.
// Vrácení zpracovaného textu hostitelské aplikaci
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 může pracovat ve dvou režimech: s UI a bez UI. V režimu bez UI rozšíření provede akci zcela na pozadí a zavolá completeRequest ihned po zpracování. V režimu s UI rozšíření zobrazí kontrolér, uživatel potvrdí akci a teprve poté completeRequest odešle výsledek. Volba režimu závisí na složitosti akce a potřebě vstupu uživatele.
Metoda loadItem(forTypeIdentifier:) pracuje asynchronně — data mohou být velká (obrázky, videa). NSItemProvider spravuje streamované načítání a ukládání do mezipaměti. Pro obrázky použijte kUTTypeImage, pro soubory — kUTTypeFileURL. Důležité: loadItem může být volán na vlákně na pozadí — aktualizujte UI pouze prostřednictvím DispatchQueue.main.
Action Extension vrací zpracovaná data prostřednictvím completeRequest s polem NSExtensionItem. Každý prvek odpovídá typu výstupních dat. Hostitelská aplikace může nahradit původní obsah zpracovaným — například nahradit původní obrázek filtrovaným. NSExtensionItem podporuje stejná UTI jako na vstupu, plus další (např. public.html pro webový obsah).
Action Extension se uplatňuje v desítkách scénářů — od jednoduchých nástrojů po složité obchodní procesy. Klasické příklady zahrnují textové, grafické a souborové operace, stejně jako integraci s webovým obsahem.
Action Extension pro text: překlad, kontrola pravopisu, počítání znaků, změna velikosti písmen, šifrování, vytvoření QR kódu z textu. Uživatel vybere text v libovolné aplikaci s textovým polem (Safari, Poznámky, Pošta) a jedním kliknutím provede akci. Zvýrazňování syntaxe kódu, formátování Markdown a zkracování URL — oblíbené příklady Action Extension pro pokročilé uživatele.
Pro obrázky Action Extension nabízí: použití filtrů, oříznutí, změnu velikosti, konverzi formátů (HEIC na JPEG), přidání vodoznaku, rozpoznávání textu (OCR) a kompresi. Zpracování obrázků musí být rychlé — uživatel očekává výsledek do 2–3 sekund. Pro náročné operace použijte Core Image na GPU nebo fronty na pozadí.
Action Extension pro URL: vytvoření PDF z webové stránky, uložení do Pocket/Pinterest, kontrola rychlosti webu, archivace stránky, získání metadat Open Graph, generování snímku obrazovky stránky. Generování PDF — jeden z nejoblíbenějších scénářů: uživatel převede webovou stránku do PDF bez otevírání služeb třetích stran.
Často kladené otázky
Share Extension odesílá obsah z hostitelské aplikace do vaší aplikace. Action Extension zpracovává obsah na místě a vrací výsledek zpět. Share — přenos, Action — transformace. To je zásadní rozdíl určující architekturu a UX.
Ano. Pokud akce nevyžaduje vstup od uživatele (například počítání znaků), rozšíření ji může provést na pozadí a okamžitě vrátit výsledek prostřednictvím completeRequest. V Info.plist je třeba uvést NSExtensionActivationSupportsWebURL nebo jiné UTI odpovídající typu dat.
Ve všech aplikacích, které podporují UIActivityViewController nebo standardní kontroléry akcí. Patří mezi ně Safari, Fotky, Soubory, Poznámky, Pošta a tisíce aplikací třetích stran. Action Extension nefunguje v aplikacích, které nepoužívají standardní mechanismy iOS pro akce.
Prostřednictvím extensionContext.completeRequest(returningItems:) s polem NSExtensionItem. Každý výstupní prvek obsahuje NSItemProvider se zpracovanými daty. Hostitelská aplikace obdrží výsledek v delegátu UIActivityViewController nebo podobném callbacku.
Rozšíření pracuje až 30 sekund, poté jej iOS násilně ukončí. Neexistuje přímý přístup k hlavní aplikaci — pouze prostřednictvím App Groups. Action Extension nemůže po dokončení provádět úlohy na pozadí. Pro dlouhé operace použijte NSURLSession na pozadí s oznámením při příštím spuštění.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také