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 е входна точка за потребителско съдържание, ключов елемент за привличане на потребители: потребителят изпробва приложението чрез Share Extension, без да го инсталира напълно. App Store забранява приложения, чиято единствена функция е показване на реклами чрез Share Extension (App Store Review Guideline 4.2).

Защо Share Extension е важен за приложението

Share Extension намалява бариерата за влизане: потребителят изпраща съдържание във вашето приложение от познат контекст — браузър, галерия, файлов мениджър. Според данни на Branch (2024), приложенията с Share Extension показват 28% по-високо задържане на 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 се състои от три компонента: целеви target в Xcode, SLComposeServiceViewController и конфигурация на Info.plist. Архитектурата определя кои типове съдържание се обработват, как се показва интерфейсът и къде се съхраняват данните.

КомпонентПредназначениеХарактеристики
TargetTarget на разширението в 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 предоставя готов потребителски интерфейс с текстово поле и бутон 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 на target-а: изберете „App Groups” и добавете идентификатор (напр. group.com.example.myapp). И двата target-а — основното приложение и разширението — трябва да имат достъп до една и съща група. 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: правилото за активиране трябва да съответства на тествания тип съдържание. Също така се уверете, че разширението е включено в 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 — базов интерфейс с преглед и изпращане.
  • App Groups — механизъм за обмен на данни между разширението и приложението.
  • Share Extension работи в ограничена среда (30 сек, ограничен достъп).
  • Приложенията с Share Extension получават 35% повече потребителско съдържание.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също