Action Extension este o extensie iOS care execută acțiuni personalizate cu conținut din alte aplicații fără a comuta contextul. Spre deosebire de Share Extension, care trimite date către o altă aplicație, Action Extension transformă conținutul direct pe loc: traduce text, schimbă filtrele imaginii, verifică ortografia sau generează PDF. Potrivit Apple (2024), Action Extension este al doilea cel mai popular tip de extensie după Share Extension, utilizat în 42% dintre aplicații din categoria „Productivitate”. Acțiunea instantanee fără a lansa aplicația principală — avantajul cheie pentru utilizator.
Principalele
Action Extension este un tip de extensie iOS care permite efectuarea unei acțiuni asupra conținutului direct în contextul aplicației gazdă. Utilizatorul selectează text în Safari, apasă „Acțiuni” și alege, de exemplu, „Verifică ortografia” — extensia procesează textul și returnează rezultatul fără a părăsi browserul. Extensia primește datele de intrare prin NSExtensionContext și poate returna conținutul modificat înapoi.
Action Extension a apărut în iOS 8 ca parte a arhitecturii extensiilor de aplicații. Caracteristica sa cheie este că extensia nu are interfață proprie (opțional) și rulează în contextul aplicației gazdă. Utilizatorul nu părăsește ecranul curent, ceea ce asigură o întrerupere cognitivă minimă. Potrivit Apple, Action Extension este singurul tip de extensie care poate citi și modifica simultan conținutul aplicației gazdă (prin NSExtensionContext cu returnarea rezultatului).
Action Extension este utilizat în diverse scenarii: traducerea textului în browser, crearea PDF dintr-o pagină web, aplicarea unui filtru unei fotografii în galerie, verificarea ortografiei în orice câmp de text, scurtarea URL, criptarea textului și adăugarea la marcaje. Versatilitatea Action Extension îl face un instrument popular pentru aplicațiile din categoria „Utilități” și „Productivitate”.
Action Extension și Share Extension sunt adesea confundate, dar scopul lor este fundamental diferit. Share Extension trimite conținutul din aplicația gazdă către aplicația ta; Action Extension procesează conținutul și îl returnează înapoi. Diferența afectează arhitectura, experiența utilizatorului și cerințele de configurare Info.plist.
| Caracteristică | Action Extension | Share Extension |
|---|---|---|
| Scop | Transformarea conținutului | Transmiterea conținutului în aplicație |
| Interfață | Opțional (personalizat) | SLComposeServiceViewController |
| Returnare date | Da, prin completeRequest | Nu |
| Context | Rămâne în aplicația gazdă | Se comută în extensie |
| Poziție în meniu | Action Sheet (partea de sus) | Share Sheet (partea de jos) |
| Acțiune tipică | Traducere, corectare, filtru | Salvare, publicare |
Action Extension apare în meniul de acțiuni (Action Sheet) la apăsarea butonului „Partajează” sau „...”. iOS plasează automat Action Extensions în partea de sus a foii (acțiuni), iar Share Extensions în partea de jos (aplicații). Scenariul utilizatorului: a selectat text → a apăsat „Acțiuni” → a ales Action Extension → a primit rezultatul procesat fără a comuta aplicațiile.
Action Extension constă dintr-un target în Xcode, UIViewController pentru afișarea interfeței (opțional), NSExtensionContext pentru intrare-ieșire date și configurarea Info.plist. Arhitectura este mai simplă decât la Share Extension: nu există o interfață de compunere obligatorie, iar extensia poate funcționa complet fără UI.
Target — un bundle separat cu un identificator moștenit de la aplicația principală. UIViewController — interfață opțională pentru afișarea progresului, setărilor sau rezultatului. NSExtensionContext — container cu date de intrare (inputItems) și metoda completeRequest pentru returnarea rezultatului. Info.plist — configurarea activării prin NSExtensionActivationRule și atribute (NSExtensionAttributes) pentru specificarea tipurilor de conținut suportate.
Action Extension primește datele de intrare prin extensionContext?.inputItems — un array de NSExtensionItem. Fiecare element conține atașamente cu date și UTI. După procesare, extensia apelează completeRequest(returningItems:) cu un array de NSExtensionItem de ieșire. Aplicația gazdă primește datele procesate și le afișează. Model asincron: extensia poate efectua operații lungi, menținând contextul până la 30 de secunde.
Să examinăm crearea unui Action Extension în Swift pentru traducerea textului selectat. Extensia primește textul din aplicația gazdă, îl trimite la serverul de traducere și returnează rezultatul. ActionViewController — controllerul de bază creat de Xcode la adăugarea targetului.
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
}
}
}
}
}
}
După procesare, extensia returnează rezultatul în aplicația gazdă. completeRequest cu date de ieșire — scenariul alternativ, când extensia nu afișează UI, ci returnează imediat conținutul procesat.
// Returnarea textului procesat către aplicația gazdă
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 poate funcționa în două moduri: cu UI și fără UI. În modul fără UI, extensia execută acțiunea complet în fundal și apelează completeRequest imediat după procesare. În modul cu UI, extensia afișează un controller, utilizatorul confirmă acțiunea și abia apoi completeRequest trimite rezultatul. Alegerea modului depinde de complexitatea acțiunii și de necesitatea intrării utilizatorului.
Metoda loadItem(forTypeIdentifier:) funcționează asincron — datele pot fi mari (imagini, video). NSItemProvider gestionează încărcarea în flux și stocarea în cache. Pentru imagini utilizați kUTTypeImage, pentru fișiere — kUTTypeFileURL. Important: loadItem poate fi apelat pe un fir de execuție de fundal — actualizați UI doar prin DispatchQueue.main.
Action Extension returnează datele procesate prin completeRequest cu un array de NSExtensionItem. Fiecare element corespunde tipului de date de ieșire. Aplicația gazdă poate înlocui conținutul original cu cel procesat — de exemplu, poate înlocui imaginea originală cu una filtrată. NSExtensionItem suportă aceleași UTI ca la intrare, plus altele suplimentare (de exemplu, public.html pentru conținut web).
Action Extension se aplică în zeci de scenarii — de la utilități simple la procese de afaceri complexe. Exemplele clasice includ operații text, grafice și fișiere, precum și integrarea cu conținut web.
Action Extension pentru text: traducere, verificare ortografie, numărare caractere, schimbare litere mari/mici, criptare, creare cod QR din text. Utilizatorul selectează textul în orice aplicație cu câmp text (Safari, Note, Mail) și cu un singur clic execută acțiunea. Evidențierea sintaxei codului, formatarea Markdown și scurtarea URL — exemple populare de Action Extension pentru utilizatori avansați.
Pentru imagini, Action Extension oferă: aplicarea filtrelor, decuparea, redimensionarea, conversia formatelor (HEIC în JPEG), adăugarea filigranului, recunoașterea textului (OCR) și compresia. Procesarea imaginilor trebuie să fie rapidă — utilizatorul așteaptă rezultatul în 2–3 secunde. Pentru operații grele, utilizați Core Image pe GPU sau cozi de fundal.
Action Extension pentru URL: crearea PDF dintr-o pagină web, salvarea în Pocket/Pinterest, verificarea vitezei site-ului, arhivarea paginii, obținerea metadatelor Open Graph, generarea capturii de ecran a paginii. Generarea PDF — unul dintre cele mai populare scenarii: utilizatorul convertește o pagină web în PDF fără a deschide servicii terțe.
Întrebări frecvente
Share Extension trimite conținutul din aplicația gazdă către aplicația ta. Action Extension procesează conținutul pe loc și returnează rezultatul înapoi. Share — transmitere, Action — transformare. Aceasta este diferența fundamentală care determină arhitectura și UX.
Da. Dacă acțiunea nu necesită introducere de la utilizator (de exemplu, numărarea caracterelor), extensia o poate executa în fundal și poate returna imediat rezultatul prin completeRequest. În Info.plist trebuie specificat NSExtensionActivationSupportsWebURL sau un alt UTI corespunzător tipului de date.
În orice aplicații care suportă UIActivityViewController sau controllerele standard de acțiuni. Acestea includ Safari, Fotografii, Fișiere, Note, Mail și mii de aplicații terțe. Action Extension nu funcționează în aplicațiile care nu utilizează mecanismele standard iOS pentru acțiuni.
Prin extensionContext.completeRequest(returningItems:) cu un array de NSExtensionItem. Fiecare element de ieșire conține NSItemProvider cu datele procesate. Aplicația gazdă primește rezultatul în delegatul UIActivityViewController sau într-un callback similar.
Extensia funcționează până la 30 de secunde, după care iOS o încheie forțat. Nu există acces direct la aplicația principală — doar prin App Groups. Action Extension nu poate executa sarcini în fundal după terminare. Pentru operații lungi, utilizați NSURLSession în fundal cu notificare la următoarea lansare.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și