Share Extension ist eine iOS-Erweiterung, die Ihre App zum systemeigenen Teilen-Menü hinzufügt. Der Benutzer kann Inhalte aus Safari, Fotos, Dateien oder jeder anderen App direkt an Ihre App senden — ohne Kopieren und Wechseln zwischen Fenstern. Laut Apple (2024) erhalten Apps mit Share Extension 35 % mehr Benutzerinhalte als Apps ohne Freigabefunktionen. Die Erweiterung verarbeitet Text, Bilder, Videos, URLs und Dateien über eine einheitliche NSExtensionItem-Schnittstelle.
Wichtige Punkte
Share Extension ist eine Art iOS-App-Erweiterung, die im systemeigenen Teilen-Menü erscheint, wenn in einer App Inhalte ausgewählt werden. Der Benutzer markiert Text in Safari, tippt auf Teilen und sieht Ihre App in der Liste der verfügbaren Aktionen. Nach der Auswahl wird der Inhalt zur Verarbeitung an die Erweiterung übergeben: Speichern, Veröffentlichen, Senden oder Transformieren.
Im Gegensatz zur Action Extension ist die Share Extension auf den Empfang von Inhalten aus externen Apps spezialisiert. Die Action Extension sendet hingegen Daten aus Ihrer App nach außen. Die Share Extension ist ein Einstiegspunkt für Benutzerinhalte, ein Schlüsselelement der Benutzerakquise: Benutzer testen Ihre App über die Share Extension, ohne sie vollständig zu installieren. Der App Store verbietet Apps, deren einzige Funktion die Anzeige von Werbung über die Share Extension ist (App Store Review Guideline 4.2).
Die Share Extension senkt die Einstiegshürde: Benutzer senden Inhalte aus einem vertrauten Kontext — Browser, Galerie, Dateimanager — an Ihre App. Laut Branch (2024) zeigen Apps mit Share Extension am 7. Tag eine um 28 % höhere Bindungsrate. Ein zusätzlicher Effekt ist die Viralität: Jedes Mal, wenn ein Benutzer Ihre App im Teilen-Menü sieht, findet passives Branding ohne Werbeausgaben statt.
Der Mechanismus der Share Extension basiert auf der Inhaltsübertragung über systemeigene NSExtensionItem-Container. Die Host-App (Safari, Fotos) verpackt den ausgewählten Inhalt in ein NSExtensionItem mit einem angegebenen Typ (public.image, public.url, public.plain-text). Das System übergibt diesen Container an die Erweiterung, die die Daten über extensionContext.inputItems extrahiert.
Die Share Extension wird in einem separaten Prozess mit begrenzter Ausführungszeit ausgeführt — etwa 30 Sekunden für die Verarbeitung. Die Erweiterung sollte keine langen synchronen Operationen durchführen. Zum Hochladen großer Dateien verwenden Sie NSURLSession mit einer Hintergrundkonfiguration. SLComposeServiceViewController ist die Basisklasse für Share Extension mit Inhaltsvorschau und Senden-Button.
iOS verwendet Uniform Type Identifiers (UTI), um den Typ des übertragenen Inhalts zu bestimmen. Wichtige UTIs für Share Extension: public.image (Fotos, Screenshots), public.url (Links), public.plain-text (Text), public.video (Videodateien) und public.file-url (Dateien). Die Erweiterung registriert unterstützte UTIs in der Info.plist über den Schlüssel NSExtensionActivationRule.
Die Share Extension besteht aus drei Komponenten: dem Xcode-Target, SLComposeServiceViewController und der Info.plist-Konfiguration. Die Architektur bestimmt, welche Inhaltstypen verarbeitet werden, wie die Benutzeroberfläche angezeigt wird und wo Daten gespeichert werden.
| Komponente | Zweck | Eigenschaften |
|---|---|---|
| Target | Erweiterungs-Target in Xcode | Separates Bundle mit einer Kennung |
| ViewController | Benutzeroberfläche und Verarbeitungslogik | SLComposeServiceViewController oder benutzerdefiniert |
| Info.plist | Aktivierungs- und UTI-Konfiguration | NSExtensionActivationRule mit Prädikaten |
| App Groups | Gemeinsamer Speicher mit der App | UserDefaults-Suite zur Datenübertragung |
Das Schlüsselelement der Share Extension-Konfiguration ist die Aktivierungsregel. Sie bestimmt, unter welchen Bedingungen die Erweiterung im Teilen-Menü erscheint. Die Regel wird in der Info.plist als Dictionary mit Einschränkungen festgelegt: maximale Anzahl von Bildern, minimale Textlänge, zwingende URL-Präsenz. Die Standardregel aktiviert die Erweiterung für einen beliebigen einzelnen Inhaltstyp.
// Info.plist — NSExtensionActivationRule für Share Extension
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Betrachten wir ein praktisches Beispiel für die Erstellung einer Share Extension in Swift für eine Lesezeichen-App. Die Erweiterung empfängt eine URL aus Safari, zeigt eine Vorschauoberfläche an und speichert den Link im App Group. SLComposeServiceViewController bietet eine fertige Benutzeroberfläche mit einem Textfeld und einem Veröffentlichen-Button.
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)
}
}
}
}
Nach dem Senden von Inhalten beendet die Erweiterung durch Aufruf von completeRequest — dies ist ein obligatorischer Schritt; ohne ihn gibt das System den Erweiterungsprozess nicht frei. Wichtig: Die Share Extension läuft in einer eingeschränkten Umgebung mit beschränktem Netzwerk- und Dateisystemzugriff — verwenden Sie Hintergrundsitzungen zum Hochladen von Inhalten.
Die Share Extension muss verschiedene Arten von Eingabedaten korrekt verarbeiten: Text, Bilder, Videos, URLs und Dateien. Jeder Typ verwendet seine eigene UTI und Extraktionsmethode. Universelle Verarbeitung — durch Iterieren über attachment.attachments mit hasItemConformingToTypeIdentifier-Prüfungen.
Bilder werden als public.image mit der Möglichkeit übergeben, sie über UIImage oder Data abzurufen. Verwenden Sie für große Bilder jpegData(compressionQuality:) vor dem Speichern. Die Share Extension sollte das Originalbild ohne ausdrückliche Benutzererlaubnis nicht ändern. Es wird empfohlen, das Original im App Group zu speichern und eine Vorschau für die Anzeige in der Benutzeroberfläche zu erstellen.
Safari und andere Browser übergeben URLs als public.url und ausgewählten Text als public.plain-text. Ein einzelnes NSExtensionItem kann beide Typen gleichzeitig enthalten — die URL der Seite und den darauf ausgewählten Text. Die Share Extension sollte alle Anhänge prüfen und relevante Daten extrahieren. Kombiniertes Szenario: Speichern Sie die URL als Lesezeichen und den Text als dazugehörige Notiz.
Die Share Extension und die Haupt-App werden in verschiedenen Prozessen ausgeführt und haben keinen gemeinsamen Zugriff auf das Dateisystem. Der Datenaustausch erfolgt über den App Groups-Mechanismus: einen gemeinsamen Container mit einer group.*-Kennung. Nach dem Speichern von Daten im App Group benachrichtigt die Erweiterung die App über CFNotificationCenter oder Darwin Notify.
App Groups werden in den Capabilities des Targets aktiviert: Wählen Sie App Groups aus und fügen Sie eine Kennung hinzu (z. B. group.com.example.myapp). Beide Targets — die Haupt-App und die Erweiterung — müssen Zugriff auf dieselbe Gruppe haben. UserDefaults-Suite ermöglicht das Lesen und Schreiben von Daten im gemeinsamen Speicher mit minimalem Overhead.
// Daten von Share Extension im App Group speichern
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()
Häufig gestellte Fragen
Share Extension empfängt Inhalte aus anderen Apps in Ihre App. Action Extension hingegen führt eine Aktion mit Inhalten innerhalb der Host-App aus — Text übersetzen, Bild bearbeiten. Share Extension ist Empfang, Action Extension ist Transformation.
Das hängt vom Inhaltstyp Ihrer App ab. Für Lesezeichen — public.url. Für einen Fotoeditor — public.image. Für Notizen — public.plain-text. Für mehrere Typen verwenden Sie NSExtensionActivationRule mit einer Kombination von AND/OR-Prädikaten.
Eine häufige Ursache ist eine falsche NSExtensionActivationRule oder ein UTI-Konflikt. Überprüfen Sie in der Info.plist: Die Aktivierungsregel muss mit dem getesteten Inhaltstyp übereinstimmen. Stellen Sie auch sicher, dass die Erweiterung in Einstellungen → Ihre App → Siri & Suchen aktiviert ist. Xcode Clean Build löst das Problem oft.
Das System weist etwa 30 Sekunden für die Ausführung zu. Danach beendet iOS den Erweiterungsprozess zwangsweise. Verwenden Sie für langlaufende Operationen eine Hintergrund-NSURLSession und verarbeiten Sie das Ergebnis beim nächsten App-Start.
Ja, anstelle von SLComposeServiceViewController können Sie einen normalen UIViewController verwenden. In diesem Fall haben Sie die vollständige Kontrolle über die Oberfläche. Sie müssen jedoch die Senden- und Abbrechen-Schaltflächen selbst implementieren. Benutzerdefinierte Oberfläche wird für nicht standardmäßige Inhaltsverarbeitungsszenarien empfohlen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch