2017-09-25 6 views
23
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { 
    let imagePicker = UIImagePickerController() 
    imagePicker.sourceType = .photoLibrary 
    imagePicker.allowsEditing = true 
    self.present(imagePicker, animated: true, completion: { }) 
} 

भले ही मैं उपरोक्त कोड के साथ "कभी नहीं" सेटिंग्स में फ़ोटो तक पहुंच सेट करता हूं, फिर भी मैं छवि पिकर प्रस्तुत कर सकता हूं और फ़ोटो दिखा सकता हूं। मैं इसे दिखाने से पहले PHPhotoLibrary.authorizationStatus() की जांच करूंगा, लेकिन मुझे यह जानना है कि यह अपेक्षित व्यवहार है?आईओएस 11 फोटो लाइब्रेरी एक्सेस संभव है भले ही सेटिंग्स "कभी नहीं"

+0

आपने कौन सी कुंजी info.plist में जोड़ दी है? –

+0

गोपनीयता - फोटो लाइब्रेरी उपयोग विवरण – gvuksic

+0

क्या आपने सिम्युलेटर या डिवाइस के साथ प्रयास किया था? – Govaadiyo

उत्तर

21

ठीक होना चाहिए अच्छा :-), आप टुकड़ा इस जवाब और टिप्पणियों को पहले से ही से एक साथ की सॉर्ट कर सकते हैं, लेकिन एक और अधिक पूरा कहानी बताने के लिए प्रयास करने के लिए है ...


आईओएस 11, UIImagePickerController आपके ऐप से एक अलग प्रक्रिया के रूप में चलता है। इसका अर्थ है:

  1. आपका ऐप उपयोगकर्ता की पूरी फ़ोटो लाइब्रेरी नहीं देख सकता है - यह केवल छवि पिकर में उपयोगकर्ता द्वारा चुने गए किसी भी संपत्ति (खातों) के लिए केवल पढ़ने के लिए पहुंच प्राप्त करता है।
  2. (1) के कारण, आपके ऐप को फ़ोटो लाइब्रेरी एक्सेस के लिए मानक गोपनीयता प्राधिकरण की आवश्यकता नहीं है। उपयोगकर्ता स्पष्ट रूप से आपके ऐप में उपयोग के लिए एक विशिष्ट संपत्ति (या एकाधिक) चुनता है, जिसका अर्थ है कि उपयोगकर्ता आपकी ऐप को प्रश्न में संपत्ति (ओं) को पढ़ने की अनुमति दे रहा है।

आप इस in the WWDC17 talk on PhotoKit के बारे में और अधिक देख सकते हैं।

(वैसे, इस मॉडल से मेल खाता है क्या आप आईओएस 9 के बाद से in the Contacts framework देखा है, यदि आप संपर्क पिकर दिखाने के लिए, आपका ऐप्लिकेशन केवल संपर्क (रों) उपयोगकर्ता उठाया के लिए संपर्क जानकारी की एक बार की बूंद हो जाता है, संपर्क डेटाबेस के लिए नहीं चल रही पढ़ने/लिखने के लिए एक्सेस, तो संपर्क पिकर विशेष गोपनीयता अनुमति की आवश्यकता नहीं है।) फ़ोटो पहुँच के लिए है कि उपयोगकर्ताओं को नियंत्रित कर सकते हैं


PHPhotoLibrary और उसके प्राधिकरण स्थिति वैश्विक पढ़ने/लिखने की अनुमति को प्रतिबिंबित सेटिंग्स> गोपनीयता से। (यही वह जगह है जहां आपकी Info.plist को NSPhotoLibraryUsageDescription की आवश्यकता है।) PHPhotoLibrary एपीआई के किसी भी उपयोग के लिए इस अनुमति की आवश्यकता है, भले ही आपके ऐप का उस एपीआई का उपयोग केवल लेखन के लिए है या केवल पढ़ने के लिए है। यह सच है कि आप PHPhotoLibrary, PHAsset, प्रयोग नहीं कर रहे हो चुके हैं PhotoKit आईओएस 8.

में पेश किया गया था आदि, वहाँ संकरा अनुमति विकल्प है कि आईओएस 11 में नए हैं (और Photos.framework एपीआई का हिस्सा नहीं) :

  • जैसा कि ऊपर बताया, UIImagePickerController क्योंकि प्रत्येक उपयोग के अनुदान एक बार चुना विशिष्ट परिसंपत्तियों के लिए पढ़ने की पहुंच कंबल गोपनीयता सेटिंग्स अनुमति की जरूरत नहीं है।
  • यदि आपको केवल फ़ोटो लाइब्रेरी में नई संपत्तियां जोड़ने की आवश्यकता है, तो UIImageWriteToSavedPhotosAlbum या UISaveVideoAtPathToSavedPhotosAlbum का उपयोग करें। उन लोगों के साथ आप NSPhotoLibraryAddUsageDescription को अपनी Info.plist में डाल सकते हैं - तब सिस्टम की गोपनीयता सेटिंग्स उपयोगकर्ता को स्पष्ट कर देगी कि वे मौजूदा संपत्तियों को देखने या संशोधित करने की अनुमति नहीं दे रहे हैं, केवल नए जोड़ने के लिए।

    यदि उपयोगकर्ता केवल-अनुमति की अनुमति देता है, तो यह केवल उन UIKit फ़ंक्शंस पर लागू होता है - PHPhotoLibrary का उपयोग करने का प्रयास करने के लिए अभी भी (और Info.plist कुंजी की आवश्यकता है) पढ़ने/लिखने के लिए उपयोग किया जाएगा।

    केवल this part of the WWDC17 talk को केवल-जोड़ने के लिए गोपनीयता सेटिंग पर अधिक देखें।

+1

मैं आईओएस 11 का उपयोग कर "आईओएस ऐप विकसित करना शुरू कर रहा हूं" ट्यूटोरियल का पालन कर रहा था और ट्यूटोरियल ने कहा कि मुझे एक प्राप्त करना चाहिए था जब कोई त्रुटि नहीं मिली। यह जवाब बताता है कि ऐसा क्यों है: डी –

4

क्या यह अपेक्षित व्यवहार है? - हाँ।

डॉक्स से - https://developer.apple.com/documentation/uikit/uiimagepickercontroller/1619144-issourcetypeavailable

सच डिवाइस निर्दिष्ट स्रोत प्रकार का समर्थन करता है; गलत अगर निर्दिष्ट स्रोत प्रकार उपलब्ध नहीं है।

यह आपको बताता है कि डिवाइस स्रोत प्रकार का समर्थन करता है और नहीं, यदि ऐप को इसे एक्सेस करने की अनुमति है या नहीं।

जैसा कि आपने पहले से ही इस प्रश्न में उल्लेख किया है, PHPhotoLibrary.authorizationStatus() यह जांचने का सही तरीका होगा।

2

UIImagePickerController और PHPhotoLibrary विभिन्न क्षेत्रों के लिए ज़िम्मेदार है।

आपको दोनों को जांचना चाहिए: ऑथ स्थिति और स्रोत उपलब्धता।

PHAuthorizationStatus

को अपने ऐप्लिकेशन के प्राधिकरण के बारे में जानकारी उपयोगकर्ता की तस्वीरें लाइब्रेरी का उपयोग करने।

isSourceTypeAvailable

चर्चा

क्योंकि एक मीडिया स्रोत मौजूद नहीं हो सकता है या हमेशा सभी स्रोत प्रकार का समर्थन न करे अनुपलब्ध, उपकरणों हो सकता है।

उदाहरण लिए , अगर आप उपयोगकर्ता की लाइब्रेरी और पुस्तकालय से एक छवि लेने के लिए प्रयास खाली है, इस विधि झूठी देता है। इसी प्रकार, यदि कैमरा पहले से ही उपयोग में है, तो यह विधि झूठी रिटर्न देती है।

2

यह (नया) व्यवहार , मेरे लिए तार्किक ध्वनि करता है यहाँ क्यों है। UIImagePickerController का उपयोग करते समय आपके ऐप को वास्तव में किसी भी फ़ोटो तक पहुंच प्राप्त नहीं होती है। यह केवल तब होता है जब आपके उपयोगकर्ता ने चुना है, जब ऐसा होता है; और यदि उपयोगकर्ता पिकर में रद्द कर देता है तो उनमें से कोई भी ऐप के लिए उपलब्ध नहीं हो जाता है।

PHPhotoLibrary एक अलग ढांचे का हिस्सा है, Photos, जहां आप उपयोगकर्ता की फोटो लाइब्रेरी के साथ बहुत सारी चीज़ें कर सकते हैं, और इसलिए अनुमति की आवश्यकता है।

तो अगर आप केवल UIImagePickerController उपयोग कर रहे हैं मैं सुझाव देंगे नहीं में तस्वीरें सामान मिश्रण

अस्वीकरण:। एप्पल लोगों से किसी भी आधिकारिक बयान के बारे में सुना नहीं किया है। This forum thread प्रासंगिक दिखता है, शायद हमें वहां एक उत्तर मिल जाएगा।

इसके अलावा, यदि आप पर्याप्त बुरा हैं तो आप सैद्धांतिक रूप से UIImagePickerController के साथ सैद्धांतिक रूप से खराब हो सकते हैं और रनटाइम पर पदानुक्रम देखें और उपयोगकर्ता जो कुछ भी देखता है उसकी जांच करें। लेकिन उस फिर से एप्पल के साथ सौदा करने के लिए, हम बस

संबंधित मुद्दे