Фајл систем и документи у мобилном развоју: шта је то, који принципи и како ради

Аутор: IT Sectr Објављено: 2026-07-19 Време читања: 12 мин

Рад са фајл системом је основа сваке мобилне апликације. Свака платформа нуди свој модел приступа: Sandbox на iOS изолује апликације у засебним контејнерима, док Scoped Storage на Android-у ограничава директан приступ заједничкој меморији. Према Google Developer Documentation (2026), увођење Scoped Storage са Android 10 захтевало је потпуно преиспитивање архитектуре складиштења података. У овом водичу ћемо обрадити FileManager, MediaStore API, Storage Access Framework и DocumentProvider за обе платформе.

Кључне тачке

  • Sandbox — изоловано iOS окружење где свака апликација ради само у свом директоријуму без приступа подацима других апликација.
  • Scoped Storage — модел Android 10+ који ограничава директан приступ спољашњем складишту путем MediaStore API и SAF.
  • FileManager — главна iOS класа за операције са фајловима: креирање, читање, копирање, премештање и брисање.
  • Storage Access Framework — системски механизам Android-а за избор докумената коришћењем Intent ACTION_OPEN_DOCUMENT.
  • DocumentProvider — Android компонента за објављивање фајлова апликације у заједничком фајл систему путем SAF.

Шта је фајл систем у мобилним апликацијама?

Фајл систем у мобилним апликацијама је скуп API-ја, сигурносних правила и ограничења који дефинишу складиштење и приступ подацима на iOS и Android уређајима. За разлику од десктоп оперативних система, мобилне платформе изолују сваку апликацију како би заштитиле податке корисника од неовлашћеног читања од стране других програма.

Архитектонске разлике између iOS и Android

iOS користи Sandbox модел, где свака апликација постоји у свом контејнеру са строго ограниченим дозволама. Пре верзије 10, Android је пружао потпун приступ спољашњем складишту, али са увођењем Scoped Storage приступ се приближио iOS-у. Кључна разлика је да iOS потпуно изолује фајл систем, док Android нуди неколико нивоа приступа: приватни директоријум, јавни MediaStore и привремени приступ путем SAF.

Главни типови складиштења

Мобилне апликације користе три типа складиштења података. Приватно складиште — директоријум доступан само апликацији за интерне фајлове и кеш. Заједничко складиште — медијски фајлови путем MediaStore (Android) или Files App (iOS). Облачно складиште — iCloud Drive и Google Drive за синхронизацију између уређаја. Сваки тип има своја ограничења у погледу величине, животног века фајлова и услова приступа.

Тип складиштењаiOSAndroid
ПриватноDocuments, Library, CachesgetFilesDir(), getCacheDir()
Заједнички медијиPHPhotoLibrary преко бирачаMediaStore API (ContentResolver)
Заједнички документиFiles App преко UIDocumentPickerStorage Access Framework (SAF)
ОблакiCloud Drive (UIDocument)Google Drive API
КешДиректоријум Caches, чисти га системgetCacheDir(), getExternalCacheDir()

Фајл систем у мобилном развоју: Sandbox на iOS

Sandbox је iOS сигурносна архитектура која изолује сваку апликацију. Апликација може читати и писати само унутар свог пешчаника. За приступ контактима, фотографијама или фајловима других апликација морају се користити системски бирачи: UIImagePickerController или UIDocumentPickerViewController. Приступ Files App се подешава преко заставице UIFileSharingEnabled у Info.plist. Фајл систем у мобилном развоју на iOS захтева разумевање структуре директоријума и правилан одабир места за сваки тип података.

Структура директоријума пешчаника

iOS пешчаник се састоји од неколико стандардних директоријума. Documents — за корисничке фајлове, укључен у iCloud Backup. Caches — за привремене податке које систем може обрисати када је складиште пуно. Temporary — за фајлове текуће сесије, брише се при поновном покретању. Application Support — за интерне податке апликације скривене од корисника. Избор погрешног директоријума доводи до проблема: чување кеша у Documents расипа iCloud простор и крши Apple-ове смернице за фајл систем.

swift
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 = "Содержимое файла"

// Атомски упис са шифровањем
try text.write(
    to: fileURL,
    atomically: true,
    encoding: .utf8
)

FileManager — главни API за операције са фајловима

Класа FileManager пружа комплетан скуп метода за управљање фајловима на iOS. FileManager.default је thread-safe синглтон погодан за већину операција. Методе попут fileExists(atPath:), createDirectory(at:withIntermediateDirectories:attributes:), copyItem(at:to:) и removeItem(at:) покривају основне сценарије. Операције са фајловима већим од 1 MB треба извршавати у позадинској нити путем DispatchQueue.global(). За стримовање великих количина користите FileHandle уместо учитавања целог фајла у меморију.

swift
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)
}

Фајл систем у мобилним апликацијама: Scoped Storage на Android-у

Са издавањем Android 10, Google је увео Scoped Storage — модел ограниченог приступа фајл систему. Апликација може слободно читати и писати само у својим приватним директоријумима. За медијске фајлове (фотографије, видео, аудио) користи се MediaStore API путем ContentResolver. За произвољне документе користи се Storage Access Framework путем Intent ACTION_OPEN_DOCUMENT. На Android 11+, директан приступ корену спољашњег складишта је потпуно забрањен и сви програмери морају користити нове API-је.

MediaStore API за рад са медијским фајловима

MediaStore је системски ContentProvider за приступ медијским фајловима на уређају. Путем ContentResolver, апликација захтева Uri фајлова уместо директних путања. MediaStore.Files — за све типове фајлова, Images — за слике, Video — за видео, Audio — за аудио снимке. Писање у заједничке директоријуме врши се путем insert() са DISPLAY_NAME, MIME_TYPE и RELATIVE_PATH. Након уметања, апликација добија Uri преко којег се уписују бајтови. MIME типови играју кључну улогу — погрешан тип ће изазвати грешку при отварању фајла.

kotlin
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)
    }
}

Storage Access Framework за избор фајлова

SAF пружа јединствени интерфејс за избор и креирање фајлова без дозвола за извршавање. Intent ACTION_OPEN_DOCUMENT отвара системски менаџер фајлова на Android-у. Након избора, апликација добија content:// Uri са привременим приступом путем FLAG_GRANT_READ_URI_PERMISSION. ACTION_CREATE_DOCUMENT омогућава чување фајлова на било којој локацији спољашњег складишта коју корисник изабере. SAF ради на Android 5+ и пружа приступ фајловима облачних провајдера повезаних путем DocumentsProvider.

kotlin
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)

Избор докумената у мобилним апликацијама: системски бирачи

Обе платформе пружају уграђене механизме за избор фајлова од стране корисника. Документи у мобилним апликацијама се преносе путем системских бирача који дају привремени приступ фајлу без трајних дозвола. На iOS-у је то UIDocumentPickerViewController, на Android-у ACTION_OPEN_DOCUMENT. Документи у мобилним апликацијама могу се бирати из локалног складишта и облачних услуга. Корисник експлицитно наводи фајл, а апликација добија Uri или URL са ограниченим роком важења.

UIDocumentPickerViewController на iOS

UIDocumentPickerViewController отвара Files App и омогућава избор једног или више докумената. Режими: увоз (копирање у пешчаник) и отварање (приступ путем URL-а са сигурносним опсегом). За филтрирање фајлова прослеђује се низ UTType типова — на пример, .pdf и .plainText. Након добијања URL-а, апликација мора позвати startAccessingSecurityScopedResource() пре читања и stopAccessingSecurityScopedResource() након завршетка. Непозивање stopAccessing доводи до цурења системских ресурса. Документи у мобилним апликацијама на iOS захтевају обавезно ослобађање привремених дозвола након завршетка рада са фајлом.

swift
let picker = UIDocumentPickerViewController(
    forOpeningContentTypes: [.pdf, .plainText]
)
picker.allowsMultipleSelection = true
picker.delegate = self
present(picker, animated: true)

// Ослобађање приступа у делегату
func documentPicker(
    _ controller: UIDocumentPickerViewController,
    didPickDocumentsAt urls: [URL]
) {
    guard let url = urls.first else { return }
    url.startAccessingSecurityScopedResource()
    defer { url.stopAccessingSecurityScopedResource() }
}

FileProvider и DocumentProvider на Android-у

FileProvider је подкласа ContentProvider за безбедно дељење фајлова између апликација. Генерише привремене content:// Uri-јеве засноване на фајловима из наведених XML директоријума. Друге апликације добијају приступ путем Intent-а са FLAG_GRANT_READ_URI_PERMISSION. DocumentProvider, за разлику од FileProvider, објављује фајлове у SAF и омогућава другим апликацијама да прегледају садржај ваше апликације као део фајл система. За имплементацију DocumentsProvider потребно је прегазити queryRoots(), queryChildDocuments() и openDocument(), затим га регистровати у AndroidManifest.xml

iCloud Drive и синхронизација фајлова у облаку

Синхронизација у облаку омогућава корисницима приступ документима на свим њиховим уређајима. Фајл систем у мобилним апликацијама је допуњен облачним слојем: UIDocument на iOS аутоматски прати промене и синхронизује их путем iCloud. На Android-у, слична функционалност се гради путем Google Drive API или DocumentsProvider са облачним коренима. Разумевање фајл система у мобилном развоју је критично за изградњу поуздане синхронизације између уређаја.

UIDocument — синхронизација на iOS

UIDocument је апстрактна класа за рад са iCloud документима. Аутоматски чува промене, чита податке и обавештава делегата о ажурирањима. У случају конфликта при упису, NSFileVersion пружа листу доступних верзија — програмер може изабрати најновију или показати кориснику опције за решавање конфликта. Подешавање Ubiquity Container у Capabilities пројекта је обавезно за iCloud Drive. NSFileCoordinator и NSFilePresenter спречавају трке података при истовременом приступу из више нити или уређаја.

Бацкуп и враћање података

iOS аутоматски укључује Documents директоријум у iCloud Backup. Android ради са Auto Backup for Apps — систем чува податке из getFilesDir(), SharedPreferences и SQLite база података у Google Drive. Кеш и спољашњи фајлови нису укључени у бацкуп. Обе платформе омогућавају подешавање изузетака: на iOS путем NSURLIsExcludedFromBackupKey, на Android путем XML конфигурације правила бацкупа. Шифровање фајлова са личним подацима је обавезно — на iOS користите NSDataWritingFileProtectionComplete, на Android користите EncryptedFile из библиотеке security-crypto.

ПараметарiOSAndroid
Подразумевани бацкупDocuments и LibrarygetFilesDir(), SharedPreferences, БП
Изузетак фајловаisExcludedFromBackupKeyXML правила бацкупа (fullBackupContent)
ШифровањеNSDataWritingFileProtectionCompleteEncryptedFile (security-crypto)
Синхронизација у облакуUIDocument + iCloudGoogle Drive API + SAF
Аутоматско враћањеiCloud Restore након инсталацијеAuto Backup при поновној инсталацији

Често постављана питања

Шта је Sandbox на iOS?

Sandbox је изоловано окружење за сваку апликацију на iOS. Апликација не може приступити фајловима других апликација без коришћења системских бирача попут UIDocumentPickerViewController.

Шта је Scoped Storage на Android-у?

Scoped Storage је модел ограниченог приступа фајл систему на Android 10+. Апликација директно чита само своје фајлове, користи MediaStore API за медије и Storage Access Framework за документе.

Како изабрати фајл на iOS?

Користите UIDocumentPickerViewController — системски бирач за избор докумената из Files App или iCloud Drive. Након избора добијате URL са сигурносним опсегом и привременим приступом.

Како приступити фајловима на Android 11+?

За медијске фајлове користите MediaStore API путем ContentResolver са наведеним MIME типом. За произвољне документе користите Storage Access Framework са Intent ACTION_OPEN_DOCUMENT.

Шта је FileProvider на Android-у?

FileProvider је подкласа ContentProvider за безбедно дељење фајлова између апликација путем привременог content:// Uri са FLAG_GRANT_READ_URI_PERMISSION.

Резиме

  • Sandbox — изоловани фајл систем iOS-а где апликација има приступ само својим директоријумима Documents, Caches и Library.
  • FileManager — главни API за операције са фајловима на iOS. Читајте велике фајлове путем FileHandle у позадинској нити.
  • Scoped Storage — модел фајл система на Android 10+ који замењује директан приступ спољашњем складишту са MediaStore API и SAF.
  • MediaStore API — системски ContentProvider за рад са медијским фајловима на Android. Писање се врши путем insert() са ContentValues.
  • Storage Access Framework — универзални механизам за избор докумената на Android путем ACTION_OPEN_DOCUMENT и ACTION_CREATE_DOCUMENT.
  • UIDocumentPickerViewController — системски бирач iOS-а који отвара Files App и iCloud Drive. Ради са URL-овима са сигурносним опсегом.
  • FileProvider — механизам за безбедно дељење фајлова између Android апликација путем привременог content:// Uri и дозвола за извршавање.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту