Dosya sistemiyle çalışmak, herhangi bir mobil uygulamanın temelidir. Her platform kendi erişim modelini sunar: iOS'ta Sandbox, uygulamaları ayrı kapsayıcılarda izole ederken, Android'de Scoped Storage, paylaşılan depolamaya doğrudan erişimi kısıtlar. Google Developer Documentation (2026)'ya göre, Android 10 ile Scoped Storage'ın tanıtılması, veri depolama mimarisinin tamamen yeniden gözden geçirilmesini gerektirdi. Bu kılavuzda, her iki platform için FileManager, MediaStore API, Storage Access Framework ve DocumentProvider'ı ele alacağız.
Önemli Noktalar
Mobil uygulamalarda dosya sistemi, iOS ve Android cihazlarda verilerin nasıl depolandığını ve erişildiğini tanımlayan bir dizi API, güvenlik kuralı ve kısıtlamadır. Masaüstü işletim sistemlerinin aksine, mobil platformlar her uygulamayı izole ederek kullanıcı verilerini diğer programlar tarafından yetkisiz okumaya karşı korur.
iOS, her uygulamanın katı bir şekilde sınırlı izinlerle kendi kapsayıcısında bulunduğu Sandbox modelini kullanır. Sürüm 10'dan önce Android, harici depolamaya tam erişim sağlıyordu, ancak Scoped Storage'ın tanıtılmasıyla yaklaşım iOS'a yaklaştı. Temel fark, iOS'un dosya sistemini tamamen izole etmesi, Android'in ise birden çok erişim seviyesi sunmasıdır: özel bir dizin, herkese açık MediaStore ve SAF aracılığıyla geçici erişim.
Mobil uygulamalar üç tür veri depolama kullanır. Özel depolama — dahili dosyalar ve önbellek için yalnızca uygulamanın erişebileceği dizin. Paylaşılan depolama — MediaStore (Android) veya Files App (iOS) aracılığıyla medya dosyaları. Bulut depolama — cihazlar arasında senkronizasyon için iCloud Drive ve Google Drive. Her türün boyut, dosya ömrü ve erişim koşulları konusunda kendi sınırlamaları vardır.
| Depolama Türü | iOS | Android |
|---|---|---|
| Özel | Documents, Library, Caches | getFilesDir(), getCacheDir() |
| Paylaşılan medya | PHPhotoLibrary (seçici ile) | MediaStore API (ContentResolver) |
| Paylaşılan belgeler | UIDocumentPicker ile Files App | Storage Access Framework (SAF) |
| Bulut | iCloud Drive (UIDocument) | Google Drive API |
| Önbellek | Caches dizini, sistem tarafından temizlenir | getCacheDir(), getExternalCacheDir() |
Sandbox, her uygulamayı izole eden iOS güvenlik mimarisidir. Bir uygulama yalnızca kendi sanal alanı içinde okuyup yazabilir. Kişilere, fotoğraflara veya diğer uygulamaların dosyalarına erişmek için sistem seçiciler kullanılmalıdır: UIImagePickerController veya UIDocumentPickerViewController. Files App'e erişim, Info.plist'teki UIFileSharingEnabled bayrağıyla yapılandırılır. iOS'ta mobil geliştirmede dosya sistemi, dizin yapısını anlamayı ve her veri türü için doğru konumu seçmeyi gerektirir.
iOS sanal alanı birkaç standart dizinden oluşur. Documents — kullanıcı dosyaları için, iCloud Backup'a dahildir. Caches — depolama azaldığında sistemin silebileceği geçici veriler için. Temporary — geçerli oturum dosyaları için, yeniden başlatmada temizlenir. Application Support — kullanıcıdan gizlenen dahili uygulama verileri için. Yanlış dizini seçmek sorunlara yol açar: Documents'da önbellek depolamak iCloud alanını boşa harcar ve Apple'ın dosya sistemi yönergelerini ihlal eder.
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 = "Содержимое файла"
// Atomik yazma şifreleme ile
try text.write(
to: fileURL,
atomically: true,
encoding: .utf8
)
FileManager sınıfı, iOS'ta dosyaları yönetmek için eksiksiz bir yöntem seti sağlar. FileManager.default, çoğu işlem için uygun olan iş parçacığı güvenli bir singleton'dur. fileExists(atPath:), createDirectory(at:withIntermediateDirectories:attributes:), copyItem(at:to:) ve removeItem(at:) gibi yöntemler temel senaryoları kapsar. 1 MB'den büyük dosya işlemleri, DispatchQueue.global() aracılığıyla bir arka plan iş parçacığında gerçekleştirilmelidir. Büyük hacimleri aktarmak için dosyanın tamamını belleğe yüklemek yerine FileHandle kullanın.
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'un piyasaya sürülmesiyle Google, Scoped Storage'ı — dosya sistemine kısıtlı erişim modelini tanıttı. Bir uygulama yalnızca özel dizinlerinde serbestçe okuyup yazabilir. Medya dosyaları (fotoğraf, video, ses) için ContentResolver aracılığıyla MediaStore API kullanılır. Rastgele belgeler için Intent ACTION_OPEN_DOCUMENT aracılığıyla Storage Access Framework kullanılır. Android 11+'da, harici depolamanın köküne doğrudan erişim tamamen yasaktır ve tüm geliştiriciler yeni API'leri kullanmalıdır.
MediaStore, cihazdaki medya dosyalarına erişmek için bir sistem ContentProvider'ıdır. ContentResolver aracılığıyla uygulama, doğrudan yollar yerine dosya Uri'si ister. MediaStore.Files — tüm dosya türleri için, Images — görüntüler için, Video — videolar için, Audio — ses kayıtları için. Paylaşılan dizinlere yazma, DISPLAY_NAME, MIME_TYPE ve RELATIVE_PATH ile insert() aracılığıyla yapılır. Eklemeden sonra uygulama, baytların yazıldığı bir Uri alır. MIME türleri önemli bir rol oynar — yanlış tür, dosyayı açarken hataya neden olur.
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, çalışma zamanı izinleri olmadan dosya seçmek ve oluşturmak için birleşik bir arayüz sağlar. Intent ACTION_OPEN_DOCUMENT, Android'de sistem dosya yöneticisini açar. Seçimden sonra uygulama, FLAG_GRANT_READ_URI_PERMISSION ile geçici erişime sahip bir content:// Uri alır. ACTION_CREATE_DOCUMENT, kullanıcının seçtiği herhangi bir harici depolama konumuna dosya kaydetmeye olanak tanır. SAF, Android 5+'te çalışır ve DocumentsProvider aracılığıyla bağlanan bulut sağlayıcılarının dosyalarına erişim sağlar.
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)
Her iki platform da kullanıcıların dosya seçmesi için yerleşik mekanizmalar sağlar. Mobil uygulamalardaki belgeler, kalıcı izinler olmadan bir dosyaya geçici erişim sağlayan sistem seçiciler aracılığıyla iletilir. iOS'ta bu UIDocumentPickerViewController'dır; Android'de ACTION_OPEN_DOCUMENT'tır. Mobil uygulamalardaki belgeler hem yerel depolamadan hem de bulut hizmetlerinden seçilebilir. Kullanıcı dosyayı açıkça belirtir ve uygulama sınırlı bir geçerlilik süresine sahip bir Uri veya URL alır.
UIDocumentPickerViewController, Files App'i açar ve bir veya daha fazla belge seçilmesine olanak tanır. Modlar: içe aktarma (sanal alana kopyalama) ve açma (güvenlik kapsamlı URL ile erişim). Dosya filtreleme için bir UTType türleri dizisi iletilir — örneğin, .pdf ve .plainText. URL alındıktan sonra uygulama, okumadan önce startAccessingSecurityScopedResource()'u ve bitirdikten sonra stopAccessingSecurityScopedResource()'u çağırmalıdır. stopAccessing'i çağırmamak sistem kaynağı sızıntılarına neden olur. iOS'ta mobil uygulamalardaki belgeler, dosyayla çalışma tamamlandıktan sonra geçici izinlerin zorunlu olarak serbest bırakılmasını gerektirir.
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.pdf, .plainText]
)
picker.allowsMultipleSelection = true
picker.delegate = self
present(picker, animated: true)
// Temsilcide erişimi serbest bırakma
func documentPicker(
_ controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
}
FileProvider, uygulamalar arasında dosyaları güvenli bir şekilde paylaşmak için ContentProvider'ın bir alt sınıfıdır. Belirtilen XML dizinlerindeki dosyalara dayalı olarak geçici content:// Uri'leri oluşturur. Diğer uygulamalar, FLAG_GRANT_READ_URI_PERMISSION ile Intent aracılığıyla erişim elde eder. DocumentProvider, FileProvider'ın aksine, dosyaları SAF'ta yayınlar ve diğer uygulamaların uygulamanızın içeriğini dosya sisteminin bir parçası olarak göz atmasına olanak tanır. DocumentsProvider'ı uygulamak için queryRoots(), queryChildDocuments() ve openDocument()'ı geçersiz kılmanız ve ardından AndroidManifest.xml'e kaydetmeniz gerekir.
Bulut senkronizasyonu, kullanıcıların tüm cihazlarında belgelere erişmesini sağlar. Mobil uygulamalarda dosya sistemi bir bulut katmanıyla güçlendirilir: iOS'ta UIDocument, değişiklikleri otomatik olarak izler ve iCloud aracılığıyla senkronize eder. Android'de benzer işlevsellik, Google Drive API veya bulut kökleri olan DocumentsProvider aracılığıyla oluşturulur. Güvenilir cihazlar arası senkronizasyon oluşturmak için mobil geliştirmede dosya sistemini anlamak kritik öneme sahiptir.
UIDocument, iCloud belgeleriyle çalışmak için soyut bir sınıftır. Değişiklikleri otomatik olarak kaydeder, verileri okur ve delegesi güncellemeler hakkında bilgilendirir. Yazma çakışması durumunda, NSFileVersion mevcut sürümlerin bir listesini sağlar — geliştirici en son sürümü seçebilir veya kullanıcıya çakışma çözüm seçeneklerini gösterebilir. iCloud Drive için proje Yeteneklerinde Ubiquity Container'ı yapılandırmak zorunludur. NSFileCoordinator ve NSFilePresenter, birden çok iş parçacığından veya cihazdan eşzamanlı erişim sırasında veri yarışlarını önler.
iOS, Documents dizinini otomatik olarak iCloud Backup'a dahil eder. Android, Auto Backup for Apps ile çalışır — sistem, getFilesDir(), SharedPreferences ve SQLite veritabanlarındaki verileri Google Drive'a kaydeder. Önbellek ve harici dosyalar yedeklemeye dahil edilmez. Her iki platform da istisnaları yapılandırmaya izin verir: iOS'ta NSURLIsExcludedFromBackupKey aracılığıyla, Android'de XML yedekleme kuralları yapılandırması aracılığıyla. Kişisel veri içeren dosyaların şifrelenmesi zorunludur — iOS'ta NSDataWritingFileProtectionComplete kullanın, Android'de security-crypto kitaplığından EncryptedFile kullanın.
| Parametre | iOS | Android |
|---|---|---|
| Varsayılan yedekleme | Documents ve Library | getFilesDir(), SharedPreferences, DB |
| Dosya istisnası | isExcludedFromBackupKey | XML yedekleme kuralları (fullBackupContent) |
| Şifreleme | NSDataWritingFileProtectionComplete | EncryptedFile (security-crypto) |
| Bulut senkronizasyonu | UIDocument + iCloud | Google Drive API + SAF |
| Otomatik geri yükleme | Kurulumdan sonra iCloud Restore | Yeniden kurulumda Auto Backup |
Sıkça sorulan sorular
Sandbox, iOS'ta her uygulama için izole bir ortamdır. Uygulama, UIDocumentPickerViewController gibi sistem seçicileri kullanmadan diğer uygulamaların dosyalarına erişemez.
Scoped Storage, Android 10+'ta kısıtlı dosya sistemi erişim modelidir. Uygulama yalnızca kendi dosyalarını doğrudan okur, medya için MediaStore API ve belgeler için Storage Access Framework kullanır.
UIDocumentPickerViewController — Files App veya iCloud Drive'dan belge seçmek için sistem seçicisini kullanın. Seçimden sonra, geçici erişime sahip güvenlik kapsamlı bir URL alırsınız.
Medya dosyaları için MIME türünü belirterek ContentResolver aracılığıyla MediaStore API'yi kullanın. Rastgele belgeler için Intent ACTION_OPEN_DOCUMENT ile Storage Access Framework'ü kullanın.
FileProvider, FLAG_GRANT_READ_URI_PERMISSION ile geçici content:// Uri aracılığıyla uygulamalar arasında dosyaları güvenli bir şekilde paylaşmak için ContentProvider'ın bir alt sınıfıdır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.