Photo Library Permission — bu foydalanuvchi qurilmasida saqlangan fotosuratlar va videolarga kirish uchun ilovaga kerak bo'lgan ruxsatdir. Galereyadan rasmlarni tanlash, media fayllarni saqlash va foto albomlarini boshqarish uchun talab qilinadi. Apple Developer Documentation, 2024 ma'lumotlariga ko'ra, iOS 14 dan boshlab ilovalar barcha fotosuratlarga emas, balki cheklangan kutubxonaga kirishni so'rashi kerak.
Asosiy ma'lumotlar
Photo Library Permission — bu ilovaning qurilmada saqlangan media fayllarga kirishini tartibga soluvchi tizim ruxsatidir. U ham o'qish (fotosuratlar va videolarni ko'rish va tanlash), ham yozish (galereyaga yangi fayllarni saqlash) ni qamrab oladi. Mobil platformalar media kutubxonasini maxfiy ma'lumotlar sifatida ko'rib chiqadi, chunki fotosuratlar shaxsiy va nozik ma'lumotlarni o'z ichiga olishi mumkin.
Android 13 (API 33) da Google yagona READ_EXTERNAL_STORAGE ruxsatini uchta alohida ruxsatga ajratdi: fotosuratlar uchun READ_MEDIA_IMAGES, videolar uchun READ_MEDIA_VIDEO va audio uchun READ_MEDIA_AUDIO. Bu foydalanuvchiga faqat ma'lum bir media turiga kirishni taqdim etish imkonini beradi. iOSda iOS 14 dan boshlab PhotoKit foydalanuvchiga butun kutubxonani ochish o'rniga muayyan fotosuratlarni tanlash imkoniyatini beradi.
Counterpoint Research (2024) ma'lumotlariga ko'ra, ijtimoiy tarmoqlar, aloqa va foto muharrirlari toifalaridagi mobil ilovalarning 70% dan ortig'i Photo Library Permission so'raydi. Shu bilan birga, foydalanuvchilarning 32% ilovaga ularning fotosuratlari nima uchun kerakligini tushunmasa, galereyaga kirishni rad etadi. Apple va Google alohida fayllarni tanlash uchun to'liq kirishni so'ramasdan tizim PhotoPicker dan foydalanishni tavsiya qiladi.
Androidda galereyaga kirish Android 13 chiqishi bilan sezilarli darajada o'zgardi. Bitta READ_EXTERNAL_STORAGE ruxsati o'rniga har bir media fayl turi uchun granular ruxsatlar paydo bo'ldi, bu foydalanuvchiga ko'proq nazorat beradi.
Android 13 dan boshlab fotosuratlarga kirish uchun READ_MEDIA_IMAGES, videolar uchun READ_MEDIA_VIDEO ishlatiladi. READ_EXTERNAL_STORAGE ruxsati endi media fayllarga kirishni ta'minlamaydi — u faqat umumiy ombordan media bo'lmagan fayllarni o'qish uchun qoldi. Manifestda e'lon qilish quyidagicha ko'rinadi:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Android 12 va pastki versiyalar bilan orqaga moslik uchun READ_EXTERNAL_STORAGE ham e'lon qilinishi kerak. Biroq Android 13 yangi granular ruxsatlar mavjud bo'lganda bu ruxsatni avtomatik ravishda e'tiborsiz qoldiradi. Eski ruxsat uchun manifestda android:maxSdkVersion="32" atributidan foydalaning, uni yangi versiyalarda yashirish uchun. Bu Android 13+ qurilmalarida ortiqcha so'rovning oldini oladi.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
Androidda Photo Library Permission uchun runtime so'rovi Activity Result API orqali amalga oshiriladi. Rasmlarga kirish so'rovi namunasi:
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)
}
}
iOSda galereyaga kirish PhotoKit framework va Info.plistdagi NSPhotoLibraryUsageDescription va NSPhotoLibraryAddUsageDescription kalitlari orqali boshqariladi. iOS 14 dan boshlab foydalanuvchi faqat tanlangan fotosuratlarga kirishni taqdim etishi mumkin (Limited Photo Library).
Kutubxonadan fotosuratlarni o'qish uchun NSPhotoLibraryUsageDescription, yozish (fotosuratlarni saqlash) uchun NSPhotoLibraryAddUsageDescription talab qilinadi. Agar ilova faqat mediani saqlasa, lekin o'qimasa, ikkinchi kalit etarli.
<key>NSPhotoLibraryUsageDescription</key>
<string>Ilovaga profil rasmini tanlash va suratlarni nashr qilish uchun fotosuratlarga kirish kerak.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Ilovaga qayta ishlangan fotosuratlarni sizning galereyangizda saqlash uchun kirish kerak.</string>
iOSda fotosuratlarga kirish so'rovi PHPhotoLibrary.requestAuthorization orqali amalga oshiriladi. iOS 14 dan boshlab .limited holati foydalanuvchi cheklangan fotosuratlar to'plamiga kirishni taqdim etganligini bildiradi.
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)
// So'rov natijalari bilan ishlash
}
iOS 14+ da .limited holati foydalanuvchi faqat bir nechta tanlangan fotosuratlarga kirishni taqdim etganligini anglatadi. Ilova PHPhotoLibrary.shared().presentLimitedLibraryPicker ni chaqirib, tizim dialogi orqali kirishni kengaytirishni so'rashi mumkin. Ushbu dialogni faqat foydalanuvchi qo'shimcha fotosuratlar kerak bo'lgan funksiyani aniq so'raganda ko'rsatish tavsiya etiladi.
PhotoPicker — bu butun kutubxonaga kirish ruxsatini talab qilmaydigan tizim media tanlash komponentidir. Android 13 va iOS 14 dan boshlab Google va Apple, agar ilova faqat bir yoki bir nechta fotosurat tanlashi kerak bo'lsa, Photo Library Permission so'rash o'rniga PhotoPicker dan foydalanishni tavsiya qiladi.
Android 13+ da o'rnatilgan PhotoPicker (ActivityResultContracts.PickVisualMedia) foydalanuvchiga butun galereyaga kirishni taqdim etmasdan foto yoki video tanlash imkonini beradi. Ilova faqat tanlangan fayllarning URI sini oladi. PhotoPicker manifestda hech qanday ruxsat e'lon qilmasdan ishlaydi.
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// Tanlangan faylning URI, butun kutubxonaga kirishsiz
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
iOS 14+ da PHPickerViewController paydo bo'ldi — butun kutubxonaga kirishni talab qilmaydigan tizim pikeri. PHPicker alohida jarayonda ishlaydi va ilova kutubxonasiga kirish imkoniyatiga ega emas. Bu ko'pchilik stsenariylar uchun fotosuratlarni tanlashning afzal usulidir.
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 ommaviy operatsiyalar uchun ilova butun kutubxonaga kirishni talab qilganda mos kelmaydi: zaxira nusxasi, bulut bilan sinxronizatsiya, galereya ilovasi, fayl menejeri. Bunday hollarda Photo Library Permission so'rash va cheklangan kirish (Limited) holatini boshqarish kerak. iOS uchun .limited holatini qayta ishlash va foydalanuvchiga kirishni kengaytirishni taklif qilish majburiydir.
Eng yaxshi amaliyotlar Photo Library Permission bilan ishlash rad etishlar sonini kamaytirishga va platformalarning maxfiylik talablariga javob berishga yordam beradi.
Bir yoki bir nechta fotosuratlarni tanlash uchun tizim PhotoPicker yoki PHPicker dan foydalaning. Ushbu komponentlar ruxsat talab qilmaydi va eng yaxshi foydalanuvchi tajribasini ta'minlaydi. Galereyaga to'liq kirish ruxsatini faqat ilova funksionalligi butun media kutubxonasiga kirishni talab qilganda so'rang. Google va Apple ishlab chiquvchilar hujjatlarida ushbu yondashuvni aniq tavsiya qiladi.
Agar ilova haqiqatan ham galereyaga to'liq kirishga muhtoj bo'lsa, tushuntirish bilan dastlabki ekranni ko'rsating. Nima uchun barcha fotosuratlar kerakligini, faqat bittasi emasligini tushuntiring. Masalan, zaxira nusxasi ilovasi nusxa yaratish uchun barcha media fayllarni skanerlashini tushuntirishi kerak. Pre-permission screen Limited Access mexanizmi tufayli iOSda ayniqsa muhimdir.
Agar ilova faqat fotosuratlarni saqlasa, lekin o'qimasa (masalan, natijani saqlaydigan foto muharriri), faqat galereyaga yozish ruxsatini so'rang. Androidda bu WRITE_EXTERNAL_STORAGE (Android 12 va pastki versiyalar uchun) yoki ruxsatsiz MediaStore API (Android 10+ uchun). iOSda NSPhotoLibraryUsageDescriptionsiz NSPhotoLibraryAddUsageDescription dan foydalaning.
Tez-tez beriladigan savollar
Android 10 (API 29) dan boshlab MediaStore orqali fotosuratlarni saqlash WRITE_EXTERNAL_STORAGE ruxsatini talab qilmaydi. Tizim aniq ruxsatsiz umumiy omborga yozish uchun kirishni ta'minlaydi. Boshqalarning fayllarini o'qish uchun hali ham tegishli ruxsat talab qilinadi.
READ_EXTERNAL_STORAGE — umumiy ombordan barcha fayllarni o'qish uchun eski ruxsat (Android 12 gacha). READ_MEDIA_IMAGES — faqat rasmlarni o'qish uchun yangi granular ruxsat (Android 13+). Foydalanuvchi videolar va audioga kirishni rad etib, faqat fotosuratlarga kirishni ta'minlashi mumkin.
.limited holati foydalanuvchi kirish uchun bir nechta fotosuratlarni tanlaganligini anglatadi. Ilova PHPhotoLibrary.shared().presentLimitedLibraryPicker orqali tizim kengaytirish dialogini ko'rsatishi mumkin. Ushbu dialogni faqat foydalanuvchining aniq so'rovi bo'yicha, masalan, "Ko'proq fotosurat qo'shish" tugmasi bosilganda ko'rsatish tavsiya etiladi.
Ha, Photo Library Permission mavjud bo'lganda ilova EXIF ma'lumotlarini, jumladan geoteglar, suratga olish sanasi va kamera modelini o'qishi mumkin. iOSda geoteglarga kirish uchun qo'shimcha Location Permission talab qilinishi mumkin, chunki Apple GPS koordinatalarini maxfiy ma'lumot deb hisoblaydi.
Tizim pikeridan foydalaning: iOSda filter = .videos bilan PHPicker, Androidda VideoOnly bilan PickVisualMedia. Androidda galereyadan videoni tanlash uchun Intent(Intent.ACTION_PICK) MediaStore.Video.Media.EXTERNAL_CONTENT_URI bilan ham ishlatilishi mumkin, ammo bu Android 13 dan past versiyalarda READ_EXTERNAL_STORAGE ruxsatini talab qiladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.