Photo Library Permission — είναι η άδεια που χρειάζεται η εφαρμογή για να έχει πρόσβαση σε φωτογραφίες και βίντεο που είναι αποθηκευμένα στη συσκευή του χρήστη. Απαιτείται για την επιλογή εικόνων από τη συλλογή, την αποθήκευση αρχείων πολυμέσων και τη διαχείριση άλμπουμ φωτογραφιών. Σύμφωνα με το Apple Developer Documentation, 2024, από το iOS 14 οι εφαρμογές πρέπει να ζητούν πρόσβαση σε περιορισμένη βιβλιοθήκη, όχι σε όλες τις φωτογραφίες ταυτόχρονα.
Κύρια σημεία
Photo Library Permission — είναι η άδεια συστήματος που ρυθμίζει την πρόσβαση της εφαρμογής σε αρχεία πολυμέσων που είναι αποθηκευμένα στη συσκευή. Καλύπτει τόσο την ανάγνωση (προβολή και επιλογή φωτογραφιών και βίντεο) όσο και την εγγραφή (αποθήκευση νέων αρχείων στη συλλογή). Οι πλατφόρμες κινητών θεωρούν τη βιβλιοθήκη πολυμέσων ως εμπιστευτικά δεδομένα, καθώς οι φωτογραφίες μπορεί να περιέχουν προσωπικές και ευαίσθητες πληροφορίες.
Στο Android 13 (API 33) η Google διαίρεσε την ενιαία άδεια READ_EXTERNAL_STORAGE σε τρεις ξεχωριστές: READ_MEDIA_IMAGES για φωτογραφίες, READ_MEDIA_VIDEO για βίντεο και READ_MEDIA_AUDIO για ήχο. Αυτό επιτρέπει στο χρήστη να παρέχει πρόσβαση μόνο σε ένα συγκεκριμένο τύπο αρχείων πολυμέσων. Στο iOS, από το iOS 14, το PhotoKit παρέχει στο χρήστη τη δυνατότητα να επιλέξει συγκεκριμένες φωτογραφίες για πρόσβαση, αντί να ανοίξει ολόκληρη τη βιβλιοθήκη.
Σύμφωνα με την Counterpoint Research (2024), πάνω από το 70% των εφαρμογών για κινητά στις κατηγορίες κοινωνικών δικτύων, επικοινωνίας και επεξεργασίας φωτογραφιών ζητούν Photo Library Permission. Παράλληλα, το 32% των χρηστών αρνούνται την πρόσβαση στη συλλογή αν δεν καταλαβαίνουν γιατί η εφαρμογή χρειάζεται τις φωτογραφίες τους. Η Apple και η Google συνιστούν τη χρήση του συστήματος PhotoPicker για την επιλογή μεμονωμένων αρχείων χωρίς αίτημα πλήρους πρόσβασης.
Πρόσβαση στη συλλογή σε Android άλλαξε σημαντικά με την κυκλοφορία του Android 13. Αντί για μία ενιαία άδεια READ_EXTERNAL_STORAGE, εμφανίστηκαν λεπτομερείς άδειες για κάθε τύπο αρχείου πολυμέσων, δίνοντας στο χρήστη μεγαλύτερο έλεγχο.
Από το Android 13, για πρόσβαση σε φωτογραφίες χρησιμοποιείται το READ_MEDIA_IMAGES, για βίντεο — READ_MEDIA_VIDEO. Η άδεια READ_EXTERNAL_STORAGE δεν παρέχει πλέον πρόσβαση σε αρχεία πολυμέσων — παρέμεινε μόνο για ανάγνωση μη-πολυμεσικών αρχείων από κοινόχρηστο αποθηκευτικό χώρο. Η δήλωση στο manifest έχει ως εξής:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Για συμβατότητα προς τα πίσω με Android 12 και παλαιότερα, πρέπει να δηλωθεί και το READ_EXTERNAL_STORAGE. Ωστόσο, το Android 13 αγνοεί αυτόματα αυτή την άδεια όταν υπάρχουν οι νέες λεπτομερείς άδειες. Χρησιμοποιήστε το χαρακτηριστικό android:maxSdkVersion="32" στο manifest για την παλιά άδεια, ώστε να την κρύψετε σε νέες εκδόσεις. Αυτό αποτρέπει την περιττή αίτηση σε συσκευές με Android 13+.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
Η αίτηση κατά το χρόνο εκτέλεσης για Photo Library Permission σε Android γίνεται μέσω του Activity Result API. Παράδειγμα αίτησης πρόσβασης σε εικόνες:
private val photoPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) {
loadGalleryImages()
} else {
showPermissionDenied()
}
}
fun pickPhoto() {
val permission = if (Build.version.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
Manifest.permission.READ_MEDIA_IMAGES
} else {
Manifest.permission.READ_EXTERNAL_STORAGE
}
if (ContextCompat.checkSelfPermission(this, permission)
== PackageManager.PERMISSION_GRANTED) {
loadGalleryImages()
} else {
photoPermissionLauncher.launch(permission)
}
}
Πρόσβαση στη συλλογή σε iOS διαχειρίζεται μέσω του πλαισίου PhotoKit και των κλειδιών NSPhotoLibraryUsageDescription και NSPhotoLibraryAddUsageDescription στο Info.plist. Από το iOS 14, ο χρήστης μπορεί να παρέχει πρόσβαση μόνο σε επιλεγμένες φωτογραφίες (Limited Photo Library).
Για ανάγνωση φωτογραφιών από τη βιβλιοθήκη απαιτείται NSPhotoLibraryUsageDescription, για εγγραφή (αποθήκευση φωτογραφιών) — NSPhotoLibraryAddUsageDescription. Αν η εφαρμογή αποθηκεύει μόνο πολυμέσα αλλά δεν τα διαβάζει, το δεύτερο κλειδί αρκεί.
<key>NSPhotoLibraryUsageDescription</key>
<string>Η εφαρμογή χρειάζεται πρόσβαση σε φωτογραφίες για να επιλέξει εικόνα προφίλ και να δημοσιεύσει φωτογραφίες.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Η εφαρμογή χρειάζεται πρόσβαση για να αποθηκεύσει επεξεργασμένες φωτογραφίες στη συλλογή σας.</string>
Η αίτηση πρόσβασης σε φωτογραφίες σε iOS γίνεται μέσω του PHPhotoLibrary.requestAuthorization. Από το iOS 14, η κατάσταση .limited υποδεικνύει ότι ο χρήστης έχει παραχωρήσει πρόσβαση σε περιορισμένο σύνολο φωτογραφιών.
import PhotosUI
func requestPhotoLibraryAccess() {
PHPhotoLibrary.requestAuthorization { status in
DispatchQueue.main.async {
switch status {
case .authorized:
self.loadPhotoLibrary()
case .limited:
self.loadSelectedPhotos()
case .denied, .restricted:
self.showSettingsAlert()
case .notDetermined:
break
}
}
}
}
private func loadPhotoLibrary() {
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let assets = PHAsset.fetchAssets(with: .image, options: fetchOptions)
// Εργασία με αποτελέσματα αιτήματος
}
Η κατάσταση .limited σε iOS 14+ σημαίνει ότι ο χρήστης έχει παραχωρήσει πρόσβαση μόνο σε λίγες επιλεγμένες φωτογραφίες. Η εφαρμογή μπορεί να ζητήσει επέκταση πρόσβασης μέσω διαλόγου συστήματος καλώντας το PHPhotoLibrary.shared().presentLimitedLibraryPicker. Συνιστάται η εμφάνιση αυτού του διαλόγου μόνο όταν ο χρήστης ζητά ρητά μια λειτουργία που απαιτεί πρόσθετες φωτογραφίες.
PhotoPicker — είναι ένα στοιχείο συστήματος για επιλογή αρχείων πολυμέσων που δεν απαιτεί άδεια πρόσβασης σε ολόκληρη τη βιβλιοθήκη. Από το Android 13 και iOS 14, η Google και η Apple συνιστούν τη χρήση του PhotoPicker αντί της αίτησης Photo Library Permission, αν η εφαρμογή χρειάζεται μόνο να επιλέξει μία ή λίγες φωτογραφίες.
Σε Android 13+, ο ενσωματωμένος PhotoPicker (ActivityResultContracts.PickVisualMedia) επιτρέπει στο χρήστη να επιλέξει φωτογραφία ή βίντεο χωρίς να παραχωρήσει πρόσβαση σε ολόκληρη τη συλλογή. Η εφαρμογή λαμβάνει μόνο το URI των επιλεγμένων αρχείων. Ο PhotoPicker λειτουργεί χωρίς δήλωση οποιασδήποτε άδειας στο manifest.
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// URI του επιλεγμένου αρχείου, χωρίς πρόσβαση σε ολόκληρη τη βιβλιοθήκη
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
Σε iOS 14+ εμφανίστηκε το PHPickerViewController — ένας picker συστήματος που επίσης δεν απαιτεί πρόσβαση σε ολόκληρη τη βιβλιοθήκη. Το PHPicker λειτουργεί σε ξεχωριστή διεργασία και δεν έχει πρόσβαση στη βιβλιοθήκη της εφαρμογής. Αυτός είναι ο προτιμώμενος τρόπος επιλογής φωτογραφιών για τα περισσότερα σενάρια.
import PhotosUI
func presentPhotoPicker() {
var config = PHPickerConfiguration()
config.selectionLimit = 1
config.filter = .images
let picker = PHPickerViewController(configuration: config)
picker.delegate = self
present(picker, animated: true)
}
Ο PhotoPicker δεν είναι κατάλληλος αν η εφαρμογή χρειάζεται πρόσβαση σε ολόκληρη τη βιβλιοθήκη για μαζικές λειτουργίες: δημιουργία αντιγράφων ασφαλείας, συγχρονισμός με το cloud, εφαρμογή-συλλογή, διαχείριση αρχείων. Σε αυτές τις περιπτώσεις, πρέπει να ζητηθεί Photo Library Permission και να γίνει διαχείριση της περίπτωσης περιορισμένης πρόσβασης (Limited). Για iOS, είναι υποχρεωτική η διαχείριση της κατάστασης .limited και η προσφορά επέκτασης πρόσβασης στο χρήστη.
Βέλτιστες πρακτικές εργασίας με το Photo Library Permission βοηθούν στη μείωση του αριθμού των αρνήσεων και στην τήρηση των απαιτήσεων απορρήτου των πλατφορμών.
Για επιλογή μίας ή περισσότερων φωτογραφιών, χρησιμοποιήστε το σύστημα PhotoPicker ή PHPicker. Αυτά τα στοιχεία δεν απαιτούν άδειες και παρέχουν την καλύτερη εμπειρία χρήστη. Ζητήστε πλήρη άδεια πρόσβασης στη συλλογή μόνο αν η λειτουργικότητα της εφαρμογής απαιτεί πρόσβαση σε ολόκληρη τη βιβλιοθήκη πολυμέσων. Google και Apple συνιστούν ρητά αυτή την προσέγγιση στην τεκμηρίωση για προγραμματιστές.
Αν η εφαρμογή χρειάζεται πραγματικά πλήρη πρόσβαση στη συλλογή, εμφανίστε μια προκαταρκτική οθόνη με επεξήγηση. Εξηγήστε γιατί χρειάζονται όλες οι φωτογραφίες, όχι μόνο μία. Για παράδειγμα, μια εφαρμογή δημιουργίας αντιγράφων ασφαλείας πρέπει να εξηγήσει ότι θα σαρώσει όλα τα αρχεία πολυμέσων για να δημιουργήσει ένα αντίγραφο. Η Pre-permission screen είναι ιδιαίτερα σημαντική στο iOS λόγω του μηχανισμού Limited Access.
Αν η εφαρμογή αποθηκεύει μόνο φωτογραφίες αλλά δεν τις διαβάζει (π.χ., επεξεργαστής φωτογραφιών που αποθηκεύει το αποτέλεσμα), ζητήστε μόνο άδεια εγγραφής στη συλλογή. Σε Android αυτό είναι WRITE_EXTERNAL_STORAGE (για Android 12 και παλαιότερα) ή MediaStore API χωρίς άδεια (για Android 10+). Σε iOS χρησιμοποιήστε NSPhotoLibraryAddUsageDescription χωρίς NSPhotoLibraryUsageDescription.
Συχνές ερωτήσεις
Από το Android 10 (API 29), η αποθήκευση φωτογραφιών μέσω MediaStore δεν απαιτεί άδεια WRITE_EXTERNAL_STORAGE. Το σύστημα παρέχει πρόσβαση στον κοινόχρηστο αποθηκευτικό χώρο για εγγραφή χωρίς ρητή άδεια. Για ανάγνωση αρχείων άλλων εξακολουθεί να απαιτείται η κατάλληλη άδεια.
READ_EXTERNAL_STORAGE — παλιά άδεια για ανάγνωση όλων των αρχείων από κοινόχρηστο αποθηκευτικό χώρο (έως Android 12). READ_MEDIA_IMAGES — νέα λεπτομερής άδεια για ανάγνωση μόνο εικόνων (Android 13+). Ο χρήστης μπορεί να παραχωρήσει πρόσβαση μόνο σε φωτογραφίες, αρνούμενος την πρόσβαση σε βίντεο και ήχο.
Η κατάσταση .limited σημαίνει ότι ο χρήστης επέλεξε μερικές φωτογραφίες για πρόσβαση. Η εφαρμογή μπορεί να εμφανίσει τον διάλογο συστήματος επέκτασης μέσω PHPhotoLibrary.shared().presentLimitedLibraryPicker. Συνιστάται η εμφάνιση αυτού του διαλόγου μόνο κατόπιν ρητού αιτήματος του χρήστη, για παράδειγμα, όταν πατάει το κουμπί "Προσθήκη περισσότερων φωτογραφιών".
Ναι, με το Photo Library Permission η εφαρμογή μπορεί να διαβάσει δεδομένα EXIF, συμπεριλαμβανομένων γεωετικετών, ημερομηνίας λήψης και μοντέλου κάμερας. Σε iOS, για πρόσβαση σε γεωετικέτες μπορεί να απαιτηθεί πρόσθετη Location Permission, καθώς η Apple θεωρεί τις συντεταγμένες GPS ως εμπιστευτικά δεδομένα.
Χρησιμοποιήστε τον picker συστήματος: PHPicker με filter = .videos σε iOS, PickVisualMedia με VideoOnly σε Android. Σε Android, για επιλογή βίντεο από τη συλλογή μπορεί επίσης να χρησιμοποιηθεί Intent(Intent.ACTION_PICK) με MediaStore.Video.Media.EXTERNAL_CONTENT_URI, αλλά αυτό απαιτεί άδεια READ_EXTERNAL_STORAGE σε εκδόσεις κάτω από Android 13.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης