Share Extension — is een iOS-extensie die uw app toevoegt aan het systeemmenu „Delen” (Share Sheet). De gebruiker kan inhoud uit Safari, Foto’s, Bestanden of een andere app rechtstreeks naar de uwe sturen — zonder kopiëren en schakelen tussen vensters. Volgens gegevens van Apple (2024) ontvangen apps met Share Extension 35% meer gebruikersinhoud dan apps zonder deelmogelijkheid. De extensie verwerkt tekst, afbeeldingen, video, URL’s en bestanden via een uniforme NSExtensionItem-interface.
Belangrijkste punten
Share Extension — is een type iOS app extension dat verschijnt in het systeemmenu „Delen” bij het selecteren van inhoud in elke app. De gebruiker selecteert tekst in Safari, drukt op „Delen” en ziet uw app in de lijst met beschikbare acties. Na selectie wordt de inhoud naar de extensie gestuurd voor verwerking: opslaan, publiceren, verzenden of transformeren.
In tegenstelling tot Action Extension is Share Extension gespecialiseerd in het ontvangen van inhoud van externe apps. Action Extension daarentegen stuurt gegevens van uw app naar buiten. Share Extension is het toegangspunt voor gebruikersinhoud, een sleutelelement voor gebruikerswerving: de gebruiker probeert de app via Share Extension zonder deze volledig te installeren. App Store verbiedt apps waarvan de enige functie het tonen van advertenties via Share Extension is (App Store Review Guideline 4.2).
Share Extension verlaagt de drempel: de gebruiker stuurt inhoud naar uw app vanuit een vertrouwde context — browser, galerij, bestandsbeheer. Volgens gegevens van Branch (2024) vertonen apps met Share Extension op dag 7 een 28% hogere retentie. Een extra effect — viraliteit: elke keer dat de gebruiker uw app in Share Sheet ziet, vindt er passieve branding plaats zonder advertentiekosten.
Het mechanisme van Share Extension is gebaseerd op het overdragen van inhoud via systeemcontainers NSExtensionItem. De host-app (Safari, Foto’s) verpakt de geselecteerde inhoud in NSExtensionItem met specificatie van het type (public.image, public.url, public.plain-text). Het systeem geeft deze container door aan de extensie, die de gegevens extraheert via extensionContext.inputItems.
Share Extension wordt gestart in een apart proces met beperkte uitvoeringstijd — ongeveer 30 seconden voor verwerking. De extensie mag geen langdurige bewerkingen synchroon uitvoeren. Gebruik NSURLSession met achtergrondconfiguratie voor het laden van grote bestanden. SLComposeServiceViewController — de basisklasse voor Share Extension met voorbeeld van inhoud en een verzendknop.
iOS gebruikt Uniform Type Identifiers (UTI) om het type overgedragen inhoud te bepalen. De belangrijkste UTI’s voor Share Extension: public.image (foto’s, schermafbeeldingen), public.url (links), public.plain-text (tekst), public.video (videobestanden) en public.file-url (bestanden). De extensie registreert ondersteunde UTI’s in Info.plist via de sleutel NSExtensionActivationRule.
Share Extension bestaat uit drie componenten: de doel-target in Xcode, SLComposeServiceViewController en de Info.plist-configuratie. De architectuur bepaalt welke inhoudstypen worden verwerkt, hoe de interface wordt weergegeven en waar gegevens worden opgeslagen.
| Component | Doel | Kenmerken |
|---|---|---|
| Target | Target van de extensie in Xcode | Aparte bundle met identificatie |
| ViewController | Interface en verwerkingslogica | SLComposeServiceViewController of aangepast |
| Info.plist | Configuratie van activering en UTI | NSExtensionActivationRule met predikaten |
| App Groups | Gedeelde opslag met de app | UserDefaults suite voor gegevensoverdracht |
Het sleutelelement van de Share Extension-configuratie — de activeringsregel. Deze bepaalt onder welke voorwaarden de extensie in Share Sheet verschijnt. De regel wordt in Info.plist gedefinieerd als een woordenboek met beperkingen: maximaal aantal afbeeldingen, minimale tekstlengte, verplichte aanwezigheid van een URL. De standaardregel activeert de extensie voor elk willekeurig inhoudstype.
// Info.plist — NSExtensionActivationRule voor Share Extension
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Laten we een praktisch voorbeeld bekijken van het maken van Share Extension in Swift voor een bladwijzer-app. De extensie ontvangt een URL uit Safari, toont een interface met voorbeeld en slaat de link op in App Group. SLComposeServiceViewController biedt een kant-en-klare UI met een tekstveld en een Post-knop.
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)
}
}
}
}
Na het verzenden van inhoud beëindigt de extensie zijn werk met het aanroepen van completeRequest — dit is een verplichte stap, zonder dit geeft het systeem het proces van de extensie niet vrij. Belangrijk: Share Extension werkt in een beperkte omgeving met beperkte toegang tot het netwerk en bestandssysteem — gebruik achtergrondsessies voor het laden van inhoud.
Share Extension moet verschillende soorten invoergegevens correct verwerken: tekst, afbeeldingen, video, URL’s en bestanden. Voor elk type wordt een eigen UTI en eigen methode voor gegevensextractie gebruikt. Universele verwerking — via een lus over attachment.attachments met controle van hasItemConformingToTypeIdentifier.
Afbeeldingen worden verzonden als public.image met de mogelijkheid om ze via UIImage of Data te verkrijgen. Gebruik voor grote afbeeldingen jpegData(compressionQuality:) voor het opslaan. Share Extension mag de originele afbeelding niet wijzigen zonder expliciete toestemming van de gebruiker. Het wordt aanbevolen het origineel in App Group op te slaan en een voorbeeld te maken voor weergave in de interface.
Safari en andere browsers verzenden de URL als public.url en de geselecteerde tekst als public.plain-text. Eén NSExtensionItem kan beide typen tegelijk bevatten — de URL van de pagina en de geselecteerde tekst erop. Share Extension moet alle attachments controleren en relevante gegevens extraheren. Gecombineerd scenario: de URL opslaan als bladwijzer en de tekst als notitie erbij.
Share Extension en de hoofdapp werken in verschillende processen en hebben geen gedeelde toegang tot het bestandssysteem. Voor gegevensuitwisseling wordt het mechanisme App Groups gebruikt: een gedeelde container met identificatie group.*. Na het opslaan van gegevens in App Group stelt de extensie de app op de hoogte via CFNotificationCenter of Darwin Notify.
App Groups worden ingeschakeld in de Capabilities van de target: selecteer „App Groups” en voeg een identificatie toe (bijvoorbeeld group.com.example.myapp). Beide targets — de hoofdapp en de extensie — moeten toegang hebben tot dezelfde groep. UserDefaults suite maakt het mogelijk om gegevens te lezen en te schrijven in de gedeelde opslag met minimale overhead.
// Gegevens opslaan in App Group vanuit 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()
Veelgestelde vragen
Share Extension ontvangt inhoud van andere apps in uw app. Action Extension daarentegen voert een actie uit op inhoud binnen de host-app — tekstvertaling, afbeeldingswijziging. Share Extension — ontvangst, Action Extension — transformatie.
Hangt af van het inhoudstype van uw app. Voor bladwijzers — public.url. Voor fotobewerker — public.image. Voor notities — public.plain-text. Voor meerdere typen gebruikt u NSExtensionActivationRule met een combinatie van AND/OR-predikaten.
Veelvoorkomende oorzaak — een onjuiste NSExtensionActivationRule of UTI-mismatch. Controleer in Info.plist: de activeringsregel moet overeenkomen met het geteste inhoudstype. Zorg er ook voor dat de extensie is ingeschakeld in Instellingen → uw app → Siri & Zoeken. Xcode clean build lost het probleem vaak op.
Het systeem wijst ongeveer 30 seconden toe voor uitvoering. Daarna beëindigt iOS het proces van de extensie geforceerd. Gebruik voor langdurige bewerkingen achtergrond-NSURLSession met verwerking van het resultaat bij de volgende start van de app.
Ja, in plaats van SLComposeServiceViewController kan een gewone UIViewController worden gebruikt. In dat geval heeft u volledige controle over de interface. De verzend- en annuleerknoppen moet u echter zelf implementeren. Aangepaste interface wordt aanbevolen voor niet-standaard scenario’s voor inhoudsverwerking.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook