PhotoKit — είναι το πλαίσιο της Apple για εργασία με την πολυμεσική βιβλιοθήκη σε iOS και macOS, παρέχοντας άμεση πρόσβαση σε φωτογραφίες, βίντεο και Live Photos στη συσκευή. Σύμφωνα με την τεκμηρίωση της Apple, το πλαίσιο αντικαθιστά την παλαιότερη AssetsLibrary και υποστηρίζει iCloud, άλμπουμ, επεξεργασία και Change Tracking. PhotoKit παρέχει ένα ενοποιημένο API για ερωτήματα, προσωρινή αποθήκευση και αλλαγές στην πολυμεσική βιβλιοθήκη με αυτόματο συγχρονισμό μέσω iCloud.
Κύρια σημεία
PhotoKit — πλαίσιο της Apple (παρουσιάστηκε στο iOS 8, macOS 10.11), που παρέχει αντικειμενοστραφή API για εργασία με την πολυμεσική βιβλιοθήκη συστήματος. Σε αντίθεση με το AssetsLibrary, το PhotoKit λειτουργεί με την πολυμεσική βιβλιοθήκη ως βάση δεδομένων: τα ερωτήματα επιστρέφουν αντικείμενα PHAsset, PHCollection, PHCollectionList, που αντιπροσωπεύουν το περιεχόμενο και τη δομή αποθήκευσης.
Το PhotoKit υποστηρίζει όλους τους τύπους πολυμέσων: φωτογραφίες (JPEG, HEIF, RAW), βίντεο (MOV, MP4), Live Photos και σειριακές λήψεις. Το πλαίσιο διαχειρίζεται αυτόματα τον συγχρονισμό iCloud: αν η εικόνα είναι αποθηκευμένη στο iCloud, το PhotoKit την ζητά μέσω δικτύου και αναφέρει πρόοδο μέσω PHImageRequestOptions.progressHandler.
Το βασικό χαρακτηριστικό του PhotoKit — μοντέλο δεδομένων βασισμένο σε PHObject με τοπικό αναγνωριστικό (localIdentifier), που παραμένει σταθερό μεταξύ συνεδριών. Αυτό επιτρέπει την αποθήκευση αναφορών σε πολυμεσικά αντικείμενα και την επαναφορά τους μετά από επανεκκίνηση της εφαρμογής χωρίς νέο ερώτημα.
Το PhotoKit είναι χτισμένο σε τρία επίπεδα: μοντέλο δεδομένων (PHObject), ερωτήματα (PHFetchResult) και αλλαγές (PHPhotoLibrary.performChanges). Το μοντέλο δεδομένων είναι ιεραρχικό: το PHAsset (φωτογραφία/βίντεο) βρίσκεται μέσα σε PHAssetCollection (άλμπουμ), τα άλμπουμ ομαδοποιούνται σε PHCollectionList (φάκελος).
Τα ερωτήματα εκτελούνται μέσω PHAsset.fetchAssets και PHAssetCollection.fetchAssetCollections. Όλες οι μέθοδοι fetch είναι σύγχρονες και επιστρέφουν PHFetchResult, του οποίου το αντικείμενο εκτελεί αμέσως το ερώτημα στη βάση δεδομένων της πολυμεσικής βιβλιοθήκης. Το PHFetchResult υποστηρίζει γρήγορη πρόσβαση βάσει ευρετηρίου (object(at:)) και απαρίθμηση μέσω enumerateObjects.
PHFetchOptions — αντικείμενο για διαμόρφωση ερωτήματος: ταξινόμηση (sortDescriptors), κατηγόρημα (predicate), συμπερίληψη κρυφών και διαγραμμένων πολυμέσων (includeHiddenAssets, includeAllBurstAssets). Οι επιλογές fetch επιτρέπουν φιλτράρισμα κατά τύπο πολυμέσου: PHAssetMediaType.image, .video, .audio.
Το PhotoKit περιλαμβάνει ένα σύνολο κλάσεων για πρόσβαση, ερώτημα και αλλαγή της πολυμεσικής βιβλιοθήκης. Η κατανόηση κάθε μίας είναι απαραίτητη για αποτελεσματική εργασία με το πλαίσιο.
PHAsset — αμετάβλητο αντικείμενο που αντιπροσωπεύει ένα μεμονωμένο πολυμεσικό περιεχόμενο. Περιέχει μεταδεδομένα: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (για βίντεο), isFavorite, burstIdentifier. LocalIdentifier — σταθερό κλειδί κειμένου, προσβάσιμο ακόμη και μετά από επανεκκίνηση της εφαρμογής.
PHAssetCollection — ομάδα πολυμέσων: άλμπουμ συστήματος (Recents, Favorites, Selfies, Screenshots), άλμπουμ χρήστη ή Moments (αυτόματα ομαδοποιημένα κατά χρόνο και τοποθεσία). Χαρακτηριστικά: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.
PHCollectionList — φάκελος που περιέχει άλμπουμ (PHAssetCollection) ή άλλους φακέλους. Χρησιμοποιείται σπάνια, κυρίως για εμφάνιση ιεραρχίας στη διεπαφή χρήστη.
Το PhotoKit δεν επιστρέφει UIImage απευθείας από το PHAsset — πρέπει να ζητήσετε την εικόνα μέσω PHImageManager. Αυτό εγγυάται ότι η εικόνα φορτώνεται λαμβάνοντας υπόψη το iCloud, την προσωρινή αποθήκευση και το απαιτούμενο μέγεθος.
| Στοιχείο | Σκοπός | Χαρακτηριστικό |
|---|---|---|
| PHImageManager.default() | Τυπικός διαχειριστής για μεμονωμένα ερωτήματα | Χωρίς προσωρινή αποθήκευση μεταξύ ερωτημάτων |
| PHCachingImageManager | Διαχειριστής με προφόρτωση για συλλογές | startCachingImages για ομαλή κύλιση |
| PHImageRequestOptions | Ρυθμίσεις ερωτήματος: μέγεθος, λειτουργία, παράδοση | synchronous, deliveryMode, progressHandler |
| PHImageRequestID | Αναγνωριστικό ερωτήματος για ακύρωση | cancelImageRequest(PHImageRequestID) |
Το PHImageManager υποστηρίζει τρεις λειτουργίες παράδοσης: opportunistic (πρώτα μειωμένη έκδοση, μετά πλήρης), highQualityFormat (μόνο πλήρης ποιότητα) και fastFormat (ταχύτερη διαθέσιμη έκδοση). Για συλλογές χρησιμοποιείτε πάντα PHCachingImageManager με προφόρτωση εικόνων για ορατά κελιά.
Το PhotoKit χρησιμοποιείται για τη δημιουργία προσαρμοσμένων γκαλερί, επεξεργαστών και εφαρμογών για εργασία με πολυμέσα. Ας εξετάσουμε τρία βασικά σενάρια.
PHAsset.fetchAssets με PHFetchOptions και ταξινόμηση κατά ημερομηνία δημιουργίας — βασικό ερώτημα για τη δημιουργία προσαρμοσμένης φωτογραφικής γκαλερί. Το PHFetchResult υποστηρίζει τεμπέλικη φόρτωση και πρόσβαση ροής.
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(
key: "creationDate",
ascending: .false
)]
options.predicate = NSPredicate(
format: "mediaType == %d",
PHAssetMediaType.image.rawValue
)
let allPhotos = PHAsset.fetchAssets(with: options)
print("Βρέθηκαν \(allPhotos.count) φωτογραφίες")
allPhotos.enumerateObjects { asset, index, stop in
print("Φωτογραφία \(index): \(asset.localIdentifier)")
}
PHFetchResult — ασφαλές για νήματα δοχείο. Η πρόσβαση σε αντικείμενα βάσει ευρετηρίου μέσω object(at:) δεν μπλοκάρει το UI, αλλά το αίτημα εικόνας μέσω PHImageManager πρέπει να εκτελείται ασύγχρονα.
PHCachingImageManager — υποκλάση του PHImageManager με μεθόδους startCachingImages και stopCachingImages για προφόρτωση. Χρησιμοποιείται στο UICollectionView για ομαλή κύλιση.
let cachingManager = PHCachingImageManager()
let targetSize = CGSize(width: 200, height: 200)
// Προφόρτωση για ορατά κελιά
cachingManager.startCachingImages(
for: visibleAssets,
targetSize: targetSize,
contentMode: .aspectFill,
options: nil
)
// Αίτημα εικόνας μέσω PHImageRequestOptions με iCloud fallback
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
DispatchQueue.main.async {
print("Λήψη από iCloud: \(progress * 100)%")
}
}
let requestID = cachingManager.requestImage(
for: asset,
targetSize: targetSize,
contentMode: .aspectFill,
options: requestOptions
) { image, info in
print("Εικόνα λήφθηκε: \(image?.size ?? .zero)")
}
Οι αλλαγές στην πολυμεσική βιβλιοθήκη εκτελούνται μέσω PHPhotoLibrary.shared().performChanges εντός του μπλοκ changeRequest. Όλες οι λειτουργίες ομαδοποιούνται και εφαρμόζονται συναλλαγματικά.
PHPhotoLibrary.shared().performChanges {
let changeRequest = PHAssetChangeRequest(for: asset)
changeRequest.isFavorite = .true
} completionHandler: { success, error in
if success {
print("Προστέθηκε στα αγαπημένα")
}
}
Το PhotoKit παρέχει μηχανισμό παρακολούθησης αλλαγών στην πολυμεσική βιβλιοθήκη μέσω του πρωτοκόλλου PHPhotoLibraryChangeObserver. Σε οποιαδήποτε αλλαγή (δημιουργία, διαγραφή, επεξεργασία) καλείται η μέθοδος photoLibraryDidChange με αντικείμενο PHChange.
Το PHChange περιέχει changeDetails για κάθε τύπο ερωτήματος: PHFetchResultChangeDetails με removedIndexes, insertedIndexes, changedIndexes. Αυτό επιτρέπει την εφαρμογή αλλαγών στο UI με κινούμενα σχέδια: performBatchUpdates με move, insert, delete για UICollectionView.
class PhotosViewController: UIViewController {
var fetchResult: PHFetchResult>PHAsset>?
override func viewDidLoad() {
super.viewDidLoad()
PHPhotoLibrary.shared().register(self)
}
deinit {
PHPhotoLibrary.shared().unregisterChangeObserver(self)
}
}
extension PhotosViewController: PHPhotoLibraryChangeObserver {
func photoLibraryDidChange(_ changeInstance: PHChange) {
guard let fetchResult,
let details = changeInstance.changeDetails(for: fetchResult)
else { return }
DispatchQueue.main.async {
self.fetchResult = details.fetchResultAfterChanges
// Εφαρμογή αλλαγών στο collectionView
}
}
}
Το PhotoKit υποστηρίζει επεξεργασία πολυμέσων μέσω του μηχανισμού PHContentEditingInput και PHContentEditingOutput. Η εφαρμογή ζητά editingInput με πρωτότυπα δεδομένα, εφαρμόζει αλλαγές και αποθηκεύει το αποτέλεσμα μέσω editingOutput. Το πλαίσιο διατηρεί αυτόματα το πρωτότυπο, επιτρέποντας στον χρήστη να αναιρέσει αλλαγές μέσω επαναφοράς στο πρωτότυπο.
Οι φωτογραφίες RAW (DNG, CR2, NEF) υποστηρίζονται μέσω PHAssetResourceManager, το οποίο παρέχει πρόσβαση στο πρωτότυπο αρχείο RAW. Για επεξεργασία RAW συνιστάται η χρήση CoreImage με το φίλτρο CIRAWFilter, το οποίο υποστηρίζει ρύθμιση θερμοκρασίας, έκθεσης και ευκρίνειας. Το PhotoKit υποστηρίζει επίσης επεκτάσεις επεξεργαστών μέσω Photo Editing Extension (iOS) — η εφαρμογή μπορεί να κληθεί από τον επεξεργαστή συστήματος για επεξεργασία επιλεγμένης φωτογραφίας ή βίντεο.
PhotoKit — ένα ισχυρό αλλά εντατικό σε πόρους πλαίσιο. Η λανθασμένη χρήση μπορεί να οδηγήσει σε επιβράδυνση κατά την κύλιση και υπερβολική κατανάλωση μνήμης. Ακολουθήστε τις συστάσεις για βέλτιστη απόδοση.
PHLivePhoto — απαιτεί ξεχωριστό ερώτημα μέσω PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:). Μην ζητάτε Live Photo για κελιά όπου εμφανίζεται μόνο φωτογραφία — χρησιμοποιήστε PHLivePhotoBadge για ένδειξη.
Συχνές ερωτήσεις
PhotoKit — ένα σύγχρονο πλαίσιο της Apple για εργασία με την πολυμεσική βιβλιοθήκη, που παρουσιάστηκε στο iOS 8. Σε αντίθεση με την παλαιότερη AssetsLibrary, το PhotoKit παρέχει αντικειμενικό μοντέλο PHAsset, PHFetchResult με γρήγορη αναζήτηση, υποστήριξη iCloud και Change Tracking για παρακολούθηση αλλαγών.
Καλέστε PHPhotoLibrary.requestAuthorization(for: .readWrite) με χειρισμό στο callback. Μετά τη λήψη κατάστασης .authorized μπορείτε να εκτελείτε ερωτήματα PHAsset.fetchAssets. Για εγγραφή απαιτείται πρόσβαση .readWrite. Για μόνο ανάγνωση — .addOnly.
Χρησιμοποιήστε PHImageManager.default().requestImage με παραμέτρους: asset, targetSize, contentMode και PHImageRequestOptions. Η ασύγχρονη μέθοδος επιστρέφει PHImageRequestID, επιτρέποντας ακύρωση του ερωτήματος. Για συλλογές χρησιμοποιήστε PHCachingImageManager με προφόρτωση.
Καταχωρήστε παρατηρητή μέσω PHPhotoLibrary.shared().register(self) και υλοποιήστε το πρωτόκολλο PHPhotoLibraryChangeObserver. Στη μέθοδο photoLibraryDidChange θα λάβετε PHChange με changeDetails για κάθε fetchResult και εφαρμόστε αλλαγές στο UI με κινούμενα σχέδια.
Στο PHImageRequestOptions ορίστε isNetworkAccessAllowed = true και progressHandler για παρακολούθηση φόρτωσης από iCloud. Κατά γρήγορη κύλιση απενεργοποιήστε την πρόσβαση δικτύου και φορτώστε μόνο τοπικές εκδόσεις για αποφυγή καθυστερήσεων κατά την κύλιση.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης