PhotoKit — adalah framework Apple untuk bekerja dengan medioteks di iOS dan macOS, menyediakan akses langsung ke foto, video, dan Live Photos di perangkat. Menurut dokumentasi Apple, framework ini menggantikan AssetsLibrary yang sudah usang dan mendukung iCloud, album, pengeditan, dan Change Tracking. PhotoKit menyediakan API terpadu untuk kueri, caching, dan perubahan medioteks dengan sinkronisasi otomatis melalui iCloud.
Poin Utama
PhotoKit — framework Apple (diperkenalkan di iOS 8, macOS 10.11), menyediakan API berorientasi objek untuk bekerja dengan medioteks sistem. Tidak seperti AssetsLibrary, PhotoKit bekerja dengan medioteks seperti database: kueri mengembalikan objek PHAsset, PHCollection, PHCollectionList, yang mewakili konten dan struktur penyimpanan.
PhotoKit mendukung semua jenis media: foto (JPEG, HEIF, RAW), video (MOV, MP4), Live Photos, dan foto beruntun. Framework secara otomatis mengelola sinkronisasi iCloud: jika gambar disimpan di iCloud, PhotoKit memintanya melalui jaringan dan melaporkan kemajuan melalui PHImageRequestOptions.progressHandler.
Fitur kunci PhotoKit — model data berbasis PHObject dengan pengidentifikasi lokal (localIdentifier), yang tetap stabil antar sesi. Ini memungkinkan menyimpan referensi ke objek media dan memulihkannya setelah restart aplikasi tanpa kueri ulang.
PhotoKit dibangun di tiga tingkat: model data (PHObject), kueri (PHFetchResult) dan perubahan (PHPhotoLibrary.performChanges). Model data bersifat hierarkis: PHAsset (foto/video) berada di dalam PHAssetCollection (album), album dikelompokkan dalam PHCollectionList (folder).
Kueri dijalankan melalui PHAsset.fetchAssets dan PHAssetCollection.fetchAssetCollections. Semua metode fetch bersifat sinkron dan mengembalikan PHFetchResult, yang objeknya segera menjalankan kueri ke database medioteks. PHFetchResult mendukung akses cepat berdasarkan indeks (object(at:)) dan enumerasi melalui enumerateObjects.
PHFetchOptions — objek untuk konfigurasi kueri: pengurutan (sortDescriptors), predikat (predicate), penyertaan media tersembunyi dan terhapus (includeHiddenAssets, includeAllBurstAssets). Opsi fetch memungkinkan pemfilteran berdasarkan tipe media: PHAssetMediaType.image, .video, .audio.
PhotoKit mencakup serangkaian kelas untuk akses, kueri, dan perubahan medioteks. Memahami masing-masing kelas diperlukan untuk bekerja secara efektif dengan framework.
PHAsset — objek tidak berubah yang mewakili satu konten media. Berisi metadata: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (untuk video), isFavorite, burstIdentifier. LocalIdentifier — kunci teks stabil, tersedia bahkan setelah restart aplikasi.
PHAssetCollection — kelompok media: album sistem (Recents, Favorites, Selfies, Screenshots), album pengguna atau Moments (dikelompokkan secara otomatis berdasarkan waktu dan tempat). Atribut: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.
PHCollectionList — folder yang berisi album (PHAssetCollection) atau folder lain. Jarang digunakan, terutama untuk menampilkan hierarki di antarmuka pengguna.
PhotoKit tidak mengembalikan UIImage langsung dari PHAsset — Anda perlu meminta gambar melalui PHImageManager. Ini menjamin bahwa gambar dimuat dengan mempertimbangkan iCloud, caching, dan ukuran yang diperlukan.
| Komponen | Tujuan | Fitur |
|---|---|---|
| PHImageManager.default() | Manajer standar untuk kueri tunggal | Tidak ada caching antar kueri |
| PHCachingImageManager | Manajer dengan pramuat untuk koleksi | startCachingImages untuk scrolling halus |
| PHImageRequestOptions | Pengaturan kueri: ukuran, mode, pengiriman | synchronous, deliveryMode, progressHandler |
| PHImageRequestID | Pengidentifikasi kueri untuk pembatalan | cancelImageRequest(PHImageRequestID) |
PHImageManager mendukung tiga mode pengiriman: opportunistic (pertama versi diperkecil, lalu lengkap), highQualityFormat (hanya kualitas penuh) dan fastFormat (versi tercepat yang tersedia). Untuk koleksi selalu gunakan PHCachingImageManager dengan pramuat gambar untuk sel yang terlihat.
PhotoKit digunakan untuk membuat galeri kustom, editor, dan aplikasi untuk bekerja dengan media. Mari kita bahas tiga skenario kunci.
PHAsset.fetchAssets dengan PHFetchOptions dan pengurutan berdasarkan tanggal pembuatan — kueri dasar untuk membangun galeri foto kustom. PHFetchResult mendukung lazy-loading dan akses streaming.
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("Ditemukan \(allPhotos.count) foto")
allPhotos.enumerateObjects { asset, index, stop in
print("Foto \(index): \(asset.localIdentifier)")
}
PHFetchResult — wadah thread-safe. Akses ke objek berdasarkan indeks melalui object(at:) tidak memblokir UI, tetapi permintaan gambar melalui PHImageManager harus dijalankan secara asinkron.
PHCachingImageManager — subclass PHImageManager dengan metode startCachingImages dan stopCachingImages untuk pramuat. Digunakan di UICollectionView untuk scrolling halus.
let cachingManager = PHCachingImageManager()
let targetSize = CGSize(width: 200, height: 200)
// Pramuat untuk sel yang terlihat
cachingManager.startCachingImages(
for: visibleAssets,
targetSize: targetSize,
contentMode: .aspectFill,
options: nil
)
// Permintaan gambar melalui PHImageRequestOptions dengan fallback iCloud
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
DispatchQueue.main.async {
print("Mengunduh dari iCloud: \(progress * 100)%")
}
}
let requestID = cachingManager.requestImage(
for: asset,
targetSize: targetSize,
contentMode: .aspectFill,
options: requestOptions
) { image, info in
print("Gambar diterima: \(image?.size ?? .zero)")
}
Perubahan di medioteks dilakukan melalui PHPhotoLibrary.shared().performChanges di dalam blok changeRequest. Semua operasi dikelompokkan dan diterapkan secara transaksional.
PHPhotoLibrary.shared().performChanges {
let changeRequest = PHAssetChangeRequest(for: asset)
changeRequest.isFavorite = .true
} completionHandler: { success, error in
if success {
print("Ditambahkan ke favorit")
}
}
PhotoKit menyediakan mekanisme observasi perubahan di medioteks melalui protokol PHPhotoLibraryChangeObserver. Pada setiap perubahan (membuat, menghapus, mengedit) metode photoLibraryDidChange dipanggil dengan objek PHChange.
PHChange berisi changeDetails untuk setiap tipe kueri: PHFetchResultChangeDetails dengan removedIndexes, insertedIndexes, changedIndexes. Ini memungkinkan penerapan perubahan di UI dengan animasi: performBatchUpdates dengan move, insert, delete untuk 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
// Terapkan perubahan ke collectionView
}
}
}
PhotoKit mendukung pengeditan media melalui mekanisme PHContentEditingInput dan PHContentEditingOutput. Aplikasi meminta editingInput dengan data asli, menerapkan perubahan, dan menyimpan hasil melalui editingOutput. Framework secara otomatis menyimpan asli, memungkinkan pengguna untuk membatalkan perubahan melalui reset ke asli.
Foto RAW (DNG, CR2, NEF) didukung melalui PHAssetResourceManager, yang menyediakan akses ke file RAW asli. Untuk pemrosesan RAW disarankan menggunakan CoreImage dengan filter CIRAWFilter, yang mendukung penyesuaian suhu, eksposur, dan ketajaman. PhotoKit juga mendukung ekstensi editor melalui Photo Editing Extension (iOS) — aplikasi dapat dipanggil dari editor sistem untuk memproses foto atau video yang dipilih.
PhotoKit — framework yang kuat namun membutuhkan sumber daya. Penggunaan yang salah dapat menyebabkan perlambatan saat scrolling dan konsumsi memori berlebihan. Ikuti rekomendasi untuk kinerja optimal.
PHLivePhoto — memerlukan kueri terpisah melalui PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:). Jangan meminta Live Photo untuk sel yang hanya menampilkan foto — gunakan PHLivePhotoBadge untuk indikasi.
Pertanyaan yang Sering Diajukan
PhotoKit — framework modern Apple untuk bekerja dengan medioteks, diperkenalkan di iOS 8. Tidak seperti AssetsLibrary yang usang, PhotoKit menyediakan model objek PHAsset, PHFetchResult dengan pencarian cepat, dukungan iCloud, dan Change Tracking untuk observasi perubahan.
Panggil PHPhotoLibrary.requestAuthorization(for: .readWrite) dengan penanganan di callback. Setelah mendapatkan status .authorized Anda dapat menjalankan kueri PHAsset.fetchAssets. Untuk menulis diperlukan akses .readWrite. Untuk hanya baca — .addOnly.
Gunakan PHImageManager.default().requestImage dengan parameter: asset, targetSize, contentMode dan PHImageRequestOptions. Metode asinkron mengembalikan PHImageRequestID, memungkinkan pembatalan kueri. Untuk koleksi gunakan PHCachingImageManager dengan pramuat.
Daftarkan pengamat melalui PHPhotoLibrary.shared().register(self) dan implementasikan protokol PHPhotoLibraryChangeObserver. Di metode photoLibraryDidChange Anda akan menerima PHChange dengan changeDetails untuk setiap fetchResult dan terapkan perubahan di UI dengan animasi.
Di PHImageRequestOptions atur isNetworkAccessAllowed = true dan progressHandler untuk melacak pemuatan dari iCloud. Saat scrolling cepat nonaktifkan akses jaringan dan muat hanya versi lokal untuk menghindari keterlambatan saat scrolling.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga