Ilovaning hujjatlar katalogi foydalanuvchi fayllarining doimiy saqlash joyi bo'lib, ular seanslar orasida saqlanishi va zaxira nusxadan tiklanishi kerak. Apple File System Programming Guide, 2026 ma'lumotlariga ko'ra, iOS da Documents katalogi kesh va vaqtinchalik kataloglardan farqli o'laroq avtomatik ravishda iCloud zaxira nusxasiga kiritiladi. Hujjatlar katalogidan to'g'ri foydalanish foydalanuvchi fayllari ilova yangilanishi yoki qayta o'rnatilishi vaqtida yo'qolmasligini kafolatlaydi.
Asosiy ma'lumotlar
context.filesDir hisoblanadiHujjatlar katalogi — ilova sandboxidagi foydalanuvchi fayllarini doimiy saqlash uchun mo'ljallangan maxsus joy. Keshmadan farqli o'laroq, bu katalogdagi fayllar foydalanuvchi uchun muhim hisoblanadi: joy yetishmasa tizim tomonidan o'chirilmaydi, ilova yangilanishida saqlanadi va qurilma sinxronizatsiyasida zaxira nusxasi olinadi. iOS da Documents katalogi Sandbox konteynerining bir qismidir va avtomatik ravishda iCloud zaxira nusxasiga kiritiladi. Android da to'g'ridan-to'g'ri analogi yo'q — ekvivalenti doimiy fayllar uchun mo'ljallangan context.filesDir hisoblanadi, lekin o'rnatilgan zaxiralash mexanizmiga ega emas.
Hujjatlar katalogi bilan Android dagi ichki xotira (Internal Storage) o'rtasidagi farq minimal: ikkalasi ham ilova sandboxida joylashgan, ikkalasi ham o'chirilganda yo'qoladi, ikkalasi ham boshqa ilovalar uchun mavjud emas. Asosiy farq semantik: Documents Directory fayllar foydalanuvchi tomonidan yaratilgan yoki import qilingan deb hisoblaydi, Internal Storage esa ilovaning ichki fayllarini (ma'lumotlar bazalari, konfiguratsiyalar) o'z ichiga olishi mumkin. iOS da farq muhimroq: Documents avtomatik zaxiralanadi, Library/Application Support esa — yo'q. Bu saqlash strategiyasiga ta'sir qiladi: Documents ga faqat foydalanuvchi yangi qurilmada tiklamoqchi bo'lgan narsalarni joylashtiring, Application Support ga esa ilova qayta yarata oladigan ichki ma'lumotlarni.
Sandbox arxitekturasi boshqa ilovalar sizning ilovangizning hujjatlar katalogiga kira olmasligini kafolatlaydi. iOS da boshqa ilovalarning Documents ga kirishi jailbreaksiz mumkin emas. Android da root kirish istalgan ilovaning filesDir ni o'qishga imkon beradi, shuning uchun maxfiy ma'lumotlar (tokenlar, shifrlash kalitlari) AndroidX Security kutubxonasidan EncryptedSharedPreferences yoki EncryptedFile bilan qo'shimcha himoyalanishi kerak.
Hujjatlar katalogida foydalanuvchi uchun qimmatli bo'lgan va ilova qayta ishga tushirilgandan yoki qurilma tiklanganidan keyin mavjud bo'lishi kerak bo'lgan ma'lumotlar joylashtirilishi kerak. Barcha fayllar bu katalogda saqlash uchun mos emas — tanlov ma'lumot turiga va foydalanish stsenariysiga bog'liq.
Foydalanuvchi fayllari — hujjatlar katalogining asosiy mazmuni. Bular muharrirda yaratilgan matnli hujjatlar, ilova kamerasi bilan olingan tasvirlar, eksport qilingan PDF hisobotlar, audio yozuvlar, eslatmalar bo'lishi mumkin. Har bir bunday fayl foydalanuvchi tomonidan yoki uning iltimosiga binoan yaratilgan va istalgan vaqtda mavjud bo'lishi kerak. iOS da Documents dagi fayllar tizimning Files ilovasida ko'rsatiladi, bu foydalanuvchiga standart fayl menejeri orqali ularni boshqarish imkonini beradi. Android da bunday ko'rinish yo'q — ilova o'zi saqlangan fayllarni ko'rish uchun interfeysni ta'minlashi kerak.
SQLite ma'lumotlar bazalari va sozlamalar fayllari odatda hujjatlar katalogi yonida, lekin uning ichida emas saqlanadi. iOS da ma'lumotlar bazalari Library/Application Support da joylashtiriladi, chunki ular Files ilovasida ko'rsatilmasligi va alohida zaxiralanmasligi kerak. Android da ma'lumotlar bazalari standart holda Room yoki SQLiteOpenHelper orqali /data/data/<package>/databases/ da yaratiladi. Agar ma'lumotlar bazasi foydalanuvchi mazmunini (eslatmalar, kundalik, moliyaviy yozuvlar) o'z ichiga olsa, tizim orqali zaxiralashni ta'minlash uchun uni filesDir ga joylashtirish mumkin. Room RoomDatabase.Builder callback orqali ma'lumotlar bazasini saqlash uchun maxsus katalog belgilashga imkon beradi.
val dbFile = File(context.filesDir, "user_database.db")
val db = Room.databaseBuilder<AppDatabase>(
context,
dbFile.absolutePath
).build()
Foydalanuvchi boshqa ilovalardan import qilgan yoki ilovangizdan eksport qilgan fayllar ham hujjatlar katalogida saqlanishi kerak. iOS da UIDocumentPickerViewController orqali import asCopy: true parametridan foydalanilganda avtomatik ravishda fayl nusxasini Documents ga joylashtiradi. Android da SAF dialogi orqali import ham ilova sandboxida fayl nusxasini yaratadi. Ma'lumotlarni eksport qilishda (masalan, kontaktlar bilan CSV fayl yaratish) faylni avval Documents/filesDir da saqlang, so'ngra foydalanuvchiga Share Sheet orqali uni ulashishni taklif qiling. Bu foydalanuvchi jo'natishdan keyin faylni saqlashni unutgan taqdirda ham, nusxaning keyingi foydalanish uchun ilovada qolishini kafolatlaydi.
Android da hujjatlar katalogi funktsiyalarini context.filesDir bajaradi. Qo'shimcha ravishda SD kartada context.externalFilesDir katalogi mavjud, ammo u ma'lumotlarning saqlanishini kafolatlamaydi. Ushbu kataloglar bilan ishlashning asosiy usullarini ko'rib chiqamiz.
filesDir — Android da ilovaning doimiy fayllari uchun asosiy katalog. U ilova sandboxida joylashgan va o'chirilganda butunlay yo'qoladi. File namunasini olish uchun /data/data/<package>/files/ katalogiga yo'lni qaytaradigan context.filesDir dan foydalaning. Fayllarni yaratish va o'qish uchun Java/Kotlin dagi standart File operatsiyalaridan yoki fayl nomini qabul qiladigan va FileInputStream/FileOutputStream qaytaradigan Context metodlari openFileInput() va openFileOutput() dan foydalaning. openFileOutput() metodi fayl hali mavjud bo'lmasa, uni avtomatik ravishda filesDir da yaratadi va kirish rejimini belgilashga imkon beradi: MODE_PRIVATE (faqat joriy ilova), MODE_APPEND (qo'shish) yoki MODE_WORLD_READABLE (eskirgan, API 24+ dan foydalanilmaydi).
val fileName = "report.pdf"
val content = "PDF content".toByteArray()
context.openFileOutput(fileName, Context.MODE_PRIVATE).use { stream ->
stream.write(content)
}
val bytes = context.openFileInput(fileName).use { stream ->
stream.readBytes()
}
Android 10+ da Scoped Storage modeli filesDir ga ta'sir qilmaydi — ilovaning o'z sandboxiga kirish to'liq qoladi. filesDir ichidagi barcha o'qish va yozish operatsiyalari qo'shimcha ruxsatlarni talab qilmaydi. Biroq, filesDir orqali boshqa ilovaning fayllariga kirishga urinishda istisno olasiz. Fayl almashish uchun faylni boshqa ilovaga uzatish uchun vaqtinchalik content URI yaratadigan FileProvider dan foydalaning. FileProvider AndroidManifest.xml da <provider> tegi orqali e'lon qilinadi va yo'llar XML faylida konfiguratsiya qilinadi. Bu ilovalar o'rtasida fayl uzatish uchun standart mexanizm bo'lib, masalan, ACTION_SEND bilan Intent orqali rasm jo'natishda foydalaniladi.
iOS da Documents Directory maxsus statusga ega ilova Sandbox konteynerining bir qismidir. Bu katalogdagi fayllar avtomatik ravishda iCloud zaxira nusxasiga kiritiladi, Files ilovasida ko'rsatiladi va App Store orqali ilova yangilanishida saqlanadi.
Avtomatik zaxiralash Documents — iOS ning asosiy afzalligi. Foydalanuvchi qurilmani iTunes ga ulaganda yoki iCloud Backup ni yoqqanda, Documents/ dagi barcha fayllar zaxira nusxaga ko'chiriladi. Yangi qurilmada tiklashda foydalanuvchi barcha fayllarini qo'shimcha harakatlarsiz oladi. Biroq, bu afzallik kamchilikka aylanadi agar ilova Documents da katta hajmdagi ma'lumotlarni saqlasa: zaxiralash vaqti oshadi va iCloud xotirasi tez tugashi mumkin. Shuning uchun Documents da faqat foydalanuvchiga tiklash vaqtida haqiqatan kerak bo'lgan fayllarni saqlash kerak. Vaqtinchalik fayllar, kesh va qayta yaratiladigan ma'lumotlar Caches yoki Library/Application Support da bo'lishi kerak. Apple isExcludedFromBackup atributi orqali internetdan qayta yuklab olinadigan fayllarni zaxira nusxadan chiqarishni tavsiya qiladi.
let fm = FileManager.default
let docsURL = fm.urls(
for: .documentDirectory,
in: .userDomainMask
).first!
let fileURL = docsURL.appendingPathComponent("notes.txt")
let text = "Eslatma mazmuni"
try text.write(to: fileURL, atomically: true, encoding: .utf8)
iCloud Drive bir foydalanuvchining qurilmalari o'rtasida Documents dagi fayllarni sinxronlashtirish imkonini beradi. Sinxronizatsiyani yoqish uchun ilova versiyalash va konfliktlarni hal qilishni avtomatik boshqaradigan NSDocument yoki UIDocument API laridan foydalanishi kerak. Muqobil yondashuv — sinxronizatsiya ustida moslashuvchan nazoratni ta'minlaydigan, lekin CloudKit Dashboard da konfiguratsiyani talab qiladigan CloudKit bilan iCloud dan foydalanish. iCloud Drive dan foydalanganda tahrirlash konfliktlarini (merge yoki last-write-wins) to'g'ri boshqarayotganingizga va ilova interfeysi orqali foydalanuvchini sinxronizatsiya holati haqida xabardor qilayotganingizga ishonch hosil qiling. iCloud bir zumda sinxronizatsiyani kafolatlamaydi — kechikish fayl hajmi va ulanish sifatiga qarab bir necha soniyadan bir necha daqiqagacha bo'lishi mumkin. Kritik muhim ma'lumotlar uchun tranzaksiya yozuvi va versiyalashdan foydalaning, shunda konfliktda faylning oldingi versiyasini tiklash mumkin bo'lsin.
To'g'ri tanlov Documents Directory va Cache Directory o'rtasida foydalanuvchi ma'lumotlarini saqlash ishonchliligini belgilaydi. Tanlovdagi xato yoki ma'lumot yo'qolishiga (muhim fayllar keshda saqlansa) yoki zaxira nusxaning to'lib ketishiga (vaqtinchalik fayllar Documents da saqlansa) olib keladi.
| Mezon | Documents Directory | Cache Directory |
|---|---|---|
| Saqlanish kafolati | Yuqori — tizim tomonidan o'chirilmaydi | Past — tozalanishi mumkin |
| Zaxira nusxa (iOS) | Avtomatik iCloud da | Zaxiralanmaydi |
| Foydalanuvchiga ko'rinish (iOS) | Files ilovasida | Yashirin |
| Yangilanishda tozalash | Tozalanmaydi | Tozalanishi mumkin |
| Tavsiya etilgan hajm | Istagan, lekin sozlamalar orqali nazorat bilan | 100–200 MB gacha |
| Ma'lumot turi | Foydalanuvchi fayllari | Vaqtinchalik qayta yaratiladigan ma'lumotlar |
Eng yaxshi amaliyotlar hujjatlar katalogidan foydalanish bir necha asosiy qoidalarni o'z ichiga oladi. Birinchidan, bu katalogdan fayllarni o'chirishdan oldin har doim foydalanuvchidan tasdiq so'rang. Keshmadan farqli o'laroq, hujjatni o'chirish foydalanuvchi mazmunining qaytarib bo'lmaydigan yo'qolishiga olib kelishi mumkin. Ikkinchidan, fayl versiyalashni joriy qiling: mavjud faylni qayta yozishda oldingi versiyani _backup qo'shimchasi bilan saqlang yoki Snapshot mexanizmlaridan foydalaning. Uchinchidan, foydalanuvchiga hujjatlar katalogidan fayllarni ko'rish, nomini o'zgartirish, o'chirish va eksport qilish uchun interfeysni taqdim eting. iOS da Documents dagi fayllar avtomatik ravishda Files da ko'rsatiladi, Android da o'z fayl menejerini joriy qilish yoki uchinchi tomon kutubxonalaridan foydalanish kerak.
Ilova yangilanishida ma'lumotlar migratsiyasiga alohida e'tibor bering. Agar yangi versiya fayl saqlash strukturasini o'zgartirsa (masalan, ma'lumotlarni bir pastki katalogdan boshqasiga ko'chiradi yoki fayl formatini o'zgartiradi), yangilanishdan keyin birinchi ishga tushirishda bir martalik migratsiyani joriy qiling. Ma'lumotlar sxemasi versiya raqamini SharedPreferences da saqlang va nomuvofiqlikda migratsiyani ishga tushiring. Migratsiya tugagunga qadar eski fayllarni o'chirmang — nosozlikda foydalanuvchi ma'lumotlarni yo'qotmasligi kerak. Agar migratsiya format konvertatsiyasini o'z ichiga olsa (masalan, JSON dan SQLite ga o'tish), asl fayllarni migratsiya sanasi bilan alohida katalogda zaxira nusxa sifatida saqlang. Foydalanuvchi Apple Human Interface Guidelines tavsiyasiga ko'ra, yangilanishdan keyin birinchi 30 kun ichida ilova sozlamalari orqali o'zgarishlarni qaytarish imkoniyatiga ega bo'lishi kerak.
Tez-tez beriladigan savollar
Documents Files ilovasida ko'rsatiladi va avtomatik ravishda iCloud da zaxiralanadi. Application Support Files da ko'rsatilmaydi va standart holda zaxiralanmaydi. Foydalanuvchiga ko'rsatilishi shart bo'lmagan ilovaning ichki ma'lumotlari uchun Application Support ni tanlang.
Ha, hisob o'chirilganda foydalanuvchiga ushbu hisob bilan bog'liq barcha mahalliy fayllarni tozalashni taklif qiling. „Barcha mahalliy ma'lumotlarni o'chirish kerakmi?“ degan savol bilan dialog oynasini ko'rsating va qaysi fayllar ta'sir qilishini sanab o'ting. Bu GDPR talabi va App Store va Google Play siyosatlariga muvofiqlikdir.
iOS da qurilmani iCloud yoki iTunes zaxira nusxasidan tiklash kifoya — Documents dagi fayllar avtomatik tiklanadi. Android da filesDir dagi fayllarni zaxiralash uchun Google Drive Backup API dan foydalaning yoki bulut xizmati orqali eksportni joriy qiling.
iOS da foydalanuvchi Files ilovasi orqali fayllarni o'chirishi mumkin. Android da o'chirish faqat ilovangiz interfeysi orqali mumkin. Tasodifiy ma'lumot yo'qolishining oldini olish uchun hujjatlar uchun 30 kunlik saqlash muddati bilan axlat qutisini joriy qilish tavsiya etiladi.
Hech qanday qo'shimcha harakat talab etilmaydi — iOS va Android App Store yoki Google Play orqali yangilashda hujjatlar katalogini avtomatik saqlaydi. Biroq, saqlash strukturasi o'zgargan taqdirda, sozlamalarda sxema versiya raqamini tekshirib, yangi versiyaning birinchi ishga tushirilishida ma'lumotlar migratsiyasini joriy qiling.
Xulosa
context.filesDir dan analog sifatida foydalanadi — fayllar yangilanishda saqlanadi, lekin o'rnatilgan zaxiralash mexanizmiga ega emasBiz 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.