Werken met het bestandssysteem is de basis van elke mobiele applicatie. Elk platform biedt zijn eigen toegangsmodel: Sandbox op iOS isoleert applicaties in aparte containers, terwijl Scoped Storage op Android de directe toegang tot gedeelde opslag beperkt. Volgens Google Developer Documentation (2026) vereiste de introductie van Scoped Storage met Android 10 een volledige herziening van de dataopslagarchitectuur. In deze gids behandelen we FileManager, MediaStore API, Storage Access Framework en DocumentProvider voor beide platforms.
Belangrijkste punten
Het bestandssysteem in mobiele applicaties is een set API's, beveiligingsregels en beperkingen die definiëren hoe gegevens worden opgeslagen en benaderd op iOS- en Android-apparaten. In tegenstelling tot desktopbesturingssystemen isoleren mobiele platforms elke applicatie om gebruikersgegevens te beschermen tegen ongeautoriseerd lezen door andere programma's.
iOS gebruikt het Sandbox-model, waarbij elke app in zijn eigen container bestaat met strikt beperkte machtigingen. Vóór versie 10 bood Android volledige toegang tot externe opslag, maar met de introductie van Scoped Storage kwam de benadering dichter bij iOS. Het belangrijkste verschil is dat iOS het bestandssysteem volledig isoleert, terwijl Android meerdere toegangsniveaus biedt: een privédirectory, openbare MediaStore en tijdelijke toegang via SAF.
Mobiele applicaties gebruiken drie soorten gegevensopslag. Privéopslag — een directory die alleen toegankelijk is voor de app voor interne bestanden en cache. Gedeelde opslag — mediabestanden via MediaStore (Android) of Files App (iOS). Cloudopslag — iCloud Drive en Google Drive voor synchronisatie tussen apparaten. Elk type heeft zijn eigen beperkingen qua grootte, bestandslevensduur en toegangsvoorwaarden.
| Opslagtype | iOS | Android |
|---|---|---|
| Privé | Documents, Library, Caches | getFilesDir(), getCacheDir() |
| Gedeelde media | PHPhotoLibrary via kiezer | MediaStore API (ContentResolver) |
| Gedeelde documenten | Files App via UIDocumentPicker | Storage Access Framework (SAF) |
| Cloud | iCloud Drive (UIDocument) | Google Drive API |
| Cache | Caches-directory, gewist door systeem | getCacheDir(), getExternalCacheDir() |
Sandbox is de beveiligingsarchitectuur van iOS die elke applicatie isoleert. Een app kan alleen lezen en schrijven binnen zijn eigen sandbox. Om toegang te krijgen tot contacten, foto's of bestanden van andere apps, moeten systeemkiezers worden gebruikt: UIImagePickerController of UIDocumentPickerViewController. Toegang tot Files App wordt geconfigureerd via de UIFileSharingEnabled-vlag in Info.plist. Het bestandssysteem in mobiele ontwikkeling op iOS vereist inzicht in de directorystructuur en het kiezen van de juiste locatie voor elk gegevenstype.
De iOS-sandbox bestaat uit verschillende standaarddirectories. Documents — voor gebruikersbestanden, opgenomen in iCloud Backup. Caches — voor tijdelijke gegevens die het systeem kan verwijderen bij weinig opslagruimte. Temporary — voor bestanden van de huidige sessie, gewist bij herstart. Application Support — voor interne app-gegevens die verborgen zijn voor de gebruiker. Het verkeerde directory kiezen leidt tot problemen: het opslaan van cache in Documents verspilt iCloud-ruimte en schendt de richtlijnen van Apple voor het bestandssysteem.
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 = "Содержимое файла"
// Atomair schrijven met versleuteling
try text.write(
to: fileURL,
atomically: true,
encoding: .utf8
)
De klasse FileManager biedt een complete set methoden voor het beheren van bestanden op iOS. FileManager.default is een thread-safe singleton die geschikt is voor de meeste bewerkingen. Methoden zoals fileExists(atPath:), createDirectory(at:withIntermediateDirectories:attributes:), copyItem(at:to:) en removeItem(at:) dekken basisscenario's. Bestandsbewerkingen groter dan 1 MB moeten worden uitgevoerd in een achtergrondthread via DispatchQueue.global(). Voor het streamen van grote volumes gebruikt u FileHandle in plaats van het hele bestand in het geheugen te laden.
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)
}
Met de release van Android 10 introduceerde Google Scoped Storage — een model met beperkte toegang tot het bestandssysteem. Een app kan alleen vrij lezen en schrijven in zijn privédirectories. Voor mediabestanden (foto's, video's, audio) wordt de MediaStore API gebruikt via ContentResolver. Voor willekeurige documenten wordt Storage Access Framework gebruikt via Intent ACTION_OPEN_DOCUMENT. Op Android 11+ is directe toegang tot de root van externe opslag volledig verboden en moeten alle ontwikkelaars de nieuwe API's gebruiken.
MediaStore is een systeem-ContentProvider voor toegang tot mediabestanden op het apparaat. Via ContentResolver vraagt de app Uri van bestanden in plaats van directe paden. MediaStore.Files — voor alle bestandstypen, Images — voor afbeeldingen, Video — voor video's, Audio — voor audio-opnamen. Schrijven naar gedeelde directories gebeurt via insert() met DISPLAY_NAME, MIME_TYPE en RELATIVE_PATH. Na het invoegen ontvangt de app een Uri waarnaar bytes worden geschreven. MIME-typen spelen een cruciale rol — een onjuist type veroorzaakt een fout bij het openen van het bestand.
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 biedt een uniforme interface voor het selecteren en maken van bestanden zonder runtime-machtigingen. Intent ACTION_OPEN_DOCUMENT opent de systeembestandsbeheerder op Android. Na selectie ontvangt de app een content:// Uri met tijdelijke toegang via FLAG_GRANT_READ_URI_PERMISSION. ACTION_CREATE_DOCUMENT maakt het mogelijk bestanden op te slaan op elke externe opslaglocatie die de gebruiker kiest. SAF werkt op Android 5+ en biedt toegang tot bestanden van cloudproviders die zijn verbonden via 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)
Beide platforms bieden ingebouwde mechanismen voor gebruikers om bestanden te selecteren. Documenten in mobiele applicaties worden doorgegeven via systeemkiezers die tijdelijke toegang tot een bestand verlenen zonder permanente machtigingen. Op iOS is dit UIDocumentPickerViewController; op Android, ACTION_OPEN_DOCUMENT. Documenten in mobiele applicaties kunnen worden geselecteerd uit zowel lokale opslag als clouddiensten. De gebruiker specificeert expliciet het bestand en de app ontvangt een Uri of URL met een beperkte geldigheidsduur.
UIDocumentPickerViewController opent Files App en maakt het mogelijk een of meer documenten te selecteren. Modi: importeren (kopiëren naar sandbox) en openen (toegang via security-scoped URL). Voor bestandsfiltering wordt een array van UTType-typen doorgegeven — bijvoorbeeld .pdf en .plainText. Na ontvangst van de URL moet de app startAccessingSecurityScopedResource() aanroepen voor het lezen en stopAccessingSecurityScopedResource() na voltooiing. Het niet aanroepen van stopAccessing leidt tot systeembronnenlekken. Documenten in mobiele applicaties op iOS vereisen het verplicht vrijgeven van tijdelijke machtigingen na het voltooien van het werk met het bestand.
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.pdf, .plainText]
)
picker.allowsMultipleSelection = true
picker.delegate = self
present(picker, animated: true)
// Toegang vrijgeven in de gedelegeerde
func documentPicker(
_ controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
}
FileProvider is een subklasse van ContentProvider voor het veilig delen van bestanden tussen apps. Het genereert tijdelijke content:// Uris op basis van bestanden uit opgegeven XML-directories. Andere apps krijgen toegang via Intent met FLAG_GRANT_READ_URI_PERMISSION. DocumentProvider publiceert in tegenstelling tot FileProvider bestanden in SAF en stelt andere apps in staat de inhoud van uw app te bekijken als onderdeel van het bestandssysteem. Om DocumentsProvider te implementeren, moet u queryRoots(), queryChildDocuments() en openDocument() overschrijven en vervolgens registreren in AndroidManifest.xml
Cloudsynchronisatie geeft gebruikers toegang tot documenten op al hun apparaten. Het bestandssysteem in mobiele applicaties wordt versterkt door een cloudlaag: UIDocument op iOS volgt automatisch wijzigingen en synchroniseert ze via iCloud. Op Android wordt vergelijkbare functionaliteit gebouwd via Google Drive API of DocumentsProvider met cloudroots. Inzicht in het bestandssysteem in mobiele ontwikkeling is cruciaal voor het bouwen van betrouwbare synchronisatie tussen apparaten.
UIDocument is een abstracte klasse voor het werken met iCloud-documenten. Het slaat automatisch wijzigingen op, leest gegevens en stelt de gedelegeerde op de hoogte van updates. Bij een schrijfconflict biedt NSFileVersion een lijst met beschikbare versies — de ontwikkelaar kan de nieuwste kiezen of de gebruiker opties voor conflictoplossing tonen. Het configureren van Ubiquity Container in de Capabilities van het project is verplicht voor iCloud Drive. NSFileCoordinator en NSFilePresenter voorkomen dataraces tijdens gelijktijdige toegang vanuit meerdere threads of apparaten.
iOS neemt automatisch de Documents-directory op in iCloud Backup. Android werkt met Auto Backup for Apps — het systeem slaat gegevens van getFilesDir(), SharedPreferences en SQLite-databases op in Google Drive. Cache en externe bestanden worden niet opgenomen in back-ups. Beide platforms maken het mogelijk uitzonderingen te configureren: op iOS via NSURLIsExcludedFromBackupKey, op Android via XML-configuratie van back-upregels. Versleuteling van bestanden met persoonlijke gegevens is verplicht — gebruik op iOS NSDataWritingFileProtectionComplete, gebruik op Android EncryptedFile uit de bibliotheek security-crypto.
| Parameter | iOS | Android |
|---|---|---|
| Standaard back-up | Documents en Library | getFilesDir(), SharedPreferences, DB |
| Bestandsuitzondering | isExcludedFromBackupKey | XML-back-upregels (fullBackupContent) |
| Versleuteling | NSDataWritingFileProtectionComplete | EncryptedFile (security-crypto) |
| Cloudsync | UIDocument + iCloud | Google Drive API + SAF |
| Automatisch herstel | iCloud Restore na installatie | Auto Backup bij herinstallatie |
Veelgestelde vragen
Sandbox is een geïsoleerde omgeving voor elke app op iOS. De app heeft geen toegang tot bestanden van andere apps zonder systeemkiezers zoals UIDocumentPickerViewController.
Scoped Storage is een model met beperkte toegang tot het bestandssysteem op Android 10+. De app leest direct alleen eigen bestanden, gebruikt MediaStore API voor media en Storage Access Framework voor documenten.
Gebruik UIDocumentPickerViewController — de systeemkiezer voor het selecteren van documenten uit Files App of iCloud Drive. Na selectie ontvangt u een security-scoped URL met tijdelijke toegang.
Gebruik voor mediabestanden de MediaStore API via ContentResolver met specificatie van het MIME-type. Gebruik voor willekeurige documenten Storage Access Framework met Intent ACTION_OPEN_DOCUMENT.
FileProvider is een subklasse van ContentProvider voor het veilig delen van bestanden tussen apps via tijdelijke content:// Uri met FLAG_GRANT_READ_URI_PERMISSION.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.