Action Extension to rozszerzenie iOS, które wykonuje niestandardowe akcje na treści z innych aplikacji bez przełączania kontekstu. W przeciwieństwie do Share Extension, które wysyła dane do innej aplikacji, Action Extension przekształca treść bezpośrednio na miejscu: tłumaczy tekst, zmienia filtry obrazu, sprawdza pisownię lub generuje PDF. Według danych Apple (2024), Action Extension jest drugim najpopularniejszym typem rozszerzenia po Share Extension, używanym w 42% aplikacji kategorii „Produktywność”. Natychmiastowe działanie bez uruchamiania głównej aplikacji — kluczowa zaleta dla użytkownika.
Najważniejsze
Action Extension to typ rozszerzenia iOS app extension, który umożliwia wykonanie akcji na treści bezpośrednio w kontekście aplikacji hosta. Użytkownik zaznacza tekst w Safari, naciska „Akcje” i wybiera na przykład „Sprawdź pisownię” — rozszerzenie przetwarza tekst i zwraca wynik bez opuszczania przeglądarki. Rozszerzenie otrzymuje dane wejściowe przez NSExtensionContext i może zwrócić zmodyfikowaną treść z powrotem.
Action Extension pojawił się w iOS 8 jako część architektury app extensions. Jego kluczową cechą jest to, że rozszerzenie nie ma własnego interfejsu (opcjonalnie) i działa w kontekście aplikacji hosta. Użytkownik nie opuszcza bieżącego ekranu, co zapewnia minimalną przerwę poznawczą. Według Apple, Action Extension to jedyny typ rozszerzenia, który może jednocześnie czytać i modyfikować treść aplikacji hosta (przez NSExtensionContext ze zwrotem wyniku).
Action Extension jest używany w różnych scenariuszach: tłumaczenie tekstu w przeglądarce, tworzenie PDF ze strony internetowej, stosowanie filtru do zdjęcia w galerii, sprawdzanie pisowni w dowolnym polu tekstowym, skracanie URL, szyfrowanie tekstu i dodawanie do zakładek. Uniwersalność Action Extension czyni go popularnym narzędziem dla aplikacji kategorii „Narzędzia” i „Produktywność”.
Action Extension i Share Extension są często mylone, ale ich przeznaczenie jest zasadniczo różne. Share Extension wysyła treść z aplikacji hosta do twojej aplikacji; Action Extension przetwarza treść i zwraca ją z powrotem. Różnica wpływa na architekturę, doświadczenie użytkownika i wymagania konfiguracji Info.plist.
| Cecha | Action Extension | Share Extension |
|---|---|---|
| Przeznaczenie | Przekształcanie treści | Przekazywanie treści do aplikacji |
| Interfejs | Opcjonalnie (niestandardowy) | SLComposeServiceViewController |
| Zwrot danych | Tak, przez completeRequest | Nie |
| Kontekst | Pozostaje w aplikacji hosta | Przełącza się do rozszerzenia |
| Pozycja w menu | Action Sheet (górna część) | Share Sheet (dolna część) |
| Typowa akcja | Tłumaczenie, korekta, filtr | Zapisywanie, publikowanie |
Action Extension pojawia się w menu akcji (Action Sheet) po naciśnięciu przycisku „Udostępnij” lub „...”. iOS automatycznie umieszcza Action Extensions w górnej części arkusza (akcje), a Share Extensions w dolnej (aplikacje). Scenariusz użytkownika: zaznaczył tekst → nacisnął „Akcje” → wybrał twoje Action Extension → otrzymał przetworzony wynik bez przełączania aplikacji.
Action Extension składa się z targetu w Xcode, UIViewController do wyświetlania interfejsu (opcjonalnie), NSExtensionContext do wejścia-wyjścia danych oraz konfiguracji Info.plist. Architektura jest prostsza niż w Share Extension: nie ma obowiązkowego interfejsu compose, a rozszerzenie może działać całkowicie bez UI.
Target — oddzielny bundle z identyfikatorem dziedziczonym z głównej aplikacji. UIViewController — opcjonalny interfejs do wyświetlania postępu, ustawień lub wyniku. NSExtensionContext — kontener z danymi wejściowymi (inputItems) i metodą completeRequest do zwracania wyniku. Info.plist — konfiguracja aktywacji przez NSExtensionActivationRule i atrybuty (NSExtensionAttributes) do określania obsługiwanych typów treści.
Action Extension otrzymuje dane wejściowe przez extensionContext?.inputItems — tablicę NSExtensionItem. Każdy element zawiera załączniki z danymi i UTI. Po przetworzeniu rozszerzenie wywołuje completeRequest(returningItems:) z tablicą wyjściowych NSExtensionItem. Aplikacja hosta otrzymuje przetworzone dane i wyświetla je. Model asynchroniczny: rozszerzenie może wykonywać długotrwałe operacje, utrzymując kontekst do 30 sekund.
Rozważmy tworzenie Action Extension w Swift do tłumaczenia zaznaczonego tekstu. Rozszerzenie otrzymuje tekst z aplikacji hosta, wysyła go na serwer tłumaczeń i zwraca wynik. ActionViewController — podstawowy kontroler tworzony przez Xcode po dodaniu 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 przetworzeniu rozszerzenie zwraca wynik do aplikacji hosta. completeRequest z danymi wyjściowymi — alternatywny scenariusz, gdy rozszerzenie nie pokazuje UI, a od razu zwraca przetworzoną treść.
// Zwracanie przetworzonego tekstu do aplikacji hosta
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 może działać w dwóch trybach: z UI i bez UI. W trybie bez UI rozszerzenie wykonuje akcję całkowicie w tle i wywołuje completeRequest natychmiast po przetworzeniu. W trybie z UI rozszerzenie pokazuje kontroler, użytkownik potwierdza akcję, i dopiero wtedy completeRequest wysyła wynik. Wybór trybu zależy od złożoności akcji i konieczności wprowadzania danych przez użytkownika.
Metoda loadItem(forTypeIdentifier:) działa asynchronicznie — dane mogą być duże (obrazy, wideo). NSItemProvider zarządza strumieniowym wczytywaniem i buforowaniem. Dla obrazów użyj kUTTypeImage, dla plików — kUTTypeFileURL. Ważne: loadItem może być wywołany na wątku tła — aktualizuj UI tylko przez DispatchQueue.main.
Action Extension zwraca przetworzone dane przez completeRequest z tablicą NSExtensionItem. Każdy element odpowiada typowi danych wyjściowych. Aplikacja hosta może zastąpić oryginalną treść przetworzoną — na przykład zastąpić oryginalny obraz na przefiltrowany. NSExtensionItem obsługuje te same UTI co na wejściu, plus dodatkowe (np. public.html dla treści internetowych).
Action Extension jest stosowany w dziesiątkach scenariuszy — od prostych narzędzi po złożone procesy biznesowe. Klasyczne przykłady obejmują operacje tekstowe, graficzne i plikowe, a także integrację z treściami internetowymi.
Action Extension dla tekstu: tłumaczenie, sprawdzanie pisowni, liczenie znaków, zmiana wielkości liter, szyfrowanie, tworzenie kodu QR z tekstu. Użytkownik zaznacza tekst w dowolnej aplikacji z polem tekstowym (Safari, Notatki, Poczta) i jednym kliknięciem wykonuje akcję. Podświetlanie składni kodu, formatowanie Markdown i skracanie URL — popularne przykłady Action Extension dla zaawansowanych użytkowników.
Dla obrazów Action Extension oferuje: stosowanie filtrów, przycinanie, zmianę rozmiaru, konwersję formatów (HEIC na JPEG), dodawanie znaku wodnego, rozpoznawanie tekstu (OCR) i kompresję. Przetwarzanie obrazów powinno być szybkie — użytkownik oczekuje wyniku w ciągu 2–3 sekund. Do ciężkich operacji używaj Core Image na GPU lub kolejek tła.
Action Extension dla URL: tworzenie PDF ze strony internetowej, zapisywanie w Pocket/Pinterest, sprawdzanie szybkości strony, archiwizowanie strony, pobieranie metadanych Open Graph, generowanie zrzutu ekranu strony. Generowanie PDF — jeden z najpopularniejszych scenariuszy: użytkownik konwertuje stronę internetową na PDF bez otwierania zewnętrznych serwisów.
Często zadawane pytania
Share Extension wysyła treść z aplikacji hosta do twojej aplikacji. Action Extension przetwarza treść na miejscu i zwraca wynik z powrotem. Share — przekazywanie, Action — przekształcanie. To fundamentalna różnica określająca architekturę i UX.
Tak. Jeśli akcja nie wymaga wprowadzania danych od użytkownika (na przykład liczenie znaków), rozszerzenie może wykonać ją w tle i natychmiast zwrócić wynik przez completeRequest. W Info.plist należy określić NSExtensionActivationSupportsWebURL lub inny UTI odpowiadający typowi danych.
We wszystkich aplikacjach obsługujących UIActivityViewController lub standardowe kontrolery akcji. Są to Safari, Zdjęcia, Pliki, Notatki, Poczta i tysiące aplikacji firm trzecich. Action Extension nie działa w aplikacjach, które nie używają standardowych mechanizmów iOS dla akcji.
Przez extensionContext.completeRequest(returningItems:) z tablicą NSExtensionItem. Każdy element wyjściowy zawiera NSItemProvider z przetworzonymi danymi. Aplikacja hosta otrzymuje wynik w delegacie UIActivityViewController lub podobnym callbacku.
Rozszerzenie działa do 30 sekund, po czym iOS wymusza jego zakończenie. Nie ma bezpośredniego dostępu do głównej aplikacji — tylko przez App Groups. Action Extension nie może wykonywać zadań w tle po zakończeniu. Do długotrwałych operacji używaj NSURLSession w tle z powiadomieniem przy następnym uruchomieniu.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również