Photo Editing Extension — είναι ένας μηχανισμός iOS που επιτρέπει σε εφαρμογές τρίτων να προσθέτουν εργαλεία επεξεργασίας απευθείας στην εφαρμογή συστήματος Φωτογραφίες. Σε αντίθεση με τους πλήρεις επεξεργαστές, η επέκταση δεν φορτώνει την εικόνα σε ξεχωριστή εφαρμογή — ο χρήστης εφαρμόζει φίλτρα, διορθώνει χρώματα ή προσθέτει εφέ χωρίς να εγκαταλείπει την τυπική διεπαφή. Σύμφωνα με το Apple Developer Documentation (2025), το PhotoKit παρέχει πάνω από 40 API για εργασία με πόρους φωτογραφιών, συμπεριλαμβανομένων των PHAdjustmentData και PHContentEditingController.
Βασικά σημεία
Photo Editing Extension — είναι ένας τύπος επέκτασης εφαρμογής στο iOS που εισάγει εργαλεία επεξεργασίας εικόνας στην τυπική διεπαφή της εφαρμογής Φωτογραφίες. Ο χρήστης ανοίγει μια φωτογραφία, πατά το κουμπί «Επεξεργασία» και επιλέγει την επιθυμητή επέκταση από τη λίστα εγκατεστημένων. Μετά την επεξεργασία, το αποτέλεσμα αποθηκεύεται ξανά στη βιβλιοθήκη και το αρχικό αρχείο παραμένει διαθέσιμο για επαναφορά.
Αυτή η αρχιτεκτονική λύνει το βασικό πρόβλημα εμπειρίας χρήστη: δεν χρειάζεται εναλλαγή μεταξύ εφαρμογών, εξαγωγή και εισαγωγή εικόνων ή παρακολούθηση εκδόσεων. Σύμφωνα με το WWDC 2025, όλες οι επεκτάσεις λειτουργούν σε απομονωμένη διεργασία με δικό τους sandbox και περιορισμένο χρόνο εκτέλεσης — έως 30 δευτερόλεπτα ανά λειτουργία επεξεργασίας.
Η επέκταση δεν έχει πρόσβαση σε αυθαίρετα αρχεία στη μνήμη της συσκευής — μόνο στη φωτογραφία που ο χρήστης παρέδωσε ρητά μέσω της διεπαφής επιλογής. Αυτό διασφαλίζει την ασφάλεια των δεδομένων χρήστη κατά τη χρήση εργαλείων τρίτων.
PhotoKit — είναι το πλαίσιο της Apple για εργασία με τη βιβλιοθήκη πολυμέσων της συσκευής, που εμφανίστηκε στο iOS 8. Παρέχει προγραμματιστική πρόσβαση σε πόρους Φωτογραφιών, συμπεριλαμβανομένων φωτογραφιών, βίντεο, άλμπουμ και μεταδεδομένων. Για επεκτάσεις επεξεργασίας, το PhotoKit λειτουργεί ως ενδιάμεσο επίπεδο μεταξύ αποθήκευσης και διεπαφής τροποποίησης.
PHAsset αντιπροσωπεύει ένα μεμονωμένο αντικείμενο πολυμέσων στη βιβλιοθήκη — μια φωτογραφία ή βίντεο. Μέσω του PHAsset μπορούν να ληφθούν μεταδεδομένα: ημερομηνία λήψης, τύπος αρχείου, τοποθεσία στο χάρτη και προσανατολισμός κάμερας. Το PHAssetResource παρέχει πρόσβαση σε βασικούς πόρους — για παράδειγμα, στο αρχικό αρχείο φωτογραφίας σε μορφή RAW ή HEIC.
Για την επέκταση επεξεργασίας, το PHContentEditingInput είναι κρίσιμο — ένα αντικείμενο που περιέχει το πλήρες αρχείο εικόνας (ή βίντεο) διαθέσιμο για ανάγνωση και επεξεργασία. Η επέκταση λαμβάνει αυτό το αντικείμενο τη στιγμή της ενεργοποίησης και το χρησιμοποιεί ως αρχικό υλικό.
PHImageManager διαχειρίζεται τη φόρτωση και προσωρινή αποθήκευση εικόνων. Για την επέκταση επεξεργασίας δεν χρησιμοποιείται άμεσα — η επέκταση λαμβάνει το πλήρες αρχείο μέσω PHContentEditingInput. Ωστόσο, το PHImageRequestOptions επιτρέπει τη διαμόρφωση παραμέτρων αιτήματος: μέγεθος, τύπο παράδοσης (σύγχρονο ή ασύγχρονο) και μορφή αποτελέσματος.
Σύμφωνα με την Apple, το PHImageManager αποθηκεύει αυτόματα μικρογραφίες εικόνων στη μνήμη RAM, γεγονός που επιταχύνει την εκ νέου εμφάνιση προεπισκοπήσεων. Για την επέκταση επεξεργασίας συνιστάται η χρήση PHImageRequestOptionsDeliveryModeHighQualityFormat για την επίτευξη της καλύτερης ποιότητας εικόνας.
let options = PHImageRequestOptions()
options.deliveryMode = .highQualityFormat
options.isSynchronous = true
PHImageManager.default().requestImage(
for: asset,
targetSize: .init(width: 1024, height: 1024),
contentMode: .aspectFill,
options: options
) { image, _ in
// χρησιμοποιήστε την εικόνα για εμφάνιση
}
Κάθε Photo Editing Extension υλοποιεί το πρωτόκολλο PHContentEditingController — το κεντρικό στοιχείο ελέγχου της επέκτασης. Το πρωτόκολλο ορίζει μεθόδους για εμφάνιση διεπαφής, λήψη δεδομένων εισόδου και αποθήκευση αποτελέσματος.
beginContentEditing(with:) καλείται κατά την έναρξη της συνεδρίας επεξεργασίας. Η επέκταση λαμβάνει PHContentEditingInput και πρέπει να εμφανίσει τη διεπαφή με την αρχική εικόνα. finishContentEditing(completionHandler:) ολοκληρώνει την επεξεργασία — η επέκταση επιστρέφει PHContentEditingOutput με το τροποποιημένο αρχείο και AdjustmentData. cancelContentEditing() ακυρώνει τις αλλαγές χωρίς αποθήκευση.
Σημαντική λεπτομέρεια: τη στιγμή της κλήσης beginContentEditing, η επέκταση έχει πρόσβαση μόνο σε μία έκδοση της φωτογραφίας — αυτήν που ζήτησε ο χρήστης. Δεν μπορεί να αποκτήσει πρόσβαση σε άλλη φωτογραφία ή άλμπουμ. Αυτός είναι περιορισμός sandbox που εισήχθη από την Apple για ασφάλεια.
class PhotoEditingViewController: UIViewController {
override func beginContentEditing(
with input: PHContentEditingInput
) {
guard let url = input.fullSizeImageURL else { return }
let image = CIImage(contentsOf: url)
displayImage.image = UIImage(ciImage: image)
}
}
PHContentEditingController διαχωρίζει τη διεπαφή επεξεργασίας από τη λογική αποθήκευσης. Η κύρια διεργασία iOS καλεί beginContentEditing, η επέκταση εμφανίζει το UI της, ο χρήστης κάνει αλλαγές, στη συνέχεια το finishContentEditing δημιουργεί ένα νέο αρχείο. Η Apple συνιστά όλη η επεξεργασία έντασης πόρων — φίλτρα CIFilter, χειρισμοί Core Image — να εκτελείται σε νήμα παρασκηνίου, όχι στο κύριο νήμα, για να μην μπλοκάρεται η διεπαφή.
PHAdjustmentData — ο βασικός μηχανισμός που εξασφαλίζει μη καταστροφική επεξεργασία στο Photo Editing Extension. Είναι ένα αντικείμενο που περιέχει πληροφορίες σχετικά με τις εφαρμοσμένες αλλαγές σε αυθαίρετη μορφή. Η επέκταση σειριοποιεί τις παραμέτρους φίλτρων, μάσκες και ρυθμίσεις σε AdjustmentData και τις αποθηκεύει μαζί με την τροποποιημένη εικόνα.
Κατά το άνοιγμα της φωτογραφίας ξανά, η επέκταση διαβάζει το AdjustmentData, επαναφέρει την προηγούμενη κατάσταση διεπαφής και επιτρέπει στον χρήστη να συνεχίσει την επεξεργασία από το ίδιο σημείο. Εάν η επέκταση δεν είναι εγκατεστημένη — η φωτογραφία εμφανίζεται στην τελευταία αποθηκευμένη έκδοση και το πρωτότυπο αποθηκεύεται ξεχωριστά.
Σύμφωνα με το Apple Documentation, το PHAdjustmentData αποθηκεύει formatIdentifier και formatVersion — συμβολοσειρές για αναγνώριση μορφής δεδομένων. Κατά την ενημέρωση της επέκτασης, θα πρέπει να ελέγχεται η έκδοση και να γίνεται σωστή επεξεργασία παλαιών μορφών.
let adjustmentData = PHAdjustmentData(
formatIdentifier: "com.example.photoediting",
formatVersion: "1.0",
data: NSKeyedArchiver.archivedData(
withRootObject: params,
requiringSecureCoding: true
)
)
output.adjustmentData = adjustmentData
Τη στιγμή του finishContentEditing, η επέκταση γράφει το AdjustmentData στο αντικείμενο PHContentEditingOutput μαζί με το τροποποιημένο αρχείο εικόνας. Το σύστημα στη συνέχεια αποθηκεύει και τα δύο στοιχεία: την έκδοση για εμφάνιση και τα μεταδεδομένα για επαναφορά της συνεδρίας επεξεργασίας.
Το Photo Editing Extension εμφανίζεται αυτόματα στο μενού της εφαρμογής Φωτογραφίες μετά την εγκατάσταση της εφαρμογής που το περιέχει. Ο χρήστης ανοίγει μια φωτογραφία, επιλέγει «Επεξεργασία» και στην κάτω σειρά εργαλείων εμφανίζονται όλες οι εγκατεστημένες επεκτάσεις επεξεργασίας — τόσο συστήματος όσο και τρίτων.
Η επέκταση καταχωρείται μέσω του Info.plist της κύριας εφαρμογής με το κλειδί NSExtensionActivationRule, το οποίο καθορίζει ποιοι τύποι περιεχομένου ενεργοποιούν την επέκταση. Για έναν επεξεργαστή φωτογραφιών, το ActivationRule συνήθως απαιτεί image — η επέκταση δεν θα εμφανίζεται για βίντεο ή ζωντανές φωτογραφίες.
Η Apple συνιστά τον καθορισμό συγκεκριμένων τύπων ενεργοποίησης για να μην υπερφορτώνεται το μενού επεξεργασίας. Εάν η επέκταση υποστηρίζει μόνο JPEG και HEIC, αξίζει να περιορίσετε την ενεργοποίηση σε αυτές τις μορφές.
<!-- Info.plist -->
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.photo-editing</string>
<key>NSExtensionActivationRule</key>
<string>SUBQUERY (extensionItems,
@count <= 1)</string>
</dict>
Μετά την επιλογή της επέκτασης, το iOS δημιουργεί μια ξεχωριστή διεργασία με ένα προσαρμοσμένο UIViewController που εμφανίζεται πάνω από τη διεπαφή Φωτογραφιών. Ο χρήστης βλέπει τη φωτογραφία του, τα εργαλεία της επέκτασης και τα κουμπιά «Ακύρωση» / «Τέλος». Η επέκταση δεν μπορεί να αλλάξει την πλοήγηση εκτός του ελεγκτή της ούτε να αποκτήσει πρόσβαση σε άλλα μέρη του συστήματος.
Σύμφωνα με το Human Interface Guidelines της Apple, η διεπαφή της επέκτασης πρέπει να είναι ελάχιστη και λειτουργική — χωρίς διαφημίσεις, εξωτερικούς συνδέσμους και περιττά στοιχεία πλοήγησης. Συνιστάται η χρήση UIScrollView για την εμφάνιση της παλέτας εργαλείων, ώστε να μην γεμίζει η οθόνη.
Συχνές Ερωτήσεις
Η επέκταση λαμβάνει PHContentEditingInput με το URL του πλήρους αρχείου εικόνας μέσω της μεθόδου beginContentEditing(with:). Η πρόσβαση παρέχεται μόνο σε μία επιλεγμένη φωτογραφία — χωρίς δικαιώματα σε άλλους πόρους της βιβλιοθήκης.
Όχι, το πρωτότυπο δεν αλλάζει ποτέ. Η επέκταση δημιουργεί μια νέα έκδοση μέσω PHContentEditingOutput και το AdjustmentData αποθηκεύει τις παραμέτρους αλλαγών για δυνατότητα επαναφοράς στην αρχική κατάσταση.
Η επέκταση λειτουργεί με όλες τις μορφές που υποστηρίζει το PhotoKit: JPEG, HEIC, RAW, PNG, TIFF και Live Photos. Οι περιορισμοί ορίζονται μέσω NSExtensionActivationRule στο Info.plist της επέκτασης.
Το iOS διαθέτει έως 30 δευτερόλεπτα για την εκτέλεση της λειτουργίας finishContentEditing. Σε περίπτωση υπέρβασης του ορίου, η επέκταση τερματίζεται αναγκαστικά και οι αλλαγές δεν αποθηκεύονται. Η επεξεργασία παρασκηνίου με CIFilter δεν παρατείνει αυτόν τον χρόνο.
Ναι, τα Core Image (CIFilter) και Metal (για προσαρμοσμένα shaders) υποστηρίζονται πλήρως. Η Apple συνιστά τη μεταφορά βαρέων υπολογισμών σε νήματα παρασκηνίου μέσω του Grand Central Dispatch.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης