Photo Library Permission — bu, istifadəçinin cihazında saxlanılan fotoşəkillərə və videolara giriş üçün tətbiqə lazım olan icazədir. Qalereyadan şəkilləri seçmək, media fayllarını saxlamaq və foto albomlarını idarə etmək üçün tələb olunur. Apple Developer Documentation, 2024-ə görə, iOS 14-dən başlayaraq tətbiqlər bütün fotoşəkillərə deyil, məhdud kitabxanaya giriş tələb etməlidir.
Əsas məqamlar
Photo Library Permission — bu, tətbiqin cihazda saxlanılan media fayllarına girişini tənzimləyən sistem icazəsidir. Həm oxuma (fotoşəkillərə və videolara baxmaq və seçmək), həm də yazma (qalereyaya yeni faylları saxlamaq) əhatə edir. Mobil platformalar media kitabxanasını məxfi məlumat kimi qəbul edir, çünki fotoşəkillər şəxsi və həssas məlumatlar ehtiva edə bilər.
Android 13-də (API 33) Google tək READ_EXTERNAL_STORAGE icazəsini üç ayrı icazəyə böldü: fotoşəkillər üçün READ_MEDIA_IMAGES, videolar üçün READ_MEDIA_VIDEO və audio üçün READ_MEDIA_AUDIO. Bu, istifadəçiyə yalnız müəyyən media növünə giriş verməyə imkan verir. iOS-da iOS 14-dən başlayaraq PhotoKit istifadəçiyə bütün kitabxananı açmaq əvəzinə konkret fotoşəkilləri seçmək imkanı verir.
Counterpoint Research (2024) məlumatına görə, sosial şəbəkələr, rabitə və foto redaktorları kateqoriyalarında mobil tətbiqlərin 70%-dən çoxu Photo Library Permission tələb edir. Bununla yanaşı, istifadəçilərin 32%-i tətbiqin fotoşəkillərinə niyə ehtiyacı olduğunu başa düşmədikdə qalereyaya girişi rədd edir. Apple və Google ayrı-ayrı faylları seçmək üçün tam giriş tələb etmədən sistem PhotoPicker-dən istifadə etməyi tövsiyə edir.
Android-də qalereyaya giriş Android 13-ün buraxılması ilə əhəmiyyətli dərəcədə dəyişdi. Tək READ_EXTERNAL_STORAGE icazəsi əvəzinə hər media növü üçün dənəvər icazələr meydana çıxdı ki, bu da istifadəçiyə daha çox nəzarət verir.
Android 13-dən başlayaraq fotoşəkillərə giriş üçün READ_MEDIA_IMAGES, videolar üçün READ_MEDIA_VIDEO istifadə olunur. READ_EXTERNAL_STORAGE icazəsi artıq media fayllarına giriş təmin etmir — o, yalnız ümumi yaddaşdan media olmayan faylları oxumaq üçün qalıb. Manifestdə bəyannamə belə görünür:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Android 12 və aşağısı ilə geriyə uyğunluq üçün READ_EXTERNAL_STORAGE da bəyan edilməlidir. Lakin Android 13 yeni dənəvər icazələr olduqda bu icazəni avtomatik olaraq görməzlikdən gəlir. Köhnə icazə üçün manifestdə android:maxSdkVersion="32" atributundan istifadə edin ki, yeni versiyalarda gizlənsin. Bu, Android 13+ olan cihazlarda lazımsız tələbin qarşısını alır.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
Android-də Photo Library Permission üçün icazə sorğusu Activity Result API vasitəsilə həyata keçirilir. Şəkillərə giriş sorğusu nümunəsi:
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-də qalereyaya giriş PhotoKit framework və Info.plist-də NSPhotoLibraryUsageDescription və NSPhotoLibraryAddUsageDescription açarları vasitəsilə idarə olunur. iOS 14-dən başlayaraq istifadəçi yalnız seçilmiş fotoşəkillərə giriş verə bilər (Limited Photo Library).
Kitabxanadan foto oxumaq üçün NSPhotoLibraryUsageDescription, yazmaq (fotoşəkilləri saxlamaq) üçün NSPhotoLibraryAddUsageDescription tələb olunur. Tətbiq yalnız media saxlayırsa, ancaq oxumursa, ikinci açar kifayətdir.
<key>NSPhotoLibraryUsageDescription</key>
<string>Tətbiqin profil şəkli seçmək və şəkilləri dərc etmək üçün fotoşəkillərə girişi lazımdır.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Tətbiqin işlənmiş fotoşəkilləri sizin qalereyanızda saxlamaq üçün girişi lazımdır.</string>
iOS-da fotoşəkillərə giriş sorğusu PHPhotoLibrary.requestAuthorization vasitəsilə həyata keçirilir. iOS 14-dən başlayaraq .limited statusu istifadəçinin məhdud fotoşəkillər dəstinə giriş verdiyini göstərir.
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)
// Sorğu nəticələri ilə işləmə
}
iOS 14+-də .limited statusu o deməkdir ki, istifadəçi yalnız bir neçə seçilmiş fotoşəkilə giriş verib. Tətbiq sistem dialoqu vasitəsilə girişin genişləndirilməsini tələb edə bilər, PHPhotoLibrary.shared().presentLimitedLibraryPicker çağıraraq. Bu dialoqu yalnız istifadəçi açıq şəkildə əlavə fotoşəkillər tələb edən funksiyanı istədikdə göstərmək tövsiyə olunur.
PhotoPicker — bu, bütün kitabxanaya giriş icazəsi tələb etməyən sistem media seçmə komponentidir. Android 13 və iOS 14-dən başlayaraq Google və Apple Photo Library Permission tələb etmək əvəzinə PhotoPicker-dən istifadə etməyi tövsiyə edir, əgər tətbiq yalnız bir və ya bir neçə fotoşəkil seçməlidirsə.
Android 13+-də daxili PhotoPicker (ActivityResultContracts.PickVisualMedia) istifadəçiyə bütün qalereyaya giriş vermədən foto və ya video seçməyə imkan verir. Tətbiq yalnız seçilmiş faylların URI-ni alır. PhotoPicker manifestdə heç bir icazə bəyan etmədən işləyir.
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// Seçilmiş faylın URI, bütün kitabxanaya giriş olmadan
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
iOS 14+-də PHPickerViewController meydana çıxdı — bütün kitabxanaya giriş tələb etməyən sistem picker. PHPicker ayrı bir prosesdə işləyir və tətbiq kitabxanasına girişi yoxdur. Bu, əksər hallarda foto seçmək üçün üstünlük verilən üsuldur.
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 kütləvi əməliyyatlar üçün tətbiqin bütün kitabxanaya girişi lazım olduqda uyğun deyil: ehtiyat nüsxəsi, bulud ilə sinxronizasiya, qalereya tətbiqi, fayl meneceri. Bu hallarda Photo Library Permission tələb etmək və məhdud giriş (Limited) halını idarə etmək lazımdır. iOS üçün .limited statusunun idarə edilməsi və istifadəçiyə girişi genişləndirməyi təklif etmək məcburidir.
Ən yaxşı təcrübələr Photo Library Permission ilə işləmək imtinaların sayını azaltmağa və platformaların məxfilik tələblərinə cavab verməyə kömək edir.
Bir və ya bir neçə fotoşəkil seçmək üçün sistem PhotoPicker və ya PHPicker-dən istifadə edin. Bu komponentlər icazə tələb etmir və ən yaxşı istifadəçi təcrübəsini təmin edir. Qalereyaya tam giriş icazəsini yalnız tətbiq funksionallığı bütün media kitabxanasına giriş tələb etdikdə tələb edin. Google və Apple tərtibatçı sənədlərində bu yanaşmanı açıq şəkildə tövsiyə edir.
Əgər tətbiq həqiqətən qalereyaya tam girişə ehtiyac duyursa, izahat ilə ilkin ekran göstərin. Bütün fotoşəkillərin nə üçün lazım olduğunu izah edin, təkcə birinin yox. Məsələn, ehtiyat nüsxə tətbiqi bütün media fayllarını skan edəcəyini izah etməlidir. Pre-permission screen Limited Access mexanizminə görə iOS-da xüsusilə vacibdir.
Əgər tətbiq yalnız fotoşəkilləri saxlayır, ancaq oxumursa (məsələn, nəticəni saxlayan foto redaktoru), yalnız qalereyaya yazma icazəsi tələb edin. Android-də bu WRITE_EXTERNAL_STORAGE (Android 12 və aşağısı üçün) və ya icazəsiz MediaStore API-dir (Android 10+ üçün). iOS-da NSPhotoLibraryUsageDescription olmadan NSPhotoLibraryAddUsageDescription istifadə edin.
Tez-tez verilən suallar
Android 10-dan (API 29) başlayaraq MediaStore vasitəsilə fotoşəkilləri saxlamaq WRITE_EXTERNAL_STORAGE icazəsi tələb etmir. Sistem açıq icazə olmadan ümumi yaddaşa yazmaq üçün giriş təmin edir. Başqalarının fayllarını oxumaq üçün hələ də müvafiq icazə tələb olunur.
READ_EXTERNAL_STORAGE — ümumi yaddaşdan bütün faylları oxumaq üçün köhnə icazə (Android 12-yə qədər). READ_MEDIA_IMAGES — yalnız şəkilləri oxumaq üçün yeni dənəvər icazə (Android 13+). İstifadəçi videolara və audiyə girişi rədd edərək yalnız fotoşəkillərə giriş verə bilər.
.limited statusu o deməkdir ki, istifadəçi giriş üçün bir neçə fotoşəkil seçib. Tətbiq PHPhotoLibrary.shared().presentLimitedLibraryPicker vasitəsilə sistem genişləndirmə dialoqunu göstərə bilər. Bu dialoqu yalnız istifadəçinin açıq tələbi ilə, məsələn, "Daha çox fotoşəkil əlavə et" düyməsini basdıqda göstərmək tövsiyə olunur.
Bəli, Photo Library Permission olduqda tətbiq EXIF məlumatlarını, o cümlədən geoteqləri, çəkiliş tarixini və kamera modelini oxuya bilər. iOS-da geoteqlərə giriş üçün əlavə Location Permission tələb oluna bilər, çünki Apple GPS koordinatlarını məxfi məlumat hesab edir.
Sistem picker-dən istifadə edin: iOS-də filter = .videos ilə PHPicker, Android-də VideoOnly ilə PickVisualMedia. Android-də qalereyadan video seçmək üçün Intent(Intent.ACTION_PICK) MediaStore.Video.Media.EXTERNAL_CONTENT_URI ilə də istifadə oluna bilər, lakin bu, Android 13-dən aşağı versiyalarda READ_EXTERNAL_STORAGE icazəsi tələb edir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun