Fayl tizimi bilan ishlash har qanday mobil ilovaning asosidir. Har bir platforma o'ziga xos kirish modelini taklif qiladi: iOS-da Sandbox ilovalarni alohida konteynerlarda izolyatsiya qiladi, Android-da esa Scoped Storage umumiy xotiraga to'g'ridan-to'g'ri kirishni cheklaydi. Google Developer Documentation (2026) ga ko'ra, Android 10 bilan Scoped Storage-ning joriy etilishi ma'lumotlarni saqlash arxitekturasini to'liq qayta ko'rib chiqishni talab qildi. Ushbu qo'llanmada ikkala platforma uchun FileManager, MediaStore API, Storage Access Framework va DocumentProvider-ni ko'rib chiqamiz.
Asosiy fikrlar
Mobil ilovalarda fayl tizimi iOS va Android qurilmalarida ma'lumotlarni saqlash va kirishni belgilaydigan API-lar, xavfsizlik qoidalari va cheklovlar to'plamidir. Ish stoli operatsion tizimlaridan farqli o'laroq, mobil platformalar har bir ilovani izolyatsiya qiladi, bu foydalanuvchi ma'lumotlarini boshqa dasturlar tomonidan ruxsatsiz o'qishdan himoya qiladi.
iOS Sandbox modelidan foydalanadi, bu erda har bir ilova qat'iy cheklangan ruxsatnomalar bilan o'z konteynerida mavjud. 10-versiyadan oldin Android tashqi xotiraga to'liq kirishni ta'minladi, ammo Scoped Storage joriy etilishi bilan yondashuv iOS-ga yaqinlashdi. Asosiy farq shundaki, iOS fayl tizimini to'liq izolyatsiya qiladi, Android esa bir necha kirish darajasini taklif qiladi: shaxsiy katalog, ommaviy MediaStore va SAF orqali vaqtinchalik kirish.
Mobil ilovalar uch turdagi ma'lumot xotirasidan foydalanadi. Shaxsiy xotira — ichki fayllar va kesh uchun faqat ilova kirishi mumkin bo'lgan katalog. Umumiy xotira — MediaStore (Android) yoki Files App (iOS) orqali media fayllar. Bulutli xotira — qurilmalar o'rtasida sinxronizatsiya uchun iCloud Drive va Google Drive. Har bir turning o'lcham, fayl muddati va kirish shartlari bo'yicha o'z cheklovlari bor.
| Xotira turi | iOS | Android |
|---|---|---|
| Shaxsiy | Documents, Library, Caches | getFilesDir(), getCacheDir() |
| Umumiy media | PHPhotoLibrary tanlovchi orqali | MediaStore API (ContentResolver) |
| Umumiy hujjatlar | UIDocumentPicker orqali Files App | Storage Access Framework (SAF) |
| Bulut | iCloud Drive (UIDocument) | Google Drive API |
| Kesh | Caches katalogi, tizim tomonidan tozalanadi | getCacheDir(), getExternalCacheDir() |
Sandbox har bir ilovani izolyatsiya qiluvchi iOS xavfsizlik arxitekturasidir. Ilova faqat o'z sandbox ichida o'qishi va yozishi mumkin. Kontaktlar, fotosuratlar yoki boshqa ilovalarning fayllariga kirish uchun tizim tanlovchilaridan foydalanish kerak: UIImagePickerController yoki UIDocumentPickerViewController. Files App-ga kirish Info.plist-dagi UIFileSharingEnabled bayrog'i orqali sozlanadi. iOS-da mobil ishlab chiqishda fayl tizimi katalog tuzilishini tushunishni va har bir ma'lumot turi uchun to'g'ri joyni tanlashni talab qiladi.
iOS sandbox bir nechta standart katalogdan iborat. Documents — foydalanuvchi fayllari uchun, iCloud Backup tarkibiga kiradi. Caches — xotira kam bo'lganda tizim o'chirishi mumkin bo'lgan vaqtinchalik ma'lumotlar uchun. Temporary — joriy seans fayllari uchun, qayta ishga tushirishda tozalanadi. Application Support — foydalanuvchidan yashirilgan ichki ilova ma'lumotlari uchun. Noto'g'ri katalogni tanlash muammolarga olib keladi: Documents-da keshlash iCloud joyini behuda sarflaydi va Apple-ning fayl tizimi ko'rsatmalarini buzadi.
import Foundation
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
let fileURL = documentsURL.appendingPathComponent("notes.txt")
let text = "Содержимое файла"
// Atomik yozish shifrlash bilan
try text.write(
to: fileURL,
atomically: true,
encoding: .utf8
)
FileManager sinfi iOS-da fayllarni boshqarish uchun to'liq usullar to'plamini taqdim etadi. FileManager.default ko'pchilik operatsiyalar uchun mos bo'lgan thread-safe singltdir. fileExists(atPath:), createDirectory(at:withIntermediateDirectories:attributes:), copyItem(at:to:) va removeItem(at:) kabi usullar asosiy stsenariylarni qamrab oladi. 1 MB dan katta fayl operatsiyalari DispatchQueue.global() orqali fon threadida bajarilishi kerak. Katta hajmlarni oqim bilan uzatish uchun butun faylni xotiraga yuklash o'rniga FileHandle dan foydalaning.
func readDocumentsFile(named fileName: String) -> String? {
guard let docsURL = FileManager.default.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return nil }
let fileURL = docsURL.appendingPathComponent(fileName)
return try? String(contentsOf: fileURL)
}
Android 10 ning chiqarilishi bilan Google Scoped Storage ni taqdim etdi — fayl tizimiga cheklangan kirish modeli. Ilova faqat o'z shaxsiy kataloglarida erkin o'qishi va yozishi mumkin. Media fayllar (fotosuratlar, video, audio) uchun ContentResolver orqali MediaStore API ishlatiladi. Ixtiyoriy hujjatlar uchun Intent ACTION_OPEN_DOCUMENT orqali Storage Access Framework ishlatiladi. Android 11+ da tashqi xotira ildiziga to'g'ridan-to'g'ri kirish butunlay taqiqlangan va barcha ishlab chiquvchilar yangi API-lardan foydalanishi kerak.
MediaStore qurilmadagi media fayllariga kirish uchun tizim ContentProvider-idir. ContentResolver orqali ilova to'g'ridan-to'g'ri yo'llar o'rniga fayl Uri ni so'raydi. MediaStore.Files — barcha fayl turlari uchun, Images — tasvirlar uchun, Video — videolar uchun, Audio — audio yozuvlari uchun. Umumiy kataloglarga yozish DISPLAY_NAME, MIME_TYPE va RELATIVE_PATH bilan insert() orqali amalga oshiriladi. Kiritishdan so'ng ilova baytlar yoziladigan Uri ni oladi. MIME turlari muhim rol o'ynaydi — noto'g'ri tur faylni ochishda xatoga olib keladi.
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, "report.pdf")
put(MediaStore.MediaColumns.MIME_TYPE, "application/pdf")
put(MediaStore.MediaColumns.RELATIVE_PATH, "Documents/Reports")
}
val uri = contentResolver.insert(
MediaStore.Files.getContentUri("external"),
contentValues
)
uri?.let {
contentResolver.openOutputStream(it)?.use { stream ->
stream.write(pdfBytes)
}
}
SAF ishlash vaqti ruxsatnomalarisiz fayllarni tanlash va yaratish uchun yagona interfeysni taqdim etadi. Intent ACTION_OPEN_DOCUMENT Android-da tizim fayl menejerini ochadi. Tanlashdan so'ng ilova FLAG_GRANT_READ_URI_PERMISSION orqali vaqtinchalik kirish bilan content:// Uri oladi. ACTION_CREATE_DOCUMENT foydalanuvchi tanlagan istalgan tashqi xotira joyida fayllarni saqlashga imkon beradi. SAF Android 5+ da ishlaydi va DocumentsProvider orqali ulangan bulut provayderlarining fayllariga kirishni ta'minlaydi.
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "*/*"
putExtra(Intent.EXTRA_MIME_TYPES, arrayOf(
"application/pdf",
"text/plain"
))
}
startActivityForResult(intent, REQUEST_CODE)
Ikkala platforma ham foydalanuvchilarga fayllarni tanlash uchun o'rnatilgan mexanizmlarni taqdim etadi. Mobil ilovalardagi hujjatlar doimiy ruxsatnomalarsiz faylga vaqtinchalik kirish beradigan tizim tanlovchilari orqali uzatiladi. iOS-da bu UIDocumentPickerViewController, Android-da ACTION_OPEN_DOCUMENT. Mobil ilovalardagi hujjatlar mahalliy xotira va bulut xizmatlaridan tanlanishi mumkin. Foydalanuvchi faylni aniq belgilaydi va ilova cheklangan amal qilish muddati bilan Uri yoki URL oladi.
UIDocumentPickerViewController Files App ni ochadi va bir yoki bir nechta hujjatni tanlashga imkon beradi. Rejimlar: import (sandboxga nusxalash) va ochish (xavfsizlik doirali URL orqali kirish). Fayl filtrlash uchun UTType turlari massivi uzatiladi — masalan, .pdf va .plainText. URL ni olgandan so'ng, ilova o'qishdan oldin startAccessingSecurityScopedResource() va tugatgandan keyin stopAccessingSecurityScopedResource() ni chaqirishi kerak. stopAccessing ni chaqirmaslik tizim resurslarining oqishiga olib keladi. iOS-da mobil ilovalardagi hujjatlar fayl bilan ish tugagandan so'ng vaqtinchalik ruxsatnomalarni majburiy bo'shatishni talab qiladi.
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.pdf, .plainText]
)
picker.allowsMultipleSelection = true
picker.delegate = self
present(picker, animated: true)
// Vakilda kirishni bo'shatish
func documentPicker(
_ controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
}
FileProvider ilovalar o'rtasida fayllarni xavfsiz almashish uchun ContentProvider ning pastki sinfidir. Belgilangan XML kataloglaridagi fayllarga asoslangan holda vaqtinchalik content:// Uri yaratadi. Boshqa ilovalar FLAG_GRANT_READ_URI_PERMISSION bilan Intent orqali kirishadi. DocumentProvider, FileProvider dan farqli o'laroq, fayllarni SAF da nashr qiladi va boshqa ilovalarga ilovangiz tarkibini fayl tizimining bir qismi sifatida ko'rishga imkon beradi. DocumentsProvider ni amalga oshirish uchun queryRoots(), queryChildDocuments() va openDocument() ni bekor qilishingiz, keyin AndroidManifest.xml da ro'yxatdan o'tkazishingiz kerak.
Bulut sinxronizatsiyasi foydalanuvchilarga barcha qurilmalarida hujjatlarga kirish imkonini beradi. Mobil ilovalardagi fayl tizimi bulut qatlami bilan kuchaytiriladi: iOS-da UIDocument o'zgarishlarni avtomatik kuzatadi va ularni iCloud orqali sinxronlashtiradi. Android-da shunga o'xshash funksionallik Google Drive API yoki bulut ildizlari bilan DocumentsProvider orqali quriladi. Ishonchli qurilmalararo sinxronizatsiyani yaratish uchun mobil ishlab chiqishda fayl tizimini tushunish juda muhimdir.
UIDocument iCloud hujjatlari bilan ishlash uchun mavhum sinfdir. U o'zgarishlarni avtomatik saqlaydi, ma'lumotlarni o'qiydi va vakilni yangilanishlar haqida xabardor qiladi. Yozish mojarosi yuz berganda, NSFileVersion mavjud versiyalar ro'yxatini taqdim etadi — ishlab chiquvchi eng oxirgi versiyani tanlashi yoki foydalanuvchiga mojaro hal qilish variantlarini ko'rsatishi mumkin. iCloud Drive uchun loyihaning Capabilities qismida Ubiquity Container ni sozlash majburiydir. NSFileCoordinator va NSFilePresenter bir vaqtning o'zida bir nechta thread yoki qurilmalardan kirishda ma'lumot poygalarining oldini oladi.
iOS avtomatik ravishda Documents katalogini iCloud Backup tarkibiga kiritadi. Android Auto Backup for Apps bilan ishlaydi — tizim getFilesDir(), SharedPreferences va SQLite ma'lumotlar bazalaridagi ma'lumotlarni Google Drive da saqlaydi. Kesh va tashqi fayllar zaxira nusxaga kiritilmaydi. Ikkala platforma istisnolarni sozlashga imkon beradi: iOS-da NSURLIsExcludedFromBackupKey orqali, Android-da XML zaxira nusxa qoidalari konfiguratsiyasi orqali. Shaxsiy ma'lumotlarga ega fayllarni shifrlash majburiydir — iOS-da NSDataWritingFileProtectionComplete dan foydalaning, Android-da security-crypto kutubxonasidan EncryptedFile dan foydalaning.
| Parametr | iOS | Android |
|---|---|---|
| Standart zaxira nusxa | Documents va Library | getFilesDir(), SharedPreferences, MB |
| Fayl istisnosi | isExcludedFromBackupKey | XML zaxira nusxa qoidalari (fullBackupContent) |
| Shifrlash | NSDataWritingFileProtectionComplete | EncryptedFile (security-crypto) |
| Bulut sinxronizatsiyasi | UIDocument + iCloud | Google Drive API + SAF |
| Avtomatik tiklash | O'rnatishdan keyin iCloud Restore | Qayta o'rnatishda Auto Backup |
Tez-tez beriladigan savollar
Sandbox iOS-da har bir ilova uchun izolyatsiyalangan muhitdir. Ilova UIDocumentPickerViewController kabi tizim tanlovchilaridan foydalanmasdan boshqa ilovalarning fayllariga kira olmaydi.
Scoped Storage Android 10+ da fayl tizimiga cheklangan kirish modelidir. Ilova to'g'ridan-to'g'ri faqat o'z fayllarini o'qiydi, media uchun MediaStore API va hujjatlar uchun Storage Access Framework dan foydalanadi.
UIDocumentPickerViewController — Files App yoki iCloud Drive dan hujjatlarni tanlash uchun tizim tanlovchisidan foydalaning. Tanlashdan so'ng vaqtinchalik kirish bilan xavfsizlik doirali URL olasiz.
Media fayllar uchun MIME turini ko'rsatib, ContentResolver orqali MediaStore API dan foydalaning. Ixtiyoriy hujjatlar uchun Intent ACTION_OPEN_DOCUMENT bilan Storage Access Framework dan foydalaning.
FileProvider FLAG_GRANT_READ_URI_PERMISSION bilan vaqtinchalik content:// Uri orqali ilovalar o'rtasida fayllarni xavfsiz almashish uchun ContentProvider ning pastki sinfidir.
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.