Share Extension — що це, як працює та розробка розширення

Автор: IT Sectr Опубліковано: 2026-06-15 Час читання: 10 хв

Share Extension — це розширення iOS, яке додає ваш додаток до системного меню «Поділитися» (Share Sheet). Користувач може надіслати контент із Safari, Фото, Файлів або будь-якого іншого додатку безпосередньо у ваш — без копіювання та перемикання між вікнами. За даними Apple (2024), додатки з Share Extension отримують на 35% більше користувацького контенту, ніж додатки без можливості шерінгу. Розширення обробляє текст, зображення, відео, URL та файли через уніфікований інтерфейс NSExtensionItem.

Головне

  • Share Extension — розширення iOS для надсилання контенту до додатку з інших програм.
  • NSExtensionItem — контейнер для передачі даних між хост-додатком і розширенням.
  • Info.plist — конфігурація типів контенту, які обробляє розширення.
  • SLServiceTypes — маппінг на соціальні мережі (Twitter, Facebook) для legacy-режиму.
  • App Groups — спільне сховище для передачі даних між розширенням і додатком.

Що таке Share Extension

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 важливий для додатку

Share Extension знижує бар'єр входу: користувач надсилає контент у ваш додаток із звичного контексту — браузера, галереї, файлового менеджера. За даними Branch (2024), додатки з Share Extension показують на 28% вищий retention на 7-й день. Додатковий ефект — віральність: щоразу, коли користувач бачить ваш додаток у Share Sheet, відбувається пасивний брендинг без витрат на рекламу.

Як працює Share Extension

Механізм Share Extension базується на передачі контенту через системні контейнери NSExtensionItem. Хост-додаток (Safari, Фото) упаковує вибраний контент у NSExtensionItem із зазначенням типу (public.image, public.url, public.plain-text). Система передає цей контейнер до розширення, яке вилучає дані через extensionContext.inputItems.

Життєвий цикл розширення

Share Extension запускається в окремому процесі з обмеженим часом виконання — близько 30 секунд на обробку. Розширення не повинно виконувати тривалих операцій синхронно. Для завантаження великих файлів використовуйте NSURLSession з фоновою конфігурацією. SLComposeServiceViewController — базовий клас для Share Extension з попереднім переглядом контенту та кнопкою надсилання.

Типи даних та Uniform Type Identifiers

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Конфігурація активації та UTINSExtensionActivationRule з предикатами
App GroupsСпільне сховище з додаткомUserDefaults suite для передачі даних

NSExtensionActivationRule

Ключовий елемент конфігурації Share Extension — правило активації. Воно визначає, за яких умов розширення з'являється в Share Sheet. Правило задається в Info.plist як словник з обмеженнями: максимальна кількість зображень, мінімальна довжина тексту, обов'язкова наявність URL. Стандартне правило активує розширення для одного будь-якого типу контенту.

objective-c
// 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

Розглянемо практичний приклад створення Share Extension на Swift для додатку-закладок. Розширення отримує URL із Safari, відображає інтерфейс з попереднім переглядом та зберігає посилання в App Group. SLComposeServiceViewController надає готовий UI з текстовим полем і кнопкою Post.

swift
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 та створювати прев'ю для відображення в інтерфейсі.

Обробка URL та тексту

Safari та інші браузери передають URL як public.url, а виділений текст — як public.plain-text. Один NSExtensionItem може містити обидва типи одночасно — URL сторінки та виділений на ній текст. Share Extension має перевірити всі attachment-и та вилучити релевантні дані. Комбінований сценарій: зберегти URL як закладку, а текст — як нотатку до неї.

App Groups та передача даних

Share Extension та основний додаток працюють у різних процесах і не мають спільного доступу до файлової системи. Для обміну даними використовується механізм App Groups: спільний контейнер з ідентифікатором group.*. Після збереження даних в App Group розширення повідомляє додаток через CFNotificationCenter або Darwin Notify.

Налаштування App Groups

App Groups вмикаються в Capabilities таргету: виберіть «App Groups» та додайте ідентифікатор (наприклад, group.com.example.myapp). Обидва таргети — основний додаток і розширення — повинні мати доступ до однієї групи. UserDefaults suite дозволяє читати та записувати дані в спільне сховище з мінімальними накладними витратами.

swift
// Збереження даних в 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, навпаки, виконує дію з контентом всередині хост-додатку — переклад тексту, зміна зображення. Share Extension — отримання, Action Extension — трансформація.

Які UTI потрібно вказувати в Info.plist?

Залежить від типу контенту вашого додатку. Для закладок — public.url. Для фоторедактора — public.image. Для нотаток — public.plain-text. Для кількох типів використовуйте NSExtensionActivationRule з комбінацією предикатів AND/OR.

Чому Share Extension не з'являється в Share Sheet?

Часта причина — некоректний NSExtensionActivationRule або неспівпадіння UTI. Перевірте в Info.plist: activation rule повинен відповідати тестованому типу контенту. Також переконайтеся, що розширення увімкнено в Settings → ваш додаток → Siri & Search. Xcode clean build часто вирішує проблему.

Скільки часу дається Share Extension на обробку?

Система виділяє близько 30 секунд на виконання. Після цього iOS примусово завершує процес розширення. Для тривалих операцій використовуйте фонову NSURLSession з обробкою результату при наступному запуску додатку.

Чи можна відобразити кастомний UI в Share Extension?

Так, замість SLComposeServiceViewController можна використовувати звичайний UIViewController. У цьому випадку ви повністю контролюєте інтерфейс. Однак кнопки надсилання та скасування потрібно реалізувати самостійно. Кастомний UI рекомендується для нестандартних сценаріїв обробки контенту.

Підсумки

  • Share Extension — розширення iOS, що додає додаток до системного меню «Поділитися».
  • Контент передається через NSExtensionItem з Uniform Type Identifiers.
  • Конфігурація активації задається в Info.plist через NSExtensionActivationRule.
  • SLComposeServiceViewController — базовий UI з попереднім переглядом і надсиланням.
  • App Groups — механізм обміну даними між розширенням і додатком.
  • Share Extension працює в лімітованому середовищі (30 сек, обмежений доступ).
  • Додатки з Share Extension отримують на 35% більше користувацького контенту.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також