PhotoKit, iOS ve macOS’ta medya kitaplığı ile çalışmak için Apple framework’üdür ve cihazdaki fotoğraflara, videolara ve Live Photos’a doğrudan erişim sağlar. Apple dokümantasyonuna göre framework, eski AssetsLibrary’nin yerini alır ve iCloud, albümler, düzenleme ve Change Tracking’i destekler. PhotoKit, iCloud üzerinden otomatik senkronizasyon ile sorgular, önbellekleme ve medya kitaplığı değişiklikleri için birleşik bir API sağlar.
Temel Noktalar
PhotoKit, sistem medya kitaplığı ile çalışmak için nesne yönelimli bir API sağlayan Apple framework’üdür (iOS 8, macOS 10.11’de tanıtıldı). AssetsLibrary’nin aksine PhotoKit, medya kitaplığını bir veritabanı olarak ele alır: sorgular, içeriği ve depolama yapısını temsil eden PHAsset, PHCollection ve PHCollectionList nesnelerini döndürür.
PhotoKit tüm medya türlerini destekler: fotoğraflar (JPEG, HEIF, RAW), videolar (MOV, MP4), Live Photos ve seri çekimler. Framework, iCloud senkronizasyonunu otomatik olarak yönetir: bir görüntü iCloud’da depolanmışsa, PhotoKit bunu ağ üzerinden talep eder ve ilerlemeyi PHImageRequestOptions.progressHandler aracılığıyla bildirir.
PhotoKit’in temel özelliği, oturumlar arasında sabit kalan yerel bir tanımlayıcıya (localIdentifier) sahip PHObject tabanlı veri modelidir. Bu, medya nesnelerine referansları kaydetmenize ve yeniden sorgulamadan uygulama yeniden başlatıldıktan sonra bunları geri yüklemenize olanak tanır.
PhotoKit üç düzeyde oluşturulmuştur: veri modeli (PHObject), sorgular (PHFetchResult) ve değişiklikler (PHPhotoLibrary.performChanges). Veri modeli hiyerarşiktir: PHAsset (fotoğraf/video) PHAssetCollection (albüm) içinde bulunur ve albümler PHCollectionList (klasör) içinde gruplanır.
Sorgular PHAsset.fetchAssets ve PHAssetCollection.fetchAssetCollections aracılığıyla yürütülür. Tüm getirme yöntemleri eşzamanlıdır ve PHFetchResult döndürür; bu da sorguyu hemen medya kitaplığı veritabanında yürütür. PHFetchResult, dizine göre hızlı erişimi (object(at:)) ve enumerateObjects aracılığıyla numaralandırmayı destekler.
PHFetchOptions, sorguları yapılandırmak için bir nesnedir: sıralama (sortDescriptors), yüklem (predicate), gizli ve silinmiş medyayı dahil etme (includeHiddenAssets, includeAllBurstAssets). Getirme seçenekleri, medya türüne göre filtrelemeye izin verir: PHAssetMediaType.image, .video, .audio.
PhotoKit, medya kitaplığına erişmek, sorgulamak ve değiştirmek için bir dizi sınıf içerir. Framework ile etkili bir şekilde çalışmak için her birini anlamak önemlidir.
PHAsset, tek bir medya öğesini temsil eden değiştirilemez bir nesnedir. Meta veriler içerir: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (video için), isFavorite, burstIdentifier. LocalIdentifier, uygulama yeniden başlatıldıktan sonra bile erişilebilen sabit bir dize anahtarıdır.
PHAssetCollection bir medya grubudur: sistem albümleri (Recents, Favorites, Selfies, Screenshots), kullanıcı albümleri veya Moments (zamana ve yere göre otomatik olarak gruplandırılmış). Öznitelikler: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.
PHCollectionList, albümler (PHAssetCollection) veya diğer klasörler içeren bir klasördür. Genellikle kullanıcı arayüzünde hiyerarşiyi görüntülemek için kullanılır ve nadiren kullanılır.
PhotoKit, PHAsset’ten doğrudan UIImage döndürmez — bir görüntüyü PHImageManager aracılığıyla talep etmeniz gerekir. Bu, görüntünün iCloud desteği, önbellekleme ve gerekli boyutla yüklenmesini sağlar.
| Bileşen | Amaç | Özellik |
|---|---|---|
| PHImageManager.default() | Tek seferlik istekler için standart yönetici | Talep arasında önbellekleme yok |
| PHCachingImageManager | Koleksiyonlar için ön yüklemeli yönetici | Düzgün kaydırma için startCachingImages |
| PHImageRequestOptions | Talep ayarları: boyut, mod, teslimat | synchronous, deliveryMode, progressHandler |
| PHImageRequestID | İptal için talep tanımlayıcısı | cancelImageRequest(PHImageRequestID) |
PHImageManager üç teslimat modunu destekler: opportunistic (önce küçültülmüş sürüm, sonra tam), highQualityFormat (yalnızca tam kalite) ve fastFormat (en hızlı kullanılabilir sürüm). Koleksiyonlar için her zaman görünür hücreler için görüntü ön yüklemesi ile PHCachingImageManager kullanın.
PhotoKit, özel galeriler, düzenleyiciler ve medya uygulamaları oluşturmak için kullanılır. Üç temel senaryoya bakalım.
Oluşturma tarihine göre sıralanmış PHFetchOptions ile PHAsset.fetchAssets, özel bir fotoğraf galerisi oluşturmak için temel sorgudur. PHFetchResult, temel yükleme ve akış erişimini destekler.
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) fotoğraf bulundu")
allPhotos.enumerateObjects { asset, index, stop in
print("Fotoğraf \(index): \(asset.localIdentifier)")
}
PHFetchResult iş parçacığı güvenli bir kaptır. object(at:) aracılığıyla nesnelere dizine göre erişmek kullanıcı arayüzünü engellemez, ancak PHImageManager aracılığıyla görüntü talep etmek eşzamansız olarak yapılmalıdır.
PHCachingImageManager, ön yükleme için startCachingImages ve stopCachingImages yöntemlerine sahip PHImageManager’ın bir alt sınıfıdır. Düzgün kaydırma için UICollectionView’da kullanılır.
let cachingManager = PHCachingImageManager()
let targetSize = CGSize(width: 200, height: 200)
// Görünür hücreler için ön yükleme
cachingManager.startCachingImages(
for: visibleAssets,
targetSize: targetSize,
contentMode: .aspectFill,
options: nil
)
// iCloud yedeklemeli PHImageRequestOptions ile görüntü talebi
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
DispatchQueue.main.async {
print("iCloud’tan indiriliyor: \(progress * 100)%")
}
}
let requestID = cachingManager.requestImage(
for: asset,
targetSize: targetSize,
contentMode: .aspectFill,
options: requestOptions
) { image, info in
print("Görüntü alındı: \(image?.size ?? .zero)")
}
Medya kitaplığındaki değişiklikler, changeRequest bloğu içinde PHPhotoLibrary.shared().performChanges aracılığıyla gerçekleştirilir. Tüm işlemler toplu olarak işlenir ve işlemsel olarak uygulanır.
PHPhotoLibrary.shared().performChanges {
let changeRequest = PHAssetChangeRequest(for: asset)
changeRequest.isFavorite = .true
} completionHandler: { success, error in
if success {
print("Favorilere eklendi")
}
}
PhotoKit, PHPhotoLibraryChangeObserver protokolü aracılığıyla medya kitaplığı değişikliklerini gözlemlemek için bir mekanizma sağlar. Herhangi bir değişiklik (oluşturma, silme, düzenleme) meydana geldiğinde, bir PHChange nesnesi ile photoLibraryDidChange yöntemi çağrılır.
PHChange, her sorgu türü için changeDetails içerir: PHFetchResultChangeDetails, removedIndexes, insertedIndexes, changedIndexes içerir. Bu, UICollectionView için performBatchUpdates (move, insert, delete) ile animasyonlu olarak kullanıcı arayüzünde değişikliklerin uygulanmasını sağlar.
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’a değişiklikleri uygula
}
}
}
PhotoKit, PHContentEditingInput ve PHContentEditingOutput mekanizması aracılığıyla medya düzenlemeyi destekler. Uygulama, orijinal verilerle editingInput talep eder, değişiklikleri uygular ve sonucu editingOutput aracılığıyla kaydeder. Framework otomatik olarak orijinali korur ve kullanıcıların orijinale sıfırlayarak değişiklikleri geri almasına olanak tanır.
RAW fotoğraflar (DNG, CR2, NEF), orijinal RAW dosyasına erişim sağlayan PHAssetResourceManager aracılığıyla desteklenir. RAW işleme için, sıcaklık, pozlama ve keskinlik ayarını destekleyen CIRAWFilter filtreli CoreImage kullanılması önerilir. PhotoKit ayrıca Photo Editing Extension (iOS) aracılığıyla düzenleyici uzantılarını da destekler — seçili bir fotoğrafı veya videoyu işlemek için sistem düzenleyicisinden bir uygulama çağrılabilir.
PhotoKit güçlü ancak kaynak yoğun bir framework’tür. Yanlış kullanım, kaydırma gecikmesine ve aşırı bellek tüketimine yol açabilir. En iyi performans için bu önerilere uyun.
PHLivePhoto, PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:) aracılığıyla ayrı bir talep gerektirir. Yalnızca fotoğraf görüntüleyen hücreler için Live Photo talep etmeyin — gösterge olarak PHLivePhotoBadge kullanın.
Sıkça Sorulan Sorular
PhotoKit, iOS 8’de tanıtılan, medya kitaplığı ile çalışmak için modern bir Apple framework’üdür. Eski AssetsLibrary’nin aksine PhotoKit, PHAsset nesne modeli, hızlı aramalı PHFetchResult, iCloud desteği ve değişiklikleri gözlemlemek için Change Tracking sağlar.
Bir geri çağrı işleyicisi ile PHPhotoLibrary.requestAuthorization(for: .readWrite) çağrın. .authorized durumunu aldıktan sonra PHAsset.fetchAssets sorgularını çalıştırabilirsiniz. Yazma erişimi için .readWrite izni gerekir. Yalnızca okuma için — .addOnly.
Parametrelerle PHImageManager.default().requestImage kullanın: asset, targetSize, contentMode ve PHImageRequestOptions. Eşzamansız yöntem PHImageRequestID döndürür ve talebi iptal etmenize olanak tanır. Koleksiyonlar için ön yüklemeli PHCachingImageManager kullanın.
PHPhotoLibrary.shared().register(self) aracılığıyla bir gözlemci kaydedin ve PHPhotoLibraryChangeObserver protokolünü uygulayın. photoLibraryDidChange yönteminde, her fetchResult için changeDetails ile PHChange alın ve animasyonla kullanıcı arayüzünde değişiklikleri uygulayın.
PHImageRequestOptions içinde, iCloud indirme ilerlemesini izlemek için isNetworkAccessAllowed = true ve bir progressHandler ayarlayın. Hızlı kaydırma sırasında ağ erişimini devre dışı bırakın ve kaydırma gecikmelerini önlemek için yalnızca yerel sürümleri yükleyin.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun