Bekerja dengan sistem file adalah fondasi dari setiap aplikasi seluler. Setiap platform menawarkan model aksesnya sendiri: Sandbox di iOS mengisolasi aplikasi dalam wadah terpisah, sementara Scoped Storage di Android membatasi akses langsung ke penyimpanan bersama. Menurut Google Developer Documentation (2026), pengenalan Scoped Storage dengan Android 10 memerlukan peninjauan ulang total arsitektur penyimpanan data. Dalam panduan ini, kita akan membahas FileManager, MediaStore API, Storage Access Framework, dan DocumentProvider untuk kedua platform.
Poin Penting
Sistem file di aplikasi seluler adalah kumpulan API, aturan keamanan, dan batasan yang menentukan cara data disimpan dan diakses di perangkat iOS dan Android. Tidak seperti sistem operasi desktop, platform seluler mengisolasi setiap aplikasi untuk melindungi data pengguna dari pembacaan tidak sah oleh program lain.
iOS menggunakan model Sandbox, di mana setiap aplikasi berada dalam wadahnya sendiri dengan izin yang dibatasi secara ketat. Sebelum versi 10, Android menyediakan akses penuh ke penyimpanan eksternal, tetapi dengan diperkenalkannya Scoped Storage, pendekatannya menjadi lebih dekat dengan iOS. Perbedaan utamanya adalah iOS mengisolasi sistem file sepenuhnya, sementara Android menawarkan beberapa tingkat akses: direktori pribadi, MediaStore publik, dan akses sementara melalui SAF.
Aplikasi seluler menggunakan tiga jenis penyimpanan data. Penyimpanan pribadi — direktori yang hanya dapat diakses oleh aplikasi untuk file internal dan cache. Penyimpanan bersama — file media melalui MediaStore (Android) atau Files App (iOS). Penyimpanan cloud — iCloud Drive dan Google Drive untuk sinkronisasi antar perangkat. Setiap jenis memiliki batasannya sendiri dalam hal ukuran, masa pakai file, dan kondisi akses.
| Jenis penyimpanan | iOS | Android |
|---|---|---|
| Pribadi | Documents, Library, Caches | getFilesDir(), getCacheDir() |
| Media bersama | PHPhotoLibrary melalui pemilih | MediaStore API (ContentResolver) |
| Dokumen bersama | Files App melalui UIDocumentPicker | Storage Access Framework (SAF) |
| Cloud | iCloud Drive (UIDocument) | Google Drive API |
| Cache | Direktori Caches, dibersihkan oleh sistem | getCacheDir(), getExternalCacheDir() |
Sandbox adalah arsitektur keamanan iOS yang mengisolasi setiap aplikasi. Sebuah aplikasi hanya dapat membaca dan menulis di dalam sandbox-nya sendiri. Untuk mengakses kontak, foto, atau file dari aplikasi lain, pemilih sistem harus digunakan: UIImagePickerController atau UIDocumentPickerViewController. Akses ke Files App dikonfigurasi melalui bendera UIFileSharingEnabled di Info.plist. Sistem file dalam pengembangan seluler di iOS memerlukan pemahaman tentang struktur direktori dan pemilihan lokasi yang tepat untuk setiap jenis data.
Sandbox iOS terdiri dari beberapa direktori standar. Documents — untuk file pengguna, termasuk dalam iCloud Backup. Caches — untuk data sementara yang mungkin dihapus sistem saat penyimpanan hampir penuh. Temporary — untuk file sesi saat ini, dibersihkan saat restart. Application Support — untuk data internal aplikasi yang tersembunyi dari pengguna. Memilih direktori yang salah menyebabkan masalah: menyimpan cache di Documents membuang-buang ruang iCloud dan melanggar pedoman sistem file 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 = "Содержимое файла"
// Penulisan atomik dengan enkripsi
try text.write(
to: fileURL,
atomically: true,
encoding: .utf8
)
Kelas FileManager menyediakan serangkaian metode lengkap untuk mengelola file di iOS. FileManager.default adalah singleton thread-safe yang cocok untuk sebagian besar operasi. Metode seperti fileExists(atPath:), createDirectory(at:withIntermediateDirectories:attributes:), copyItem(at:to:), dan removeItem(at:) mencakup skenario dasar. Operasi file yang lebih besar dari 1 MB harus dilakukan di thread latar belakang melalui DispatchQueue.global(). Untuk streaming volume besar, gunakan FileHandle daripada memuat seluruh file ke memori.
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)
}
Dengan dirilisnya Android 10, Google memperkenalkan Scoped Storage — model akses terbatas ke sistem file. Sebuah aplikasi hanya dapat membaca dan menulis secara bebas di direktori pribadinya. Untuk file media (foto, video, audio), MediaStore API digunakan melalui ContentResolver. Untuk dokumen arbitrer, Storage Access Framework digunakan melalui Intent ACTION_OPEN_DOCUMENT. Di Android 11+, akses langsung ke root penyimpanan eksternal sepenuhnya dilarang, dan semua pengembang harus menggunakan API baru.
MediaStore adalah ContentProvider sistem untuk mengakses file media di perangkat. Melalui ContentResolver, aplikasi meminta Uri file alih-alih jalur langsung. MediaStore.Files — untuk semua jenis file, Images — untuk gambar, Video — untuk video, Audio — untuk rekaman audio. Penulisan ke direktori bersama dilakukan melalui insert() dengan DISPLAY_NAME, MIME_TYPE, dan RELATIVE_PATH. Setelah penyisipan, aplikasi menerima Uri tempat byte ditulis. Jenis MIME memainkan peran penting — jenis yang salah akan menyebabkan kesalahan saat membuka file.
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 menyediakan antarmuka terpadu untuk memilih dan membuat file tanpa izin runtime. Intent ACTION_OPEN_DOCUMENT membuka manajer file sistem di Android. Setelah pemilihan, aplikasi menerima Uri content:// dengan akses sementara melalui FLAG_GRANT_READ_URI_PERMISSION. ACTION_CREATE_DOCUMENT memungkinkan menyimpan file ke lokasi penyimpanan eksternal mana pun yang dipilih pengguna. SAF berfungsi di Android 5+ dan menyediakan akses ke file dari penyedia cloud yang terhubung melalui 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)
Kedua platform menyediakan mekanisme bawaan bagi pengguna untuk memilih file. Dokumen di aplikasi seluler diteruskan melalui pemilih sistem yang memberikan akses sementara ke file tanpa izin permanen. Di iOS, ini adalah UIDocumentPickerViewController; di Android, ACTION_OPEN_DOCUMENT. Dokumen di aplikasi seluler dapat dipilih dari penyimpanan lokal dan layanan cloud. Pengguna secara eksplisit menentukan file, dan aplikasi menerima Uri atau URL dengan masa berlaku terbatas.
UIDocumentPickerViewController membuka Files App dan memungkinkan memilih satu atau lebih dokumen. Mode: impor (menyalin ke sandbox) dan buka (akses melalui URL dengan cakupan keamanan). Untuk pemfilteran file, array jenis UTType diteruskan — misalnya, .pdf dan .plainText. Setelah menerima URL, aplikasi harus memanggil startAccessingSecurityScopedResource() sebelum membaca dan stopAccessingSecurityScopedResource() setelah selesai. Tidak memanggil stopAccessing menyebabkan kebocoran sumber daya sistem. Dokumen di aplikasi seluler di iOS memerlukan pelepasan wajib izin sementara setelah selesai bekerja dengan file.
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.pdf, .plainText]
)
picker.allowsMultipleSelection = true
picker.delegate = self
present(picker, animated: true)
// Melepaskan akses di delegasi
func documentPicker(
_ controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
}
FileProvider adalah subkelas dari ContentProvider untuk berbagi file secara aman antar aplikasi. Ini menghasilkan Uri content:// sementara berdasarkan file dari direktori XML yang ditentukan. Aplikasi lain mendapatkan akses melalui Intent dengan FLAG_GRANT_READ_URI_PERMISSION. DocumentProvider, tidak seperti FileProvider, mempublikasikan file di SAF dan memungkinkan aplikasi lain menjelajahi konten aplikasi Anda sebagai bagian dari sistem file. Untuk mengimplementasikan DocumentsProvider, Anda perlu menimpa queryRoots(), queryChildDocuments(), dan openDocument(), lalu mendaftarkannya di AndroidManifest.xml
Sinkronisasi cloud memberi pengguna akses ke dokumen di semua perangkat mereka. Sistem file di aplikasi seluler ditingkatkan dengan lapisan cloud: UIDocument di iOS secara otomatis melacak perubahan dan menyinkronkannya melalui iCloud. Di Android, fungsionalitas serupa dibangun melalui Google Drive API atau DocumentsProvider dengan akar cloud. Memahami sistem file dalam pengembangan seluler sangat penting untuk membangun sinkronisasi yang andal antar perangkat.
UIDocument adalah kelas abstrak untuk bekerja dengan dokumen iCloud. Ini secara otomatis menyimpan perubahan, membaca data, dan memberi tahu delegasi tentang pembaruan. Jika terjadi konflik penulisan, NSFileVersion menyediakan daftar versi yang tersedia — pengembang dapat memilih yang terbaru atau menampilkan opsi penyelesaian konflik kepada pengguna. Mengonfigurasi Ubiquity Container di Capabilities proyek wajib untuk iCloud Drive. NSFileCoordinator dan NSFilePresenter mencegah kondisi balapan data selama akses bersamaan dari beberapa thread atau perangkat.
iOS secara otomatis menyertakan direktori Documents di iCloud Backup. Android bekerja dengan Auto Backup for Apps — sistem menyimpan data dari getFilesDir(), SharedPreferences, dan database SQLite ke Google Drive. Cache dan file eksternal tidak termasuk dalam cadangan. Kedua platform memungkinkan konfigurasi pengecualian: di iOS melalui NSURLIsExcludedFromBackupKey, di Android melalui konfigurasi XML aturan cadangan. Enkripsi file dengan data pribadi adalah wajib — di iOS gunakan NSDataWritingFileProtectionComplete, di Android gunakan EncryptedFile dari pustaka security-crypto.
| Parameter | iOS | Android |
|---|---|---|
| Cadangan default | Documents dan Library | getFilesDir(), SharedPreferences, DB |
| Pengecualian file | isExcludedFromBackupKey | Aturan XML cadangan (fullBackupContent) |
| Enkripsi | NSDataWritingFileProtectionComplete | EncryptedFile (security-crypto) |
| Sinkronisasi cloud | UIDocument + iCloud | Google Drive API + SAF |
| Pemulihan otomatis | iCloud Restore setelah instalasi | Auto Backup saat instalasi ulang |
Pertanyaan yang sering diajukan
Sandbox adalah lingkungan terisolasi untuk setiap aplikasi di iOS. Aplikasi tidak dapat mengakses file aplikasi lain tanpa menggunakan pemilih sistem seperti UIDocumentPickerViewController.
Scoped Storage adalah model akses terbatas ke sistem file di Android 10+. Aplikasi hanya membaca langsung filenya sendiri, menggunakan MediaStore API untuk media dan Storage Access Framework untuk dokumen.
Gunakan UIDocumentPickerViewController — pemilih sistem untuk memilih dokumen dari Files App atau iCloud Drive. Setelah pemilihan, Anda menerima URL dengan cakupan keamanan dan akses sementara.
Untuk file media, gunakan MediaStore API melalui ContentResolver dengan menentukan jenis MIME. Untuk dokumen arbitrer, gunakan Storage Access Framework dengan Intent ACTION_OPEN_DOCUMENT.
FileProvider adalah subkelas dari ContentProvider untuk berbagi file secara aman antar aplikasi melalui Uri content:// sementara dengan FLAG_GRANT_READ_URI_PERMISSION.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.