Share Extension — це розширення iOS, яке додає ваш додаток до системного меню «Поділитися» (Share Sheet). Користувач може надіслати контент із Safari, Фото, Файлів або будь-якого іншого додатку безпосередньо у ваш — без копіювання та перемикання між вікнами. За даними Apple (2024), додатки з Share Extension отримують на 35% більше користувацького контенту, ніж додатки без можливості шерінгу. Розширення обробляє текст, зображення, відео, URL та файли через уніфікований інтерфейс NSExtensionItem.
Головне
Share Extension — це тип розширення iOS app extension, яке з'являється в системному меню «Поділитися» при виборі контенту в будь-якому додатку. Користувач виділяє текст у Safari, натискає «Поділитися» і бачить ваш додаток у списку доступних дій. Після вибору контент передається до розширення для обробки: збереження, публікації, надсилання або перетворення.
На відміну від Action Extension, Share Extension спеціалізується на отриманні контенту із зовнішніх додатків. Action Extension, навпаки, надсилає дані з вашого додатку назовні. Share Extension — точка входу користувацького контенту, ключовий елемент user acquisition: користувач пробує додаток через Share Extension, не встановлюючи його повністю. App Store забороняє додатки, єдина функція яких — показувати рекламу через Share Extension (App Store Review Guideline 4.2).
Share Extension знижує бар'єр входу: користувач надсилає контент у ваш додаток із звичного контексту — браузера, галереї, файлового менеджера. За даними Branch (2024), додатки з Share Extension показують на 28% вищий retention на 7-й день. Додатковий ефект — віральність: щоразу, коли користувач бачить ваш додаток у Share Sheet, відбувається пасивний брендинг без витрат на рекламу.
Механізм Share Extension базується на передачі контенту через системні контейнери NSExtensionItem. Хост-додаток (Safari, Фото) упаковує вибраний контент у NSExtensionItem із зазначенням типу (public.image, public.url, public.plain-text). Система передає цей контейнер до розширення, яке вилучає дані через extensionContext.inputItems.
Share Extension запускається в окремому процесі з обмеженим часом виконання — близько 30 секунд на обробку. Розширення не повинно виконувати тривалих операцій синхронно. Для завантаження великих файлів використовуйте NSURLSession з фоновою конфігурацією. SLComposeServiceViewController — базовий клас для Share Extension з попереднім переглядом контенту та кнопкою надсилання.
iOS використовує Uniform Type Identifiers (UTI) для визначення типу контенту, що передається. Основні UTI для Share Extension: public.image (фото, скріншоти), public.url (посилання), public.plain-text (текст), public.video (відеофайли) та public.file-url (файли). Розширення реєструє підтримувані UTI у Info.plist через ключ NSExtensionActivationRule.
Share Extension складається з трьох компонентів: цільового таргету в Xcode, SLComposeServiceViewController та конфігурації Info.plist. Архітектура визначає, які типи контенту обробляються, як відображається інтерфейс і куди зберігаються дані.
| Компонент | Призначення | Особливості |
|---|---|---|
| Target | Таргет розширення в Xcode | Окремий bundle з ідентифікатором |
| ViewController | Інтерфейс і логіка обробки | SLComposeServiceViewController або кастомний |
| Info.plist | Конфігурація активації та UTI | NSExtensionActivationRule з предикатами |
| App Groups | Спільне сховище з додатком | UserDefaults suite для передачі даних |
Ключовий елемент конфігурації Share Extension — правило активації. Воно визначає, за яких умов розширення з'являється в Share Sheet. Правило задається в Info.plist як словник з обмеженнями: максимальна кількість зображень, мінімальна довжина тексту, обов'язкова наявність URL. Стандартне правило активує розширення для одного будь-якого типу контенту.
// Info.plist — NSExtensionActivationRule для Share Extension
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Розглянемо практичний приклад створення Share Extension на Swift для додатку-закладок. Розширення отримує URL із Safari, відображає інтерфейс з попереднім переглядом та зберігає посилання в App Group. SLComposeServiceViewController надає готовий UI з текстовим полем і кнопкою Post.
import Social
import MobileCoreServices
class ShareViewController: SLComposeServiceViewController {
override func isContentValid() -> Bool {
return !(contentText?.isEmpty() ?? true)
}
override func didSelectPost() {
guard let item = extensionContext?.inputItems.first as? NSExtensionItem
else { return }
for attachment in item.attachments ?? [] {
attachment.loadItem(forTypeIdentifier: kUTTypeURL as String) {
[weak self] (item, error) in
if let url = item as? URL {
BookmarkService().save(url, title: self?.contentText)
}
self?.extensionContext?.completeRequest(
returningItems: [], completionHandler: nil)
}
}
}
}
Після надсилання контенту розширення завершує роботу викликом completeRequest — це обов'язковий крок, без нього система не звільнить процес розширення. Важливо: Share Extension працює в лімітованому середовищі з обмеженим доступом до мережі та файлової системи — використовуйте фонові сесії для завантаження контенту.
Share Extension має коректно обробляти різні типи вхідних даних: текст, зображення, відео, URL та файли. Для кожного типу використовується свій UTI і свій метод вилучення даних. Універсальна обробка — через цикл по attachment.attachments з перевіркою hasItemConformingToTypeIdentifier.
Зображення передаються як public.image з можливістю отримання через UIImage або Data. Для великих зображень використовуйте jpegData(compressionQuality:) перед збереженням. Share Extension не повинен модифікувати оригінальне зображення без явного дозволу користувача. Рекомендується зберігати оригінал в App Group та створювати прев'ю для відображення в інтерфейсі.
Safari та інші браузери передають URL як public.url, а виділений текст — як public.plain-text. Один NSExtensionItem може містити обидва типи одночасно — URL сторінки та виділений на ній текст. Share Extension має перевірити всі attachment-и та вилучити релевантні дані. Комбінований сценарій: зберегти URL як закладку, а текст — як нотатку до неї.
Share Extension та основний додаток працюють у різних процесах і не мають спільного доступу до файлової системи. Для обміну даними використовується механізм App Groups: спільний контейнер з ідентифікатором group.*. Після збереження даних в App Group розширення повідомляє додаток через CFNotificationCenter або Darwin Notify.
App Groups вмикаються в Capabilities таргету: виберіть «App Groups» та додайте ідентифікатор (наприклад, group.com.example.myapp). Обидва таргети — основний додаток і розширення — повинні мати доступ до однієї групи. UserDefaults suite дозволяє читати та записувати дані в спільне сховище з мінімальними накладними витратами.
// Збереження даних в App Group з Share Extension
let sharedDefaults = UserDefaults(suiteName: "group.com.example.myapp")
let bookmark: [String: Any] = [
"url": url.absoluteString,
"title": contentText ?? "",
"date": Date().timeIntervalSince1970
]
sharedDefaults?.set(bookmark, forKey: "bookmark_\(Date().timeIntervalSince1970)")
sharedDefaults?.synchronize()
Часто задавані питання
Share Extension приймає контент з інших додатків у ваш. Action Extension, навпаки, виконує дію з контентом всередині хост-додатку — переклад тексту, зміна зображення. Share Extension — отримання, Action Extension — трансформація.
Залежить від типу контенту вашого додатку. Для закладок — public.url. Для фоторедактора — public.image. Для нотаток — public.plain-text. Для кількох типів використовуйте NSExtensionActivationRule з комбінацією предикатів AND/OR.
Часта причина — некоректний NSExtensionActivationRule або неспівпадіння UTI. Перевірте в Info.plist: activation rule повинен відповідати тестованому типу контенту. Також переконайтеся, що розширення увімкнено в Settings → ваш додаток → Siri & Search. Xcode clean build часто вирішує проблему.
Система виділяє близько 30 секунд на виконання. Після цього iOS примусово завершує процес розширення. Для тривалих операцій використовуйте фонову NSURLSession з обробкою результату при наступному запуску додатку.
Так, замість SLComposeServiceViewController можна використовувати звичайний UIViewController. У цьому випадку ви повністю контролюєте інтерфейс. Однак кнопки надсилання та скасування потрібно реалізувати самостійно. Кастомний UI рекомендується для нестандартних сценаріїв обробки контенту.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також