यहाँ iOS 8+ के लिए एक पूर्ण गाइड है (ALAssetLibrary के बिना):
सबसे पहले हमें उपयोग विवरण प्रदान करना है क्योंकि अब यह PHPhotoLibrary द्वारा आवश्यक है।
ऐसा करने के लिए हमें info.plist
फ़ाइल खोलनी होगी, कुंजी ढूंढनी होगी Privacy - Photo Library Usage Description
और उसके लिए मूल्य प्रदान करना होगा। यदि कुंजी मौजूद नहीं है, तो इसे बनाएं।
यहां उदाहरण के लिए एक छवि है:
यह भी सुनिश्चित करें कि कुंजी Bundle name
का मान info.plist
फ़ाइल में खाली नहीं है ।
अब जब हमारे पास विवरण होता है, तो हम सामान्यतः कॉलिंग requestAuthorization
विधि द्वारा प्राधिकरण का अनुरोध कर सकते हैं :
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
switch (status) {
case PHAuthorizationStatusAuthorized:
NSLog(@"PHAuthorizationStatusAuthorized");
break;
case PHAuthorizationStatusDenied:
NSLog(@"PHAuthorizationStatusDenied");
break;
case PHAuthorizationStatusNotDetermined:
NSLog(@"PHAuthorizationStatusNotDetermined");
break;
case PHAuthorizationStatusRestricted:
NSLog(@"PHAuthorizationStatusRestricted");
break;
}
}];
नोट 1: requestAuthorization
वास्तव में हर कॉल पर अलर्ट नहीं दिखाता है। यह कुछ समय के बाद एक बार दिखाता है, उपयोगकर्ता के उत्तर को बचाता है और फिर से अलर्ट दिखाने के बजाय इसे हर बार लौटाता है। लेकिन जैसा कि हमें इसकी आवश्यकता नहीं है, यहां एक उपयोगी कोड है जो हमेशा हर बार अलर्ट दिखाता है जिसे हमें अनुमति की आवश्यकता होती है (सेटिंग्स पर पुनर्निर्देशन के साथ):
- (void)requestAuthorizationWithRedirectionToSettings {
dispatch_async(dispatch_get_main_queue(), ^{
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusAuthorized)
{
//We have permission. Do whatever is needed
}
else
{
//No permission. Trying to normally request it
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status != PHAuthorizationStatusAuthorized)
{
//User don't give us permission. Showing alert with redirection to settings
//Getting description string from info.plist file
NSString *accessDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSPhotoLibraryUsageDescription"];
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:accessDescription message:@"To give permissions tap on 'Change Settings' button" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:cancelAction];
UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:@"Change Settings" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}];
[alertController addAction:settingsAction];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
}
}];
}
});
}
सामान्य समस्या 1: कुछ उपयोगकर्ता शिकायत करते हैं कि info.plist
फ़ाइल में उपर्युक्त परिवर्तन करने के बाद ऐप अलर्ट नहीं दिखाता है ।
समाधान: परीक्षण के Bundle Identifier
लिए प्रोजेक्ट फ़ाइल से किसी और चीज़ में बदलने , ऐप को साफ़ और पुनर्निर्माण करने का प्रयास करें। अगर इसने काम करना शुरू कर दिया तो सब ठीक है, इसे वापस नाम दें।
सामान्य समस्या 2: कुछ विशिष्ट मामले हैं जब भ्रूण के परिणाम अपडेट नहीं किए जाते हैं (और उन भ्रूण अनुरोधों से छवियों का उपयोग किया जाता है जो तब भी तदनुसार खाली होते हैं) जब एप्लिकेशन को फ़ोटो के लिए अनुमति मिलती है, जबकि चल रहा है जैसा कि प्रलेखन में वादा किया गया था।
वास्तव में ऐसा तब होता है जब हम इस तरह गलत कोड का उपयोग करते हैं:
- (void)viewDidLoad {
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
//Reloading some view which needs photos
[self reloadCollectionView];
// ...
} else {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized)
[self reloadCollectionView];
// ...
}];
}
// ...
}
इस स्थिति में यदि उपयोगकर्ता अनुमति देने से इनकार करता है, viewDidLoad
तो सेटिंग्स में कूद गया, अनुमति दी गई और वापस ऐप में कूद गया, विचारों को ताज़ा नहीं किया जाएगा क्योंकि [self reloadCollectionView]
और अनुरोध भेजे नहीं गए थे।
समाधान: हमें केवल [self reloadCollectionView]
इस तरह से प्राधिकरण की आवश्यकता होने से पहले कॉल और अन्य अनुरोध करने होंगे:
- (void)viewDidLoad {
//Reloading some view which needs photos
[self reloadCollectionView];
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
// ...
}