Die Arbeit mit dem Dateisystem ist die Grundlage jeder mobilen Anwendung. Jede Plattform bietet ihr eigenes Zugriffsmodell: Sandbox unter iOS isoliert Anwendungen in separaten Containern, während Scoped Storage unter Android den direkten Zugriff auf gemeinsam genutzten Speicher einschränkt. Laut Google Developer Documentation (2026) erforderte die Einführung von Scoped Storage mit Android 10 eine vollständige Überarbeitung der Datenspeicherarchitektur. In diesem Leitfaden behandeln wir FileManager, MediaStore API, Storage Access Framework und DocumentProvider für beide Plattformen.
Wichtige Erkenntnisse
Das Dateisystem in mobilen Anwendungen ist eine Reihe von APIs, Sicherheitsregeln und Einschränkungen, die definieren, wie Daten auf iOS- und Android-Geräten gespeichert und darauf zugegriffen wird. Im Gegensatz zu Desktop-Betriebssystemen isolieren mobile Plattformen jede Anwendung, um Benutzerdaten vor unbefugtem Lesen durch andere Programme zu schützen.
iOS verwendet das Sandbox-Modell, bei dem jede App in einem eigenen Container mit streng begrenzten Berechtigungen existiert. Vor Version 10 bot Android vollen Zugriff auf externen Speicher, aber mit der Einführung von Scoped Storage näherte sich der Ansatz iOS an. Der Hauptunterschied besteht darin, dass iOS das Dateisystem vollständig isoliert, während Android mehrere Zugriffsebenen bietet: ein privates Verzeichnis, öffentliches MediaStore und temporären Zugriff über SAF.
Mobile Anwendungen verwenden drei Arten der Datenspeicherung. Privater Speicher — ein nur für die App zugängliches Verzeichnis für interne Dateien und Cache. Gemeinsamer Speicher — Mediendateien über MediaStore (Android) oder Files App (iOS). Cloud-Speicher — iCloud Drive und Google Drive zur Synchronisation zwischen Geräten. Jeder Typ hat seine eigenen Grenzen bezüglich Größe, Dateilebensdauer und Zugriffsbedingungen.
| Speichertyp | iOS | Android |
|---|---|---|
| Privat | Documents, Library, Caches | getFilesDir(), getCacheDir() |
| Gemeinsame Medien | PHPhotoLibrary über Picker | MediaStore API (ContentResolver) |
| Gemeinsame Dokumente | Files App über UIDocumentPicker | Storage Access Framework (SAF) |
| Cloud | iCloud Drive (UIDocument) | Google Drive API |
| Cache | Caches-Verzeichnis, vom System bereinigt | getCacheDir(), getExternalCacheDir() |
Sandbox ist die Sicherheitsarchitektur von iOS, die jede Anwendung isoliert. Eine App kann nur innerhalb ihrer eigenen Sandbox lesen und schreiben. Für den Zugriff auf Kontakte, Fotos oder Dateien anderer Apps müssen System-Picker verwendet werden: UIImagePickerController oder UIDocumentPickerViewController. Der Zugriff auf Files App wird über das Flag UIFileSharingEnabled in Info.plist konfiguriert. Das Dateisystem in der mobilen Entwicklung unter iOS erfordert das Verständnis der Verzeichnisstruktur und die Wahl des richtigen Speicherorts für jeden Datentyp.
Die iOS-Sandbox besteht aus mehreren Standardverzeichnissen. Documents — für Benutzerdateien, in iCloud Backup enthalten. Caches — für temporäre Daten, die das System bei Speichermangel löschen kann. Temporary — für Dateien der aktuellen Sitzung, wird beim Neustart gelöscht. Application Support — für interne App-Daten, die vor dem Benutzer verborgen sind. Die Wahl des falschen Verzeichnisses führt zu Problemen: Das Speichern von Cache in Documents verschwendet iCloud-Speicherplatz und verstößt gegen Apples Dateisystemrichtlinien.
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 = "Содержимое файла"
// Atomares Schreiben mit Verschlüsselung
try text.write(
to: fileURL,
atomically: true,
encoding: .utf8
)
Die Klasse FileManager bietet eine vollständige Reihe von Methoden zur Dateiverwaltung unter iOS. FileManager.default ist ein thread-sicherer Singleton, der für die meisten Operationen geeignet ist. Methoden wie fileExists(atPath:), createDirectory(at:withIntermediateDirectories:attributes:), copyItem(at:to:) und removeItem(at:) decken grundlegende Szenarien ab. Dateioperationen größer als 1 MB sollten in einem Hintergrundthread über DispatchQueue.global() ausgeführt werden. Zum Streamen großer Datenmengen verwenden Sie FileHandle anstatt die gesamte Datei in den Speicher zu 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)
}
Mit der Veröffentlichung von Android 10 führte Google Scoped Storage ein — ein Modell mit eingeschränktem Zugriff auf das Dateisystem. Eine App kann nur in ihren privaten Verzeichnissen frei lesen und schreiben. Für Mediendateien (Fotos, Videos, Audio) wird die MediaStore API über ContentResolver verwendet. Für beliebige Dokumente wird das Storage Access Framework über Intent ACTION_OPEN_DOCUMENT verwendet. Unter Android 11+ ist der direkte Zugriff auf das Stammverzeichnis des externen Speichers vollständig verboten, und alle Entwickler müssen die neuen APIs verwenden.
MediaStore ist ein System-ContentProvider für den Zugriff auf Mediendateien auf dem Gerät. Über ContentResolver fordert die App Datei-Uri anstelle direkter Pfade an. MediaStore.Files — für alle Dateitypen, Images — für Bilder, Video — für Videos, Audio — für Audioaufnahmen. Das Schreiben in gemeinsame Verzeichnisse erfolgt über insert() mit DISPLAY_NAME, MIME_TYPE und RELATIVE_PATH. Nach dem Einfügen erhält die App eine Uri, über die Bytes geschrieben werden. MIME-Typen spielen eine entscheidende Rolle — ein falscher Typ führt beim Öffnen der Datei zu einem Fehler.
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 bietet eine einheitliche Schnittstelle zum Auswählen und Erstellen von Dateien ohne Laufzeitberechtigungen. Intent ACTION_OPEN_DOCUMENT öffnet den Systemdateimanager unter Android. Nach der Auswahl erhält die App eine content:// Uri mit temporärem Zugriff über FLAG_GRANT_READ_URI_PERMISSION. ACTION_CREATE_DOCUMENT ermöglicht das Speichern von Dateien an jedem vom Benutzer gewählten externen Speicherort. SAF funktioniert unter Android 5+ und bietet Zugriff auf Dateien von Cloud-Anbietern, die über DocumentsProvider verbunden sind.
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 Plattformen bieten integrierte Mechanismen für Benutzer zur Auswahl von Dateien. Dokumente in mobilen Anwendungen werden über System-Picker übergeben, die temporären Zugriff auf eine Datei ohne dauerhafte Berechtigungen gewähren. Unter iOS ist dies UIDocumentPickerViewController, unter Android ACTION_OPEN_DOCUMENT. Dokumente in mobilen Anwendungen können sowohl aus dem lokalen Speicher als auch aus Cloud-Diensten ausgewählt werden. Der Benutzer gibt die Datei explizit an, und die App erhält eine Uri oder URL mit begrenzter Gültigkeitsdauer.
UIDocumentPickerViewController öffnet Files App und ermöglicht die Auswahl eines oder mehrerer Dokumente. Modi: importieren (in Sandbox kopieren) und öffnen (Zugriff über security-scoped URL). Zur Dateifilterung wird ein Array von UTType-Typen übergeben — zum Beispiel .pdf und .plainText. Nach Erhalt der URL muss die App vor dem Lesen startAccessingSecurityScopedResource() und nach Abschluss stopAccessingSecurityScopedResource() aufrufen. Das Unterlassen von stopAccessing führt zu Systemressourcenlecks. Dokumente in mobilen Anwendungen unter iOS erfordern die obligatorische Freigabe temporärer Berechtigungen nach Abschluss der Dateiarbeit.
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.pdf, .plainText]
)
picker.allowsMultipleSelection = true
picker.delegate = self
present(picker, animated: true)
// Zugriff im Delegaten freigeben
func documentPicker(
_ controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
}
FileProvider ist eine Unterklasse von ContentProvider zum sicheren Teilen von Dateien zwischen Apps. Es generiert temporäre content:// Uris basierend auf Dateien aus angegebenen XML-Verzeichnissen. Andere Apps erhalten Zugriff über Intent mit FLAG_GRANT_READ_URI_PERMISSION. DocumentProvider veröffentlicht im Gegensatz zu FileProvider Dateien in SAF und ermöglicht anderen Apps, den Inhalt Ihrer App als Teil des Dateisystems zu durchsuchen. Um DocumentsProvider zu implementieren, müssen Sie queryRoots(), queryChildDocuments() und openDocument() überschreiben und dann in AndroidManifest.xml registrieren.
Die Cloud-Synchronisation gibt Benutzern Zugriff auf Dokumente auf allen ihren Geräten. Das Dateisystem in mobilen Anwendungen wird durch eine Cloud-Schicht erweitert: UIDocument unter iOS verfolgt Änderungen automatisch und synchronisiert sie über iCloud. Unter Android wird ähnliche Funktionalität über die Google Drive API oder DocumentsProvider mit Cloud-Roots aufgebaut. Das Verständnis des Dateisystems in der mobilen Entwicklung ist entscheidend für den Aufbau einer zuverlässigen geräteübergreifenden Synchronisation.
UIDocument ist eine abstrakte Klasse für die Arbeit mit iCloud-Dokumenten. Es speichert Änderungen automatisch, liest Daten und benachrichtigt den Delegierten über Aktualisierungen. Bei einem Schreibkonflikt stellt NSFileVersion eine Liste verfügbarer Versionen bereit — der Entwickler kann die neueste auswählen oder dem Benutzer Konfliktlösungsoptionen anzeigen. Die Konfiguration des Ubiquity-Containers in den Capabilities des Projekts ist für iCloud Drive obligatorisch. NSFileCoordinator und NSFilePresenter verhindern Datenrennen bei gleichzeitigem Zugriff aus mehreren Threads oder Geräten.
iOS bindet das Documents-Verzeichnis automatisch in iCloud Backup ein. Android arbeitet mit Auto Backup for Apps — das System speichert Daten aus getFilesDir(), SharedPreferences und SQLite-Datenbanken in Google Drive. Cache und externe Dateien werden nicht in Backups einbezogen. Beide Plattformen ermöglichen das Konfigurieren von Ausnahmen: unter iOS über NSURLIsExcludedFromBackupKey, unter Android über XML-Konfiguration von Backup-Regeln. Die Verschlüsselung von Dateien mit personenbezogenen Daten ist obligatorisch — unter iOS verwenden Sie NSDataWritingFileProtectionComplete, unter Android EncryptedFile aus der Bibliothek security-crypto.
| Parameter | iOS | Android |
|---|---|---|
| Standard-Backup | Documents und Library | getFilesDir(), SharedPreferences, DB |
| Dateiausschluss | isExcludedFromBackupKey | XML-Backup-Regeln (fullBackupContent) |
| Verschlüsselung | NSDataWritingFileProtectionComplete | EncryptedFile (security-crypto) |
| Cloud-Sync | UIDocument + iCloud | Google Drive API + SAF |
| Auto-Restore | iCloud Restore nach Installation | Auto Backup bei Neuinstallation |
Häufig gestellte Fragen
Sandbox ist eine isolierte Umgebung für jede App unter iOS. Die App kann ohne Verwendung von System-Pickern wie UIDocumentPickerViewController nicht auf Dateien anderer Apps zugreifen.
Scoped Storage ist ein Modell mit eingeschränktem Dateisystemzugriff unter Android 10+. Die App liest direkt nur ihre eigenen Dateien, verwendet MediaStore API für Medien und Storage Access Framework für Dokumente.
Verwenden Sie UIDocumentPickerViewController — den System-Picker zum Auswählen von Dokumenten aus Files App oder iCloud Drive. Nach der Auswahl erhalten Sie eine security-scoped URL mit temporärem Zugriff.
Für Mediendateien verwenden Sie die MediaStore API über ContentResolver mit Angabe des MIME-Typs. Für beliebige Dokumente verwenden Sie Storage Access Framework mit Intent ACTION_OPEN_DOCUMENT.
FileProvider ist eine Unterklasse von ContentProvider zum sicheren Teilen von Dateien zwischen Apps über temporäre content:// Uri mit FLAG_GRANT_READ_URI_PERMISSION.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.