PhotoKit — is het Apple-framework voor het werken met de mediatheek op iOS en macOS, dat directe toegang biedt tot foto's, video's en Live Photos op het apparaat. Volgens Apple-documentatie vervangt het framework de verouderde AssetsLibrary en ondersteunt het iCloud, albums, bewerking en Change Tracking. PhotoKit biedt een uniforme API voor query's, caching en wijzigingen van de mediatheek met automatische synchronisatie via iCloud.
Belangrijkste punten
PhotoKit — Apple-framework (geïntroduceerd in iOS 8, macOS 10.11), dat een objectgeoriënteerde API biedt voor het werken met de systeemmediatheek. In tegenstelling tot AssetsLibrary behandelt PhotoKit de mediatheek als een database: query's retourneren objecten PHAsset, PHCollection, PHCollectionList, die de inhoud en opslagstructuur vertegenwoordigen.
PhotoKit ondersteunt alle mediatypen: foto's (JPEG, HEIF, RAW), video's (MOV, MP4), Live Photos en serie-opnamen. Het framework beheert automatisch iCloud-synchronisatie: als een afbeelding in iCloud is opgeslagen, vraagt PhotoKit deze via het netwerk op en rapporteert de voortgang via PHImageRequestOptions.progressHandler.
De belangrijkste functie van PhotoKit — het gegevensmodel gebaseerd op PHObject met een lokale identificatie (localIdentifier), die stabiel blijft tussen sessies. Dit maakt het mogelijk om verwijzingen naar media-objecten op te slaan en ze te herstellen na het herstarten van de app zonder een nieuwe query.
PhotoKit is op drie niveaus gebouwd: gegevensmodel (PHObject), query's (PHFetchResult) en wijzigingen (PHPhotoLibrary.performChanges). Het gegevensmodel is hiërarchisch: PHAsset (foto/video) bevindt zich binnen PHAssetCollection (album), albums worden gegroepeerd in PHCollectionList (map).
Query's worden uitgevoerd via PHAsset.fetchAssets en PHAssetCollection.fetchAssetCollections. Alle fetch-methoden zijn synchroon en retourneren PHFetchResult, waarvan het object onmiddellijk de query uitvoert op de database van de mediatheek. PHFetchResult ondersteunt snelle toegang via index (object(at:)) en enumeratie via enumerateObjects.
PHFetchOptions — object voor het configureren van de query: sortering (sortDescriptors), predicaat (predicate), inclusie van verborgen en verwijderde media (includeHiddenAssets, includeAllBurstAssets). Fetch-opties maken filtering op mediatype mogelijk: PHAssetMediaType.image, .video, .audio.
PhotoKit bevat een set klassen voor toegang, query's en wijziging van de mediatheek. Inzicht in elk ervan is noodzakelijk voor efficiënt werken met het framework.
PHAsset — onveranderlijk object dat één media-inhoud vertegenwoordigt. Bevat metadata: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (voor video), isFavorite, burstIdentifier. LocalIdentifier — stabiele tekstuele sleutel, zelfs toegankelijk na het herstarten van de app.
PHAssetCollection — groep media: systeemalbums (Recents, Favorites, Selfies, Screenshots), gebruikersalbums of Moments (automatisch gegroepeerd op tijd en plaats). Attributen: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.
PHCollectionList — map die albums (PHAssetCollection) of andere mappen bevat. Zelden gebruikt, voornamelijk voor het tonen van hiërarchie in de gebruikersinterface.
PhotoKit retourneert geen UIImage rechtstreeks uit PHAsset — u moet de afbeelding via PHImageManager opvragen. Dit garandeert dat de afbeelding wordt geladen met inachtneming van iCloud, caching en de vereiste grootte.
| Component | Doel | Kenmerk |
|---|---|---|
| PHImageManager.default() | Standaardmanager voor eenmalige query's | Geen caching tussen query's |
| PHCachingImageManager | Manager met voorladen voor collecties | startCachingImages voor vloeiend scrollen |
| PHImageRequestOptions | Query-instellingen: grootte, modus, levering | synchronous, deliveryMode, progressHandler |
| PHImageRequestID | Query-identificatie voor annulering | cancelImageRequest(PHImageRequestID) |
PHImageManager ondersteunt drie leveringsmodi: opportunistic (eerst verkleinde versie, daarna volledig), highQualityFormat (alleen volledige kwaliteit) en fastFormat (snelste beschikbare versie). Gebruik voor collecties altijd PHCachingImageManager met voorladen van afbeeldingen voor zichtbare cellen.
PhotoKit wordt gebruikt voor het maken van aangepaste galerijen, editors en apps voor het werken met media. Laten we drie belangrijke scenario's bekijken.
PHAsset.fetchAssets met PHFetchOptions en sortering op aanmaakdatum — basisquery voor het bouwen van een aangepaste fotogalerij. PHFetchResult ondersteunt lazy-loading en stream-toegang.
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("Gevonden \(allPhotos.count) foto's")
allPhotos.enumerateObjects { asset, index, stop in
print("Foto \(index): \(asset.localIdentifier)")
}
PHFetchResult — thread-safe container. Toegang tot objecten via index via object(at:) blokkeert de UI niet, maar het opvragen van een afbeelding via PHImageManager moet asynchroon worden uitgevoerd.
PHCachingImageManager — subklasse van PHImageManager met methoden startCachingImages en stopCachingImages voor voorladen. Gebruikt in UICollectionView voor vloeiend scrollen.
let cachingManager = PHCachingImageManager()
let targetSize = CGSize(width: 200, height: 200)
// Voorladen voor zichtbare cellen
cachingManager.startCachingImages(
for: visibleAssets,
targetSize: targetSize,
contentMode: .aspectFill,
options: nil
)
// Afbeelding opvragen via PHImageRequestOptions met iCloud fallback
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
DispatchQueue.main.async {
print("Bezig met laden uit iCloud: \(progress * 100)%")
}
}
let requestID = cachingManager.requestImage(
for: asset,
targetSize: targetSize,
contentMode: .aspectFill,
options: requestOptions
) { image, info in
print("Afbeelding ontvangen: \(image?.size ?? .zero)")
}
Wijzigingen in de mediatheek worden uitgevoerd via PHPhotoLibrary.shared().performChanges binnen het changeRequest-blok. Alle bewerkingen worden gebundeld en transactioneel toegepast.
PHPhotoLibrary.shared().performChanges {
let changeRequest = PHAssetChangeRequest(for: asset)
changeRequest.isFavorite = .true
} completionHandler: { success, error in
if success {
print("Toegevoegd aan favorieten")
}
}
PhotoKit biedt een mechanisme voor het observeren van wijzigingen in de mediatheek via het protocol PHPhotoLibraryChangeObserver. Bij elke wijziging (maken, verwijderen, bewerken) wordt de methode photoLibraryDidChange aangeroepen met een PHChange-object.
PHChange bevat changeDetails voor elk querytype: PHFetchResultChangeDetails met removedIndexes, insertedIndexes, changedIndexes. Dit maakt het mogelijk om wijzigingen in de UI met animatie toe te passen: performBatchUpdates met move, insert, delete voor 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
// Wijzigingen toepassen op collectionView
}
}
}
PhotoKit ondersteunt media-bewerking via het mechanisme PHContentEditingInput en PHContentEditingOutput. De app vraagt editingInput met originele gegevens aan, past wijzigingen toe en slaat het resultaat op via editingOutput. Het framework bewaart automatisch het origineel, zodat de gebruiker wijzigingen kan terugdraaien door te resetten naar het origineel.
RAW-foto's (DNG, CR2, NEF) worden ondersteund via PHAssetResourceManager, dat toegang biedt tot het originele RAW-bestand. Voor RAW-verwerking wordt aanbevolen CoreImage te gebruiken met het CIRAWFilter-filter, dat aanpassing van temperatuur, belichting en scherpte ondersteunt. PhotoKit ondersteunt ook editor-extensies via Photo Editing Extension (iOS) — de app kan vanuit de systeemeditor worden aangeroepen om de geselecteerde foto of video te verwerken.
PhotoKit — een krachtig maar resource-intensief framework. Onjuist gebruik kan leiden tot vertraging bij scrollen en overmatig geheugengebruik. Volg de aanbevelingen voor optimale prestaties.
PHLivePhoto — vereist een aparte query via PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:). Vraag geen Live Photo voor cellen waar alleen een foto wordt weergegeven — gebruik PHLivePhotoBadge voor indicatie.
Veelgestelde vragen
PhotoKit — een modern Apple-framework voor het werken met de mediatheek, geïntroduceerd in iOS 8. In tegenstelling tot de verouderde AssetsLibrary biedt PhotoKit het objectmodel PHAsset, PHFetchResult met snel zoeken, iCloud-ondersteuning en Change Tracking voor het observeren van wijzigingen.
Roep PHPhotoLibrary.requestAuthorization(for: .readWrite) aan met afhandeling in de callback. Na het verkrijgen van de status .authorized kunt u PHAsset.fetchAssets-query's uitvoeren. Voor schrijven is .readWrite-toegang vereist. Voor alleen lezen — .addOnly.
Gebruik PHImageManager.default().requestImage met parameters: asset, targetSize, contentMode en PHImageRequestOptions. De asynchrone methode retourneert PHImageRequestID, waarmee de query kan worden geannuleerd. Gebruik voor collecties PHCachingImageManager met voorladen.
Registreer de waarnemer via PHPhotoLibrary.shared().register(self) en implementeer het protocol PHPhotoLibraryChangeObserver. In de methode photoLibraryDidChange ontvangt u PHChange met changeDetails voor elke fetchResult en past u de wijzigingen met animatie toe in de UI.
Stel in PHImageRequestOptions isNetworkAccessAllowed = true in en progressHandler voor het volgen van laden uit iCloud. Schakel bij snel scrollen de netwerktoegang uit en laad alleen lokale versies om vertragingen bij scrollen te voorkomen.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook