Share Extension — este o extensie iOS care adaugă aplicația ta în meniul de sistem „Partajare” (Share Sheet). Utilizatorul poate trimite conținut din Safari, Fotografii, Fișiere sau orice altă aplicație direct în a ta — fără copiere și comutare între ferestre. Conform datelor Apple (2024), aplicațiile cu Share Extension primesc cu 35% mai mult conținut de la utilizatori decât aplicațiile fără posibilitate de partajare. Extensia procesează text, imagini, video, URL-uri și fișiere printr-o interfață unificată NSExtensionItem.
Principalele puncte
Share Extension — este un tip de extensie iOS app extension care apare în meniul de sistem „Partajare” la selectarea conținutului în orice aplicație. Utilizatorul selectează text în Safari, apasă „Partajare” și vede aplicația ta în lista acțiunilor disponibile. După selectare, conținutul este transmis extensiei pentru procesare: salvare, publicare, trimitere sau transformare.
Spre deosebire de Action Extension, Share Extension se specializează în primirea conținutului din aplicații externe. Action Extension, dimpotrivă, trimite date din aplicația ta în exterior. Share Extension este punctul de intrare al conținutului utilizatorului, un element cheie de achiziție a utilizatorilor: utilizatorul încearcă aplicația prin Share Extension, fără a o instala complet. App Store interzice aplicațiile a căror singură funcție este afișarea de reclame prin Share Extension (App Store Review Guideline 4.2).
Share Extension reduce bariera de intrare: utilizatorul trimite conținut în aplicația ta din contextul familiar — browser, galerie, manager de fișiere. Conform datelor Branch (2024), aplicațiile cu Share Extension arată o retenție cu 28% mai mare în ziua 7. Efect suplimentar — viralitatea: de fiecare dată când utilizatorul vede aplicația ta în Share Sheet, are loc un branding pasiv fără costuri de publicitate.
Mecanismul Share Extension se bazează pe transferul conținutului prin containerele de sistem NSExtensionItem. Aplicația gazdă (Safari, Fotografii) împachetează conținutul selectat în NSExtensionItem cu specificarea tipului (public.image, public.url, public.plain-text). Sistemul transmite acest container extensiei, care extrage datele prin extensionContext.inputItems.
Share Extension pornește într-un proces separat cu timp limitat de execuție — aproximativ 30 de secunde pentru procesare. Extensia nu trebuie să efectueze operații lungi sincron. Pentru încărcarea fișierelor mari, utilizați NSURLSession cu configurație de fundal. SLComposeServiceViewController — clasa de bază pentru Share Extension cu previzualizare a conținutului și buton de trimitere.
iOS utilizează Uniform Type Identifiers (UTI) pentru a determina tipul conținutului transmis. Principalele UTI pentru Share Extension: public.image (fotografii, capturi de ecran), public.url (linkuri), public.plain-text (text), public.video (fișiere video) și public.file-url (fișiere). Extensia înregistrează UTI-urile suportate în Info.plist prin cheia NSExtensionActivationRule.
Share Extension constă din trei componente: target-ul în Xcode, SLComposeServiceViewController și configurarea Info.plist. Arhitectura determină ce tipuri de conținut sunt procesate, cum este afișată interfața și unde sunt salvate datele.
| Componentă | Destinație | Caracteristici |
|---|---|---|
| Target | Target-ul extensiei în Xcode | Bundle separat cu identificator |
| ViewController | Interfața și logica de procesare | SLComposeServiceViewController sau personalizat |
| Info.plist | Configurarea activării și UTI | NSExtensionActivationRule cu predicate |
| App Groups | Stocare comună cu aplicația | UserDefaults suite pentru transfer de date |
Elementul cheie al configurării Share Extension — regula de activare. Determină în ce condiții apare extensia în Share Sheet. Regula se definește în Info.plist ca dicționar cu restricții: numărul maxim de imagini, lungimea minimă a textului, prezența obligatorie a URL-ului. Regula standard activează extensia pentru orice tip de conținut.
// Info.plist — NSExtensionActivationRule pentru Share Extension
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Să examinăm un exemplu practic de creare a Share Extension în Swift pentru o aplicație de marcaje. Extensia primește URL-ul din Safari, afișează o interfață cu previzualizare și salvează linkul în App Group. SLComposeServiceViewController oferă o interfață gata făcută cu câmp text și buton 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)
}
}
}
}
După trimiterea conținutului, extensia își încheie activitatea apelând completeRequest — acesta este un pas obligatoriu, fără el sistemul nu va elibera procesul extensiei. Important: Share Extension funcționează într-un mediu limitat cu acces restricționat la rețea și sistemul de fișiere — utilizați sesiuni de fundal pentru încărcarea conținutului.
Share Extension trebuie să proceseze corect diferite tipuri de date de intrare: text, imagini, video, URL-uri și fișiere. Pentru fiecare tip se utilizează propriul UTI și propria metodă de extragere a datelor. Procesare universală — printr-o buclă pe attachment.attachments cu verificarea hasItemConformingToTypeIdentifier.
Imaginile sunt transmise ca public.image cu posibilitatea de obținere prin UIImage sau Data. Pentru imagini mari, utilizați jpegData(compressionQuality:) înainte de salvare. Share Extension nu trebuie să modifice imaginea originală fără permisiunea explicită a utilizatorului. Se recomandă salvarea originalului în App Group și crearea unei previzualizări pentru afișarea în interfață.
Safari și alte browsere trimit URL-ul ca public.url, iar textul selectat ca public.plain-text. Un NSExtensionItem poate conține ambele tipuri simultan — URL-ul paginii și textul selectat pe aceasta. Share Extension trebuie să verifice toate attachment-urile și să extragă datele relevante. Scenariu combinat: salvați URL-ul ca marcaj, iar textul ca notă pentru acesta.
Share Extension și aplicația principală rulează în procese diferite și nu au acces comun la sistemul de fișiere. Pentru schimbul de date se utilizează mecanismul App Groups: un container comun cu identificatorul group.*. După salvarea datelor în App Group, extensia notifică aplicația prin CFNotificationCenter sau Darwin Notify.
App Groups se activează în Capabilities target-ului: selectați „App Groups” și adăugați un identificator (de exemplu, group.com.example.myapp). Ambele target-uri — aplicația principală și extensia — trebuie să aibă acces la același grup. UserDefaults suite permite citirea și scrierea datelor în stocarea comună cu cheltuieli generale minime.
// Salvarea datelor în App Group din 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()
Întrebări frecvente
Share Extension primește conținut din alte aplicații în a ta. Action Extension, dimpotrivă, execută o acțiune asupra conținutului în interiorul aplicației gazdă — traducerea textului, modificarea imaginii. Share Extension — primirea, Action Extension — transformarea.
Depinde de tipul de conținut al aplicației tale. Pentru marcaje — public.url. Pentru editor foto — public.image. Pentru note — public.plain-text. Pentru mai multe tipuri, utilizați NSExtensionActivationRule cu o combinație de predicate AND/OR.
Cauza frecventă — un NSExtensionActivationRule incorect sau nepotrivirea UTI. Verificați în Info.plist: regula de activare trebuie să corespundă tipului de conținut testat. De asemenea, asigurați-vă că extensia este activată în Settings → aplicația ta → Siri & Search. Xcode clean build rezolvă adesea problema.
Sistemul alocă aproximativ 30 de secunde pentru execuție. După aceasta, iOS încheie forțat procesul extensiei. Pentru operații lungi, utilizați NSURLSession de fundal cu procesarea rezultatului la următoarea pornire a aplicației.
Da, în loc de SLComposeServiceViewController se poate utiliza un UIViewController obișnuit. În acest caz, controlați complet interfața. Cu toate acestea, butoanele de trimitere și anulare trebuie implementate manual. Interfața personalizată este recomandată pentru scenarii nestandard de procesare a conținutului.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și