Share Extension — je rozšíření iOS, které přidá vaši aplikaci do systémové nabídky „Sdílet” (Share Sheet). Uživatel může odeslat obsah ze Safari, Fotografií, Souborů nebo jakékoli jiné aplikace přímo do vaší — bez kopírování a přepínání mezi okny. Podle údajů Apple (2024) získávají aplikace s Share Extension o 35% více uživatelského obsahu než aplikace bez možnosti sdílení. Rozšíření zpracovává text, obrázky, video, URL a soubory prostřednictvím jednotného rozhraní NSExtensionItem.
Hlavní body
Share Extension — je typ rozšíření iOS app extension, které se zobrazí v systémové nabídce „Sdílet” při výběru obsahu v jakékoli aplikaci. Uživatel vybere text v Safari, stiskne „Sdílet” a uvidí vaši aplikaci v seznamu dostupných akcí. Po výběru je obsah předán rozšíření ke zpracování: uložení, publikování, odeslání nebo transformaci.
Na rozdíl od Action Extension se Share Extension specializuje na příjem obsahu z externích aplikací. Action Extension naopak odesílá data z vaší aplikace ven. Share Extension je vstupním bodem uživatelského obsahu, klíčovým prvkem získávání uživatelů: uživatel vyzkouší aplikaci prostřednictvím Share Extension, aniž by ji plně instaloval. App Store zakazuje aplikace, jejichž jedinou funkcí je zobrazování reklam prostřednictvím Share Extension (App Store Review Guideline 4.2).
Share Extension snižuje bariéru vstupu: uživatel odesílá obsah do vaší aplikace ze známého kontextu — prohlížeče, galerie, správce souborů. Podle údajů Branch (2024) vykazují aplikace s Share Extension o 28% vyšší retenci 7. den. Další efekt — viralita: pokaždé, když uživatel vidí vaši aplikaci v Share Sheet, dochází k pasivnímu brandingu bez nákladů na reklamu.
Mechanismus Share Extension je založen na přenosu obsahu prostřednictvím systémových kontejnerů NSExtensionItem. Hostitelská aplikace (Safari, Fotografie) zabalí vybraný obsah do NSExtensionItem s uvedením typu (public.image, public.url, public.plain-text). Systém předá tento kontejner rozšíření, které extrahuje data prostřednictvím extensionContext.inputItems.
Share Extension se spouští v samostatném procesu s omezenou dobou provádění — přibližně 30 sekund na zpracování. Rozšíření by nemělo provádět dlouhé operace synchronně. Pro nahrávání velkých souborů používejte NSURLSession s konfigurací na pozadí. SLComposeServiceViewController — základní třída pro Share Extension s náhledem obsahu a tlačítkem odeslání.
iOS používá Uniform Type Identifiers (UTI) k určení typu přenášeného obsahu. Hlavní UTI pro Share Extension: public.image (fotografie, snímky obrazovky), public.url (odkazy), public.plain-text (text), public.video (video soubory) a public.file-url (soubory). Rozšíření registruje podporované UTI v Info.plist prostřednictvím klíče NSExtensionActivationRule.
Share Extension se skládá ze tří komponent: cílového targetu v Xcode, SLComposeServiceViewController a konfigurace Info.plist. Architektura určuje, jaké typy obsahu jsou zpracovávány, jak se zobrazuje rozhraní a kde jsou data ukládána.
| Komponenta | Účel | Vlastnosti |
|---|---|---|
| Target | Target rozšíření v Xcode | Samostatný bundle s identifikátorem |
| ViewController | Rozhraní a logika zpracování | SLComposeServiceViewController nebo vlastní |
| Info.plist | Konfigurace aktivace a UTI | NSExtensionActivationRule s predikáty |
| App Groups | Sdílené úložiště s aplikací | UserDefaults suite pro přenos dat |
Klíčový prvek konfigurace Share Extension — pravidlo aktivace. Určuje, za jakých podmínek se rozšíření zobrazí v Share Sheet. Pravidlo je definováno v Info.plist jako slovník s omezeními: maximální počet obrázků, minimální délka textu, povinná přítomnost URL. Standardní pravidlo aktivuje rozšíření pro jeden libovolný typ obsahu.
// Info.plist — NSExtensionActivationRule pro Share Extension
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Podívejme se na praktický příklad vytvoření Share Extension v Swift pro aplikaci záložek. Rozšíření obdrží URL ze Safari, zobrazí rozhraní s náhledem a uloží odkaz do App Group. SLComposeServiceViewController poskytuje hotové uživatelské rozhraní s textovým polem a tlačítkem 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)
}
}
}
}
Po odeslání obsahu rozšíření ukončí svou činnost voláním completeRequest — to je povinný krok, bez něj systém neuvolní proces rozšíření. Důležité: Share Extension pracuje v omezeném prostředí s omezeným přístupem k síti a souborovému systému — používejte relace na pozadí pro nahrávání obsahu.
Share Extension musí správně zpracovávat různé typy vstupních dat: text, obrázky, video, URL a soubory. Pro každý typ se používá vlastní UTI a vlastní metoda extrakce dat. Univerzální zpracování — prostřednictvím cyklu přes attachment.attachments s kontrolou hasItemConformingToTypeIdentifier.
Obrázky jsou přenášeny jako public.image s možností získání prostřednictvím UIImage nebo Data. U velkých obrázků použijte jpegData(compressionQuality:) před uložením. Share Extension by neměl upravovat původní obrázek bez výslovného souhlasu uživatele. Doporučuje se uložit originál do App Group a vytvořit náhled pro zobrazení v rozhraní.
Safari a další prohlížeče odesílají URL jako public.url a vybraný text jako public.plain-text. Jeden NSExtensionItem může obsahovat oba typy současně — URL stránky a na ní vybraný text. Share Extension by měl zkontrolovat všechny attachmenty a extrahovat relevantní data. Kombinovaný scénář: uložit URL jako záložku a text jako poznámku k ní.
Share Extension a hlavní aplikace běží v různých procesech a nemají společný přístup k souborovému systému. Pro výměnu dat se používá mechanismus App Groups: sdílený kontejner s identifikátorem group.*. Po uložení dat do App Group rozšíření upozorní aplikaci prostřednictvím CFNotificationCenter nebo Darwin Notify.
App Groups se zapínají v Capabilities targetu: vyberte „App Groups” a přidejte identifikátor (např. group.com.example.myapp). Oba targety — hlavní aplikace i rozšíření — musí mít přístup ke stejné skupině. UserDefaults suite umožňuje číst a zapisovat data do sdíleného úložiště s minimální režií.
// Ukládání dat do App Group z 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()
Často kladené otázky
Share Extension přijímá obsah z jiných aplikací do vaší. Action Extension naopak provádí akci s obsahem uvnitř hostitelské aplikace — překlad textu, úpravu obrázku. Share Extension — příjem, Action Extension — transformace.
Záleží na typu obsahu vaší aplikace. Pro záložky — public.url. Pro fotoeditor — public.image. Pro poznámky — public.plain-text. Pro více typů použijte NSExtensionActivationRule s kombinací predikátů AND/OR.
Častou příčinou je nesprávný NSExtensionActivationRule nebo neshoda UTI. Zkontrolujte v Info.plist: pravidlo aktivace musí odpovídat testovanému typu obsahu. Ujistěte se také, že je rozšíření povoleno v Nastavení → vaše aplikace → Siri a hledání. Xcode clean build problém často vyřeší.
Systém přiděluje přibližně 30 sekund na provedení. Poté iOS násilně ukončí proces rozšíření. Pro dlouhé operace použijte NSURLSession na pozadí se zpracováním výsledku při příštím spuštění aplikace.
Ano, místo SLComposeServiceViewController lze použít běžný UIViewController. V tomto případě máte plnou kontrolu nad rozhraním. Tlačítka odeslání a zrušení však musíte implementovat sami. Vlastní rozhraní se doporučuje pro nestandardní scénáře zpracování obsahu.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také