Share Extension — är ett iOS-tillägg som lägger till din app i systemets meny “Dela” (Share Sheet). Användaren kan skicka innehåll från Safari, Foton, Filer eller någon annan app direkt till din — utan att kopiera och växla mellan fönster. Enligt data från Apple (2024) får appar med Share Extension 35% mer användarinnehåll än appar utan delningsmöjlighet. Tillägget bearbetar text, bilder, video, URL:er och filer via ett enhetligt NSExtensionItem-gränssnitt.
Huvudpunkter
Share Extension — är en typ av iOS app extension som visas i systemets meny “Dela” när man väljer innehåll i någon app. Användaren markerar text i Safari, trycker på “Dela” och ser din app i listan över tillgängliga åtgärder. Efter val skickas innehållet till tillägget för bearbetning: spara, publicera, skicka eller omvandla.
Till skillnad från Action Extension är Share Extension specialiserad på att ta emot innehåll från externa appar. Action Extension skickar tvärtom data från din app utåt. Share Extension är en ingångspunkt för användarinnehåll, ett nyckelelement för användarförvärv: användaren provar appen via Share Extension utan att installera den helt. App Store förbjuder appar vars enda funktion är att visa annonser via Share Extension (App Store Review Guideline 4.2).
Share Extension sänker inträdesbarriären: användaren skickar innehåll till din app från ett bekant sammanhang — webbläsare, galleri, filhanterare. Enligt data från Branch (2024) visar appar med Share Extension 28% högre retention dag 7. En ytterligare effekt — viralitet: varje gång användaren ser din app i Share Sheet sker passiv varumärkesexponering utan annonskostnader.
Mekanismen för Share Extension bygger på överföring av innehåll via systemets NSExtensionItem-behållare. Värdappen (Safari, Foton) paketerar det valda innehållet i NSExtensionItem med angivelse av typ (public.image, public.url, public.plain-text). Systemet skickar denna behållare till tillägget, som extraherar data via extensionContext.inputItems.
Share Extension startas i en separat process med begränsad exekveringstid — cirka 30 sekunder för bearbetning. Tillägget bör inte utföra långa operationer synkront. För uppladdning av stora filer, använd NSURLSession med bakgrundskonfiguration. SLComposeServiceViewController — basklass för Share Extension med förhandsgranskning av innehåll och skicka-knapp.
iOS använder Uniform Type Identifiers (UTI) för att bestämma typen av överfört innehåll. De viktigaste UTI:erna för Share Extension: public.image (foton, skärmbilder), public.url (länkar), public.plain-text (text), public.video (videofiler) och public.file-url (filer). Tillägget registrerar stödda UTI:er i Info.plist via nyckeln NSExtensionActivationRule.
Share Extension består av tre komponenter: måltargeten i Xcode, SLComposeServiceViewController och Info.plist-konfigurationen. Arkitekturen bestämmer vilka innehållstyper som bearbetas, hur gränssnittet visas och var data lagras.
| Komponent | Syfte | Funktioner |
|---|---|---|
| Target | Target för tillägget i Xcode | Separat bundle med identifierare |
| ViewController | Gränssnitt och bearbetningslogik | SLComposeServiceViewController eller anpassad |
| Info.plist | Konfiguration av aktivering och UTI | NSExtensionActivationRule med predikat |
| App Groups | Gemensam lagring med appen | UserDefaults suite för dataöverföring |
Nyckelelementet i Share Extension-konfigurationen — aktiveringsregeln. Den bestämmer under vilka förhållanden tillägget visas i Share Sheet. Regeln definieras i Info.plist som en ordbok med begränsningar: maximalt antal bilder, minsta textlängd, obligatorisk förekomst av URL. Standardregeln aktiverar tillägget för en valfri innehållstyp.
// 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>
Låt oss titta på ett praktiskt exempel på att skapa Share Extension i Swift för en bokmärkesapp. Tillägget tar emot URL från Safari, visar ett gränssnitt med förhandsgranskning och sparar länken i App Group. SLComposeServiceViewController tillhandahåller ett färdigt gränssnitt med textfält och Post-knapp.
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)
}
}
}
}
Efter att ha skickat innehåll avslutar tillägget sitt arbete genom att anropa completeRequest — detta är ett obligatoriskt steg, utan det kommer systemet inte att frigöra tilläggets process. Viktigt: Share Extension fungerar i en begränsad miljö med begränsad åtkomst till nätverk och filsystem — använd bakgrundssessioner för att ladda upp innehåll.
Share Extension måste korrekt bearbeta olika typer av indata: text, bilder, video, URL:er och filer. För varje typ används en egen UTI och en egen metod för dataextraktion. Universal bearbetning — via en slinga över attachment.attachments med kontroll av hasItemConformingToTypeIdentifier.
Bilder överförs som public.image med möjlighet att hämtas via UIImage eller Data. För stora bilder, använd jpegData(compressionQuality:) före lagring. Share Extension bör inte ändra originalbilden utan uttryckligt tillstånd från användaren. Det rekommenderas att spara originalet i App Group och skapa en förhandsgranskning för visning i gränssnittet.
Safari och andra webbläsare skickar URL:en som public.url och den markerade texten som public.plain-text. En NSExtensionItem kan innehålla båda typerna samtidigt — sidans URL och den markerade texten på den. Share Extension bör kontrollera alla attachments och extrahera relevant data. Kombinerat scenario: spara URL:en som bokmärke och texten som en anteckning till den.
Share Extension och huvudappen körs i olika processer och har inte gemensam åtkomst till filsystemet. För datautbyte används mekanismen App Groups: en gemensam behållare med identifierare group.*. Efter att data sparats i App Group meddelar tillägget appen via CFNotificationCenter eller Darwin Notify.
App Groups aktiveras i targetens Capabilities: välj “App Groups” och lägg till en identifierare (t.ex. group.com.example.myapp). Båda targeten — huvudappen och tillägget — måste ha åtkomst till samma grupp. UserDefaults suite gör det möjligt att läsa och skriva data i den gemensamma lagringen med minimal overhead.
// Spara data i App Group från 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()
Vanliga frågor
Share Extension tar emot innehåll från andra appar till din app. Action Extension utför däremot en åtgärd på innehållet inuti värdappen — textöversättning, bildändring. Share Extension — mottagning, Action Extension — transformation.
Beror på din apps innehållstyp. För bokmärken — public.url. För fotoredigerare — public.image. För anteckningar — public.plain-text. För flera typer, använd NSExtensionActivationRule med en kombination av AND/OR-predikat.
Vanlig orsak — felaktig NSExtensionActivationRule eller UTI-mismatch. Kontrollera i Info.plist: aktiveringsregeln måste matcha den testade innehållstypen. Se också till att tillägget är aktiverat i Inställningar → din app → Siri och sökning. Xcode clean build löser ofta problemet.
Systemet tilldelar cirka 30 sekunder för exekvering. Efter det avslutar iOS tvångsmässigt tilläggets process. För långa operationer, använd bakgrunds-NSURLSession med bearbetning av resultatet vid nästa start av appen.
Ja, istället för SLComposeServiceViewController kan en vanlig UIViewController användas. I så fall har du full kontroll över gränssnittet. Skicka- och avbryt-knapparna måste du dock implementera själv. Anpassat gränssnitt rekommenderas för icke-standardiserade scenarier för innehållsbearbetning.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också