PhotoKit iOS और macOS पर मीडिया लाइब्रेरी के साथ काम करने के लिए Apple का फ्रेमवर्क है, जो डिवाइस पर फ़ोटो, वीडियो और Live Photos तक सीधी पहुँच प्रदान करता है। Apple के दस्तावेज़ीकरण के अनुसार, यह फ्रेमवर्क पुराने AssetsLibrary को बदलता है और iCloud, एल्बम, संपादन और Change Tracking का समर्थन करता है। PhotoKit iCloud के माध्यम से स्वचालित सिंक्रोनाइज़ेशन के साथ क्वेरी, कैशिंग और मीडिया लाइब्रेरी परिवर्तनों के लिए एकीकृत API प्रदान करता है।
मुख्य बातें
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 सीधे PHAsset से UIImage नहीं लौटाता — आपको 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 प्रीलोडिंग के लिए startCachingImages और stopCachingImages विधियों के साथ PHImageManager की उपश्रेणी है। इसका उपयोग स्मूथ स्क्रॉलिंग के लिए UICollectionView में किया जाता है।
let cachingManager = PHCachingImageManager()
let targetSize = CGSize(width: 200, height: 200)
// दृश्य कोशिकाओं के लिए प्रीलोड
cachingManager.startCachingImages(
for: visibleAssets,
targetSize: targetSize,
contentMode: .aspectFill,
options: nil
)
// PHImageRequestOptions के साथ iCloud फ़ॉलबैक के माध्यम से इमेज अनुरोध
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 प्रोटोकॉल के माध्यम से मीडिया लाइब्रेरी परिवर्तनों का अवलोकन करने के लिए तंत्र प्रदान करता है। जब कोई परिवर्तन होता है (निर्माण, हटाना, संपादन), तो PHChange ऑब्जेक्ट के साथ photoLibraryDidChange विधि कॉल की जाती है।
PHChange में प्रत्येक क्वेरी प्रकार के लिए changeDetails होता है: PHFetchResultChangeDetails जिसमें removedIndexes, insertedIndexes, changedIndexes होते हैं। यह UICollectionView के लिए performBatchUpdates के साथ एनिमेशन के साथ UI में परिवर्तन लागू करने की अनुमति देता है।
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 प्रसंस्करण के लिए, CIRAWFilter के साथ CoreImage का उपयोग करने की अनुशंसा की जाती है, जो तापमान, एक्सपोज़र और तीक्ष्णता के समायोजन का समर्थन करता है। 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) कॉल करें। .authorized स्थिति प्राप्त करने के बाद, आप PHAsset.fetchAssets क्वेरी निष्पादित कर सकते हैं। लेखन पहुँच के लिए .readWrite अनुमति आवश्यक है। केवल पढ़ने के लिए — .addOnly.
पैरामीटर के साथ PHImageManager.default().requestImage का उपयोग करें: asset, targetSize, contentMode और PHImageRequestOptions। एसिंक्रोनस विधि PHImageRequestID लौटाती है, जो अनुरोध को रद्द करने की अनुमति देती है। संग्रह के लिए, प्रीलोडिंग के साथ PHCachingImageManager का उपयोग करें।
PHPhotoLibrary.shared().register(self) के माध्यम से एक प्रेक्षक पंजीकृत करें और PHPhotoLibraryChangeObserver प्रोटोकॉल लागू करें। photoLibraryDidChange विधि में, प्रत्येक fetchResult के लिए changeDetails के साथ PHChange प्राप्त करें और एनिमेशन के साथ UI में परिवर्तन लागू करें।
PHImageRequestOptions में, iCloud डाउनलोड प्रगति को ट्रैक करने के लिए isNetworkAccessAllowed = true और progressHandler सेट करें। तेज़ स्क्रॉलिंग के दौरान, नेटवर्क एक्सेस अक्षम करें और स्क्रॉल देरी से बचने के लिए केवल स्थानीय संस्करण लोड करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें