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 е входна точка за потребителско съдържание, ключов елемент за привличане на потребители: потребителят изпробва приложението чрез Share Extension, без да го инсталира напълно. App Store забранява приложения, чиято единствена функция е показване на реклами чрез Share Extension (App Store Review Guideline 4.2).
Share Extension намалява бариерата за влизане: потребителят изпраща съдържание във вашето приложение от познат контекст — браузър, галерия, файлов мениджър. Според данни на Branch (2024), приложенията с Share Extension показват 28% по-високо задържане на 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 се състои от три компонента: целеви target в Xcode, SLComposeServiceViewController и конфигурация на Info.plist. Архитектурата определя кои типове съдържание се обработват, как се показва интерфейсът и къде се съхраняват данните.
| Компонент | Предназначение | Характеристики |
|---|---|---|
| Target | 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 предоставя готов потребителски интерфейс с текстово поле и бутон 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 на target-а: изберете „App Groups” и добавете идентификатор (напр. group.com.example.myapp). И двата target-а — основното приложение и разширението — трябва да имат достъп до една и съща група. 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: правилото за активиране трябва да съответства на тествания тип съдържание. Също така се уверете, че разширението е включено в Settings → вашето приложение → Siri & Search. Xcode clean build често решава проблема.
Системата отделя около 30 секунди за изпълнение. След това iOS принудително прекратява процеса на разширението. За дълги операции използвайте фонова NSURLSession с обработка на резултата при следващото стартиране на приложението.
Да, вместо SLComposeServiceViewController може да се използва обикновен UIViewController. В този случай вие напълно контролирате интерфейса. Бутоните за изпращане и отказ обаче трябва да реализирате сами. Персонализиран UI се препоръчва за нестандартни сценарии за обработка на съдържание.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също