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 се састоји од три компоненте: циљног таргета у 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-у: правило активације мора одговарати тестираном типу садржаја. Такође се уверите да је екстензија укључена у Settings → ваша апликација → Siri & Search. Xcode clean build често решава проблем.
Систем додељује око 30 секунди за извршење. Након тога iOS присилно завршава процес екстензије. За дуготрајне операције користите позадински NSURLSession са обрадом резултата при следећем покретању апликације.
Да, уместо SLComposeServiceViewController-а може се користити обичан UIViewController. У том случају у потпуности контролишете интерфејс. Међутим, дугмад за слање и отказивање морате сами имплементирати. Прилагођени UI се препоручује за нестандардне сценарије обраде садржаја.
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође