Action Extension — це розширення iOS, яке виконує користувацькі дії з контентом з інших застосунків без перемикання контексту. На відміну від Share Extension, який надсилає дані в інший застосунок, Action Extension трансформує вміст прямо на місці: перекладає текст, змінює фільтри зображення, перевіряє орфографію або генерує PDF. За даними Apple (2024), Action Extension — другий за популярністю тип розширень після Share Extension, який використовується в 42% застосунків категорії «Продуктивність». Миттєва дія без запуску основного застосунку — ключова перевага для користувача.
Головне
Action Extension — це тип iOS app extension, який дозволяє виконати дію з контентом прямо в контексті хост-застосунку. Користувач виділяє текст у Safari, натискає «Дії» та вибирає, наприклад, «Перевірити орфографію» — розширення обробляє текст і повертає результат, не залишаючи браузер. Розширення отримує вхідні дані через NSExtensionContext і може повернути модифікований контент назад.
Action Extension з'явився в iOS 8 як частина архітектури app extensions. Його ключова особливість — розширення не має власного інтерфейсу (опціонально) і виконується в контексті хост-застосунку. Користувач не залишає поточний екран, що забезпечує мінімальний когнітивний розрив. За даними 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 складається з таргета в Xcode, UIViewController для відображення інтерфейсу (опціонально), NSExtensionContext для введення-виведення даних і конфігурації Info.plist. Архітектура простіша, ніж у Share Extension: немає обов'язкового compose-інтерфейсу, і розширення може працювати повністю без UI.
Таргет — окремий bundle з ідентифікатором, успадкованим від основного застосунку. UIViewController — опціональний інтерфейс для відображення прогресу, налаштувань або результату. NSExtensionContext — контейнер із вхідними даними (inputItems) і методом completeRequest для повернення результату. Info.plist — конфігурація активації через NSExtensionActivationRule та атрибути (NSExtensionAttributes) для вказівки підтримуваних типів контенту.
Action Extension отримує вхідні дані через extensionContext?.inputItems — масив NSExtensionItem. Кожен елемент містить attachment-и з даними та UTI. Після обробки розширення викликає completeRequest(returningItems:) з масивом вихідних NSExtensionItem. Хост-застосунок отримує оброблені дані та відображає їх. Асинхронна модель: розширення може виконувати тривалі операції, утримуючи контекст до 30 секунд.
Розглянемо створення Action Extension на Swift для перекладу виділеного тексту. Розширення отримує текст із хост-застосунку, надсилає його на сервер перекладу та повертає результат. ActionViewController — базовий контролер, створюваний Xcode при додаванні таргета.
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, а одразу повертає оброблений контент.
// Returning processed text to host app
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, Notes, Mail) і одним натисканням виконує дію. Підсвітка синтаксису коду, форматування 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також