Práce se souborovým systémem je základem každé mobilní aplikace. Každá platforma nabízí svůj vlastní model přístupu: Sandbox na iOS izoluje aplikace v oddělených kontejnerech, zatímco Scoped Storage na Androidu omezuje přímý přístup ke sdílenému úložišti. Podle Google Developer Documentation (2026) si zavedení Scoped Storage s Androidem 10 vyžádalo úplnou revizi architektury ukládání dat. V tomto průvodci se budeme věnovat FileManager, MediaStore API, Storage Access Framework a DocumentProvider pro obě platformy.
Klíčové body
Souborový systém v mobilních aplikacích je soubor API, bezpečnostních pravidel a omezení, které definují ukládání a přístup k datům na zařízeních iOS a Android. Na rozdíl od desktopových operačních systémů mobilní platformy izolují každou aplikaci, aby chránily data uživatele před neoprávněným čtením jinými programy.
iOS používá model Sandbox, kde každá aplikace existuje ve vlastním kontejneru s přísně omezenými oprávněními. Před verzí 10 Android poskytoval plný přístup k externímu úložišti, ale se zavedením Scoped Storage se přístup přiblížil iOS. Klíčový rozdíl je v tom, že iOS zcela izoluje souborový systém, zatímco Android nabízí několik úrovní přístupu: soukromý adresář, veřejné MediaStore a dočasný přístup prostřednictvím SAF.
Mobilní aplikace používají tři typy ukládání dat. Soukromé úložiště — adresář přístupný pouze aplikaci pro interní soubory a mezipaměť. Sdílené úložiště — multimediální soubory přes MediaStore (Android) nebo Files App (iOS). Cloudové úložiště — iCloud Drive a Google Drive pro synchronizaci mezi zařízeními. Každý typ má svá vlastní omezení týkající se velikosti, životnosti souborů a podmínek přístupu.
| Typ úložiště | iOS | Android |
|---|---|---|
| Soukromé | Documents, Library, Caches | getFilesDir(), getCacheDir() |
| Sdílená média | PHPhotoLibrary přes výběr | MediaStore API (ContentResolver) |
| Sdílené dokumenty | Files App přes UIDocumentPicker | Storage Access Framework (SAF) |
| Cloud | iCloud Drive (UIDocument) | Google Drive API |
| Mezipaměť | Adresář Caches, čištěný systémem | getCacheDir(), getExternalCacheDir() |
Sandbox je bezpečnostní architektura iOS, která izoluje každou aplikaci. Aplikace může číst a zapisovat pouze v rámci svého vlastního sandboxu. Pro přístup ke kontaktům, fotografiím nebo souborům jiných aplikací je nutné použít systémové výběry: UIImagePickerController nebo UIDocumentPickerViewController. Přístup k Files App se konfiguruje pomocí příznaku UIFileSharingEnabled v Info.plist. Souborový systém v mobilním vývoji na iOS vyžaduje pochopení struktury adresářů a výběr správného umístění pro každý typ dat.
Sandbox iOS se skládá z několika standardních adresářů. Documents — pro uživatelské soubory, zahrnuto v iCloud Backup. Caches — pro dočasná data, která může systém odstranit při nedostatku místa. Temporary — pro soubory aktuální relace, vymazáno při restartu. Application Support — pro interní data aplikace skrytá před uživatelem. Výběr špatného adresáře vede k problémům: ukládání mezipaměti do Documents plýtvá místem v iCloud a porušuje pokyny Apple pro souborový systém.
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 = "Содержимое файла"
// Atomický zápis s šifrováním
try text.write(
to: fileURL,
atomically: true,
encoding: .utf8
)
Třída FileManager poskytuje kompletní sadu metod pro správu souborů na iOS. FileManager.default je thread-safe singleton vhodný pro většinu operací. Metody jako fileExists(atPath:), createDirectory(at:withIntermediateDirectories:attributes:), copyItem(at:to:) a removeItem(at:) pokrývají základní scénáře. Operace se soubory většími než 1 MB by měly být prováděny v vlákně na pozadí přes DispatchQueue.global(). Pro streamování velkých objemů použijte FileHandle místo načítání celého souboru do paměti.
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)
}
S vydáním Androidu 10 Google představil Scoped Storage — model omezeného přístupu k souborovému systému. Aplikace může volně číst a zapisovat pouze ve svých soukromých adresářích. Pro multimediální soubory (fotografie, videa, zvuk) se používá MediaStore API přes ContentResolver. Pro libovolné dokumenty se používá Storage Access Framework přes Intent ACTION_OPEN_DOCUMENT. Na Androidu 11+ je přímý přístup ke kořenu externího úložiště zcela zakázán a všichni vývojáři musí používat nová API.
MediaStore je systémový ContentProvider pro přístup k multimediálním souborům na zařízení. Prostřednictvím ContentResolver aplikace požaduje Uri souborů místo přímých cest. MediaStore.Files — pro všechny typy souborů, Images — pro obrázky, Video — pro videa, Audio — pro zvukové nahrávky. Zápis do sdílených adresářů se provádí pomocí insert() s DISPLAY_NAME, MIME_TYPE a RELATIVE_PATH. Po vložení aplikace obdrží Uri, přes které se zapisují bajty. Typy MIME hrají klíčovou roli — nesprávný typ způsobí chybu při otevírání souboru.
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 poskytuje jednotné rozhraní pro výběr a vytváření souborů bez oprávnění za běhu. Intent ACTION_OPEN_DOCUMENT otevře systémového správce souborů na Androidu. Po výběru aplikace obdrží content:// Uri s dočasným přístupem přes FLAG_GRANT_READ_URI_PERMISSION. ACTION_CREATE_DOCUMENT umožňuje ukládat soubory na libovolné externí úložiště zvolené uživatelem. SAF funguje na Androidu 5+ a poskytuje přístup k souborům od cloudových poskytovatelů připojených přes 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)
Obě platformy poskytují vestavěné mechanismy pro výběr souborů uživateli. Dokumenty v mobilních aplikacích jsou předávány prostřednictvím systémových výběrů, které poskytují dočasný přístup k souboru bez trvalých oprávnění. Na iOS je to UIDocumentPickerViewController, na Androidu ACTION_OPEN_DOCUMENT. Dokumenty v mobilních aplikacích lze vybírat z místního úložiště i cloudových služeb. Uživatel explicitně určí soubor a aplikace obdrží Uri nebo URL s omezenou dobou platnosti.
UIDocumentPickerViewController otevře Files App a umožní výběr jednoho nebo více dokumentů. Režimy: import (zkopírování do sandboxu) a otevření (přístup přes URL s bezpečnostním rozsahem). Pro filtrování souborů se předává pole typů UTType — například .pdf a .plainText. Po obdržení URL musí aplikace zavolat startAccessingSecurityScopedResource() před čtením a stopAccessingSecurityScopedResource() po dokončení. Nezavolání stopAccessing vede k úniku systémových zdrojů. Dokumenty v mobilních aplikacích na iOS vyžadují povinné uvolnění dočasných oprávnění po dokončení práce se souborem.
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.pdf, .plainText]
)
picker.allowsMultipleSelection = true
picker.delegate = self
present(picker, animated: true)
// Uvolnění přístupu v delegátovi
func documentPicker(
_ controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
}
FileProvider je podtřída ContentProvider pro bezpečné sdílení souborů mezi aplikacemi. Generuje dočasná content:// Uri na základě souborů z určených XML adresářů. Jiné aplikace získají přístup prostřednictvím Intent s FLAG_GRANT_READ_URI_PERMISSION. DocumentProvider na rozdíl od FileProvider publikuje soubory v SAF a umožňuje jiným aplikacím procházet obsah vaší aplikace jako součást souborového systému. Pro implementaci DocumentsProvider musíte přepsat queryRoots(), queryChildDocuments() a openDocument() a poté jej zaregistrovat v AndroidManifest.xml
Cloudová synchronizace poskytuje uživatelům přístup k dokumentům na všech jejich zařízeních. Souborový systém v mobilních aplikacích je rozšířen o cloudovou vrstvu: UIDocument na iOS automaticky sleduje změny a synchronizuje je přes iCloud. Na Androidu je podobná funkčnost postavena přes Google Drive API nebo DocumentsProvider s cloudovými kořeny. Porozumění souborovému systému v mobilním vývoji je zásadní pro vybudování spolehlivé synchronizace mezi zařízeními.
UIDocument je abstraktní třída pro práci s dokumenty iCloud. Automaticky ukládá změny, čte data a informuje delegáta o aktualizacích. V případě konfliktu zápisu poskytuje NSFileVersion seznam dostupných verzí — vývojář může vybrat nejnovější nebo zobrazit uživateli možnosti řešení konfliktu. Konfigurace Ubiquity Container v Capabilities projektu je povinná pro iCloud Drive. NSFileCoordinator a NSFilePresenter zabraňují datovým závodům během současného přístupu z více vláken nebo zařízení.
iOS automaticky zahrnuje adresář Documents do iCloud Backup. Android funguje s Auto Backup for Apps — systém ukládá data z getFilesDir(), SharedPreferences a databází SQLite do Google Drive. Mezipaměť a externí soubory nejsou součástí záloh. Obě platformy umožňují konfigurovat výjimky: na iOS přes NSURLIsExcludedFromBackupKey, na Androidu přes XML konfiguraci pravidel zálohování. Šifrování souborů s osobními údaji je povinné — na iOS použijte NSDataWritingFileProtectionComplete, na Androidu použijte EncryptedFile z knihovny security-crypto.
| Parametr | iOS | Android |
|---|---|---|
| Výchozí záloha | Documents a Library | getFilesDir(), SharedPreferences, DB |
| Vyloučení souborů | isExcludedFromBackupKey | XML pravidla zálohování (fullBackupContent) |
| Šifrování | NSDataWritingFileProtectionComplete | EncryptedFile (security-crypto) |
| Cloudová synchronizace | UIDocument + iCloud | Google Drive API + SAF |
| Automatické obnovení | iCloud Restore po instalaci | Auto Backup při přeinstalaci |
Často kladené dotazy
Sandbox je izolované prostředí pro každou aplikaci na iOS. Aplikace nemůže přistupovat k souborům jiných aplikací bez použití systémových výběrů, jako je UIDocumentPickerViewController.
Scoped Storage je model omezeného přístupu k souborovému systému na Androidu 10+. Aplikace čte přímo pouze své vlastní soubory, používá MediaStore API pro média a Storage Access Framework pro dokumenty.
Použijte UIDocumentPickerViewController — systémový výběr pro výběr dokumentů z Files App nebo iCloud Drive. Po výběru obdržíte URL s bezpečnostním rozsahem a dočasným přístupem.
Pro multimediální soubory použijte MediaStore API přes ContentResolver s uvedením typu MIME. Pro libovolné dokumenty použijte Storage Access Framework s Intent ACTION_OPEN_DOCUMENT.
FileProvider je podtřída ContentProvider pro bezpečné sdílení souborů mezi aplikacemi přes dočasné content:// Uri s FLAG_GRANT_READ_URI_PERMISSION.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.