Share Extension — είναι μια επέκταση iOS που προσθέτει την εφαρμογή σας στο σύστημα μενού “Κοινοποίηση” (Share Sheet). Ο χρήστης μπορεί να στείλει περιεχόμενο από το Safari, τις Φωτογραφίες, τα Αρχεία ή οποιαδήποτε άλλη εφαρμογή απευθείας στη δική σας — χωρίς αντιγραφή και εναλλαγή μεταξύ παραθύρων. Σύμφωνα με δεδομένα της Apple (2024), οι εφαρμογές με Share Extension λαμβάνουν 35% περισσότερο περιεχόμενο χρηστών από εφαρμογές χωρίς δυνατότητα κοινοποίησης. Η επέκταση επεξεργάζεται κείμενο, εικόνες, βίντεο, URL και αρχεία μέσω ενοποιημένης διεπαφής NSExtensionItem.
Κύρια σημεία
Share Extension — είναι ένας τύπος επέκτασης iOS app extension που εμφανίζεται στο σύστημα μενού “Κοινοποίηση” κατά την επιλογή περιεχομένου σε οποιαδήποτε εφαρμογή. Ο χρήστης επιλέγει κείμενο στο Safari, πατά “Κοινοποίηση” και βλέπει την εφαρμογή σας στη λίστα διαθέσιμων ενεργειών. Μετά την επιλογή, το περιεχόμενο μεταφέρεται στην επέκταση για επεξεργασία: αποθήκευση, δημοσίευση, αποστολή ή μετατροπή.
Σε αντίθεση με το Action Extension, το Share Extension ειδικεύεται στη λήψη περιεχομένου από εξωτερικές εφαρμογές. Το Action Extension, αντίθετα, στέλνει δεδομένα από την εφαρμογή σας προς τα έξω. Το Share Extension είναι το σημείο εισόδου περιεχομένου χρήστη, ένα βασικό στοιχείο απόκτησης χρηστών: ο χρήστης δοκιμάζει την εφαρμογή μέσω του Share Extension χωρίς να την εγκαταστήσει πλήρως. Το App Store απαγορεύει εφαρμογές των οποίων η μοναδική λειτουργία είναι η εμφάνιση διαφημίσεων μέσω του Share Extension (App Store Review Guideline 4.2).
Το Share Extension μειώνει το εμπόδιο εισόδου: ο χρήστης στέλνει περιεχόμενο στην εφαρμογή σας από οικείο περιβάλλον — πρόγραμμα περιήγησης, συλλογή, διαχειριστή αρχείων. Σύμφωνα με δεδομένα της Branch (2024), οι εφαρμογές με Share Extension εμφανίζουν 28% υψηλότερη διατήρηση την 7η ημέρα. Πρόσθετο αποτέλεσμα — ιογενής διάδοση: κάθε φορά που ο χρήστης βλέπει την εφαρμογή σας στο Share Sheet, συμβαίνει παθητική προβολή επωνυμίας χωρίς κόστος διαφήμισης.
Ο μηχανισμός του Share Extension βασίζεται στη μεταφορά περιεχομένου μέσω συστημικών δοχείων NSExtensionItem. Η εφαρμογή-οικοδεσπότης (Safari, Φωτογραφίες) συσκευάζει το επιλεγμένο περιεχόμενο σε NSExtensionItem με καθορισμό τύπου (public.image, public.url, public.plain-text). Το σύστημα μεταφέρει αυτό το δοχείο στην επέκταση, η οποία εξάγει δεδομένα μέσω extensionContext.inputItems.
Το Share Extension εκκινείται σε ξεχωριστή διεργασία με περιορισμένο χρόνο εκτέλεσης — περίπου 30 δευτερόλεπτα για επεξεργασία. Η επέκταση δεν πρέπει να εκτελεί μακροχρόνιες λειτουργίες σύγχρονα. Για φόρτωση μεγάλων αρχείων, χρησιμοποιήστε NSURLSession με διαμόρφωση παρασκηνίου. SLComposeServiceViewController — βασική κλάση για Share Extension με προεπισκόπηση περιεχομένου και κουμπί αποστολής.
Το iOS χρησιμοποιεί Uniform Type Identifiers (UTI) για τον προσδιορισμό του τύπου μεταφερόμενου περιεχομένου. Τα κύρια UTI για Share Extension: public.image (φωτογραφίες, στιγμιότυπα οθόνης), public.url (σύνδεσμοι), public.plain-text (κείμενο), public.video (αρχεία βίντεο) και public.file-url (αρχεία). Η επέκταση καταχωρεί υποστηριζόμενα UTI στο Info.plist μέσω του κλειδιού NSExtensionActivationRule.
Το Share Extension αποτελείται από τρία στοιχεία: τον στόχο target στο Xcode, το SLComposeServiceViewController και τη διαμόρφωση Info.plist. Η αρχιτεκτονική καθορίζει ποιοι τύποι περιεχομένου υποβάλλονται σε επεξεργασία, πώς εμφανίζεται η διεπαφή και πού αποθηκεύονται τα δεδομένα.
| Στοιχείο | Σκοπός | Χαρακτηριστικά |
|---|---|---|
| Target | Στόχος επέκτασης στο Xcode | Ξεχωριστό bundle με αναγνωριστικό |
| ViewController | Διεπαφή και λογική επεξεργασίας | SLComposeServiceViewController ή προσαρμοσμένο |
| Info.plist | Διαμόρφωση ενεργοποίησης και UTI | NSExtensionActivationRule με κατηγορήματα |
| App Groups | Κοινόχρηστος αποθηκευτικός χώρος με την εφαρμογή | UserDefaults suite για μεταφορά δεδομένων |
Το βασικό στοιχείο διαμόρφωσης του Share Extension — ο κανόνας ενεργοποίησης. Καθορίζει υπό ποιες συνθήκες εμφανίζεται η επέκταση στο Share Sheet. Ο κανόνας ορίζεται στο Info.plist ως λεξικό με περιορισμούς: μέγιστος αριθμός εικόνων, ελάχιστο μήκος κειμένου, υποχρεωτική παρουσία URL. Ο τυπικός κανόνας ενεργοποιεί την επέκταση για οποιονδήποτε τύπο περιεχομένου.
// Info.plist — NSExtensionActivationRule για Share Extension
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Ας εξετάσουμε ένα πρακτικό παράδειγμα δημιουργίας Share Extension σε Swift για μια εφαρμογή σελιδοδεικτών. Η επέκταση λαμβάνει URL από το Safari, εμφανίζει μια διεπαφή με προεπισκόπηση και αποθηκεύει τον σύνδεσμο στο App Group. SLComposeServiceViewController παρέχει μια έτοιμη διεπαφή με πεδίο κειμένου και κουμπί 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)
}
}
}
}
Μετά την αποστολή περιεχομένου, η επέκταση ολοκληρώνει την εργασία της καλώντας το completeRequest — αυτό είναι υποχρεωτικό βήμα, χωρίς αυτό το σύστημα δεν θα ελευθερώσει τη διεργασία της επέκτασης. Σημαντικό: Το Share Extension λειτουργεί σε περιορισμένο περιβάλλον με περιορισμένη πρόσβαση στο δίκτυο και στο σύστημα αρχείων — χρησιμοποιήστε περιόδους λειτουργίας παρασκηνίου για φόρτωση περιεχομένου.
Το Share Extension πρέπει να επεξεργάζεται σωστά διάφορους τύπους δεδομένων εισόδου: κείμενο, εικόνες, βίντεο, URL και αρχεία. Για κάθε τύπο χρησιμοποιείται το δικό του UTI και η δική του μέθοδος εξαγωγής δεδομένων. Καθολική επεξεργασία — μέσω βρόχου στα attachment.attachments με έλεγχο hasItemConformingToTypeIdentifier.
Οι εικόνες μεταφέρονται ως public.image με δυνατότητα λήψης μέσω UIImage ή Data. Για μεγάλες εικόνες, χρησιμοποιήστε jpegData(compressionQuality:) πριν από την αποθήκευση. Το Share Extension δεν πρέπει να τροποποιεί την αρχική εικόνα χωρίς ρητή άδεια του χρήστη. Συνιστάται η αποθήκευση του πρωτοτύπου στο App Group και η δημιουργία προεπισκόπησης για εμφάνιση στη διεπαφή.
Το Safari και άλλα προγράμματα περιήγησης στέλνουν το URL ως public.url και το επιλεγμένο κείμενο ως public.plain-text. Ένα NSExtensionItem μπορεί να περιέχει και τους δύο τύπους ταυτόχρονα — το URL της σελίδας και το επιλεγμένο κείμενο σε αυτήν. Το Share Extension πρέπει να ελέγξει όλα τα attachment και να εξάγει σχετικά δεδομένα. Συνδυασμένο σενάριο: αποθήκευση του URL ως σελιδοδείκτη και του κειμένου ως σημείωσης για αυτόν.
Το Share Extension και η κύρια εφαρμογή λειτουργούν σε διαφορετικές διεργασίες και δεν έχουν κοινή πρόσβαση στο σύστημα αρχείων. Για ανταλλαγή δεδομένων χρησιμοποιείται ο μηχανισμός App Groups: κοινόχρηστο δοχείο με αναγνωριστικό group.*. Μετά την αποθήκευση δεδομένων στο App Group, η επέκταση ειδοποιεί την εφαρμογή μέσω CFNotificationCenter ή Darwin Notify.
Τα App Groups ενεργοποιούνται στα Capabilities του target: επιλέξτε “App Groups” και προσθέστε ένα αναγνωριστικό (π.χ. group.com.example.myapp). Και οι δύο στόχοι — η κύρια εφαρμογή και η επέκταση — πρέπει να έχουν πρόσβαση στην ίδια ομάδα. UserDefaults suite επιτρέπει την ανάγνωση και εγγραφή δεδομένων στον κοινόχρηστο αποθηκευτικό χώρο με ελάχιστο πρόσθετο κόστος.
// Αποθήκευση δεδομένων στο App Group από το 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()
Συχνές Ερωτήσεις
Το Share Extension λαμβάνει περιεχόμενο από άλλες εφαρμογές στη δική σας. Το Action Extension, αντίθετα, εκτελεί μια ενέργεια στο περιεχόμενο εντός της εφαρμογής-οικοδεσπότη — μετάφραση κειμένου, τροποποίηση εικόνας. Share Extension — λήψη, Action Extension — μετατροπή.
Εξαρτάται από τον τύπο περιεχομένου της εφαρμογής σας. Για σελιδοδείκτες — public.url. Για επεξεργαστή φωτογραφιών — public.image. Για σημειώσεις — public.plain-text. Για πολλούς τύπους, χρησιμοποιήστε NSExtensionActivationRule με συνδυασμό κατηγορημάτων AND/OR.
Συχνή αιτία — εσφαλμένος NSExtensionActivationRule ή αναντιστοιχία UTI. Ελέγξτε στο Info.plist: ο κανόνας ενεργοποίησης πρέπει να αντιστοιχεί στον τύπο περιεχομένου που δοκιμάζεται. Επίσης, βεβαιωθείτε ότι η επέκταση είναι ενεργοποιημένη στις Ρυθμίσεις → η εφαρμογή σας → Siri & Αναζήτηση. Xcode clean build συχνά λύνει το πρόβλημα.
Το σύστημα διαθέτει περίπου 30 δευτερόλεπτα για εκτέλεση. Μετά από αυτό, το iOS τερματίζει αναγκαστικά τη διεργασία της επέκτασης. Για μακροχρόνιες λειτουργίες, χρησιμοποιήστε NSURLSession παρασκηνίου με επεξεργασία του αποτελέσματος κατά την επόμενη εκκίνηση της εφαρμογής.
Ναι, αντί για SLComposeServiceViewController μπορεί να χρησιμοποιηθεί ένα κανονικό UIViewController. Σε αυτήν την περίπτωση, ελέγχετε πλήρως τη διεπαφή. Ωστόσο, τα κουμπιά αποστολής και ακύρωσης πρέπει να τα υλοποιήσετε μόνοι σας. Προσαρμοσμένη διεπαφή συνιστάται για μη τυπικά σενάρια επεξεργασίας περιεχομένου.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης