Рад са фајл системом је основа сваке мобилне апликације. Свака платформа нуди свој модел приступа: Sandbox на iOS изолује апликације у засебним контејнерима, док Scoped Storage на Android-у ограничава директан приступ заједничкој меморији. Према Google Developer Documentation (2026), увођење Scoped Storage са Android 10 захтевало је потпуно преиспитивање архитектуре складиштења података. У овом водичу ћемо обрадити FileManager, MediaStore API, Storage Access Framework и DocumentProvider за обе платформе.
Кључне тачке
Фајл систем у мобилним апликацијама је скуп API-ја, сигурносних правила и ограничења који дефинишу складиштење и приступ подацима на iOS и Android уређајима. За разлику од десктоп оперативних система, мобилне платформе изолују сваку апликацију како би заштитиле податке корисника од неовлашћеног читања од стране других програма.
iOS користи Sandbox модел, где свака апликација постоји у свом контејнеру са строго ограниченим дозволама. Пре верзије 10, Android је пружао потпун приступ спољашњем складишту, али са увођењем Scoped Storage приступ се приближио iOS-у. Кључна разлика је да iOS потпуно изолује фајл систем, док Android нуди неколико нивоа приступа: приватни директоријум, јавни MediaStore и привремени приступ путем SAF.
Мобилне апликације користе три типа складиштења података. Приватно складиште — директоријум доступан само апликацији за интерне фајлове и кеш. Заједничко складиште — медијски фајлови путем MediaStore (Android) или Files App (iOS). Облачно складиште — iCloud Drive и Google Drive за синхронизацију између уређаја. Сваки тип има своја ограничења у погледу величине, животног века фајлова и услова приступа.
| Тип складиштења | iOS | Android |
|---|---|---|
| Приватно | Documents, Library, Caches | getFilesDir(), getCacheDir() |
| Заједнички медији | PHPhotoLibrary преко бирача | MediaStore API (ContentResolver) |
| Заједнички документи | Files App преко UIDocumentPicker | Storage Access Framework (SAF) |
| Облак | iCloud Drive (UIDocument) | Google Drive API |
| Кеш | Директоријум Caches, чисти га систем | getCacheDir(), getExternalCacheDir() |
Sandbox је iOS сигурносна архитектура која изолује сваку апликацију. Апликација може читати и писати само унутар свог пешчаника. За приступ контактима, фотографијама или фајловима других апликација морају се користити системски бирачи: UIImagePickerController или UIDocumentPickerViewController. Приступ Files App се подешава преко заставице UIFileSharingEnabled у Info.plist. Фајл систем у мобилном развоју на iOS захтева разумевање структуре директоријума и правилан одабир места за сваки тип података.
iOS пешчаник се састоји од неколико стандардних директоријума. Documents — за корисничке фајлове, укључен у iCloud Backup. Caches — за привремене податке које систем може обрисати када је складиште пуно. Temporary — за фајлове текуће сесије, брише се при поновном покретању. Application Support — за интерне податке апликације скривене од корисника. Избор погрешног директоријума доводи до проблема: чување кеша у Documents расипа iCloud простор и крши Apple-ове смернице за фајл систем.
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 пружа комплетан скуп метода за управљање фајловима на iOS. FileManager.default је thread-safe синглтон погодан за већину операција. Методе попут fileExists(atPath:), createDirectory(at:withIntermediateDirectories:attributes:), copyItem(at:to:) и removeItem(at:) покривају основне сценарије. Операције са фајловима већим од 1 MB треба извршавати у позадинској нити путем DispatchQueue.global(). За стримовање великих количина користите FileHandle уместо учитавања целог фајла у меморију.
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, Google је увео Scoped Storage — модел ограниченог приступа фајл систему. Апликација може слободно читати и писати само у својим приватним директоријумима. За медијске фајлове (фотографије, видео, аудио) користи се MediaStore API путем ContentResolver. За произвољне документе користи се Storage Access Framework путем Intent ACTION_OPEN_DOCUMENT. На Android 11+, директан приступ корену спољашњег складишта је потпуно забрањен и сви програмери морају користити нове API-је.
MediaStore је системски ContentProvider за приступ медијским фајловима на уређају. Путем ContentResolver, апликација захтева Uri фајлова уместо директних путања. MediaStore.Files — за све типове фајлова, Images — за слике, Video — за видео, Audio — за аудио снимке. Писање у заједничке директоријуме врши се путем insert() са DISPLAY_NAME, MIME_TYPE и RELATIVE_PATH. Након уметања, апликација добија Uri преко којег се уписују бајтови. MIME типови играју кључну улогу — погрешан тип ће изазвати грешку при отварању фајла.
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 пружа јединствени интерфејс за избор и креирање фајлова без дозвола за извршавање. Intent ACTION_OPEN_DOCUMENT отвара системски менаџер фајлова на Android-у. Након избора, апликација добија content:// Uri са привременим приступом путем FLAG_GRANT_READ_URI_PERMISSION. ACTION_CREATE_DOCUMENT омогућава чување фајлова на било којој локацији спољашњег складишта коју корисник изабере. SAF ради на Android 5+ и пружа приступ фајловима облачних провајдера повезаних путем DocumentsProvider.
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 отвара Files App и омогућава избор једног или више докумената. Режими: увоз (копирање у пешчаник) и отварање (приступ путем URL-а са сигурносним опсегом). За филтрирање фајлова прослеђује се низ UTType типова — на пример, .pdf и .plainText. Након добијања URL-а, апликација мора позвати startAccessingSecurityScopedResource() пре читања и stopAccessingSecurityScopedResource() након завршетка. Непозивање stopAccessing доводи до цурења системских ресурса. Документи у мобилним апликацијама на iOS захтевају обавезно ослобађање привремених дозвола након завршетка рада са фајлом.
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 је подкласа ContentProvider за безбедно дељење фајлова између апликација. Генерише привремене content:// Uri-јеве засноване на фајловима из наведених XML директоријума. Друге апликације добијају приступ путем Intent-а са FLAG_GRANT_READ_URI_PERMISSION. DocumentProvider, за разлику од FileProvider, објављује фајлове у SAF и омогућава другим апликацијама да прегледају садржај ваше апликације као део фајл система. За имплементацију DocumentsProvider потребно је прегазити queryRoots(), queryChildDocuments() и openDocument(), затим га регистровати у AndroidManifest.xml
Синхронизација у облаку омогућава корисницима приступ документима на свим њиховим уређајима. Фајл систем у мобилним апликацијама је допуњен облачним слојем: UIDocument на iOS аутоматски прати промене и синхронизује их путем iCloud. На Android-у, слична функционалност се гради путем Google Drive API или DocumentsProvider са облачним коренима. Разумевање фајл система у мобилном развоју је критично за изградњу поуздане синхронизације између уређаја.
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.
| Параметар | iOS | Android |
|---|---|---|
| Подразумевани бацкуп | Documents и Library | getFilesDir(), SharedPreferences, БП |
| Изузетак фајлова | isExcludedFromBackupKey | XML правила бацкупа (fullBackupContent) |
| Шифровање | NSDataWritingFileProtectionComplete | EncryptedFile (security-crypto) |
| Синхронизација у облаку | UIDocument + iCloud | Google Drive API + SAF |
| Аутоматско враћање | iCloud Restore након инсталације | Auto Backup при поновној инсталацији |
Често постављана питања
Sandbox је изоловано окружење за сваку апликацију на iOS. Апликација не може приступити фајловима других апликација без коришћења системских бирача попут UIDocumentPickerViewController.
Scoped Storage је модел ограниченог приступа фајл систему на Android 10+. Апликација директно чита само своје фајлове, користи MediaStore API за медије и Storage Access Framework за документе.
Користите UIDocumentPickerViewController — системски бирач за избор докумената из Files App или iCloud Drive. Након избора добијате URL са сигурносним опсегом и привременим приступом.
За медијске фајлове користите MediaStore API путем ContentResolver са наведеним MIME типом. За произвољне документе користите Storage Access Framework са Intent ACTION_OPEN_DOCUMENT.
FileProvider је подкласа ContentProvider за безбедно дељење фајлова између апликација путем привременог content:// Uri са FLAG_GRANT_READ_URI_PERMISSION.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.