Uygulama belgeler dizini, oturumlar arasında korunması ve yedeklerden geri yüklenmesi gereken kullanıcı dosyaları için kalıcı bir depolama alanıdır. Apple File System Programming Guide, 2026'ya göre, iOS'ta Documents dizini, önbellek ve geçici dizinlerin aksine otomatik olarak iCloud yedeklemesine dahil edilir. Belgeler dizininin doğru kullanımı, uygulama güncellemesi veya yeniden yükleme sırasında kullanıcı dosyalarının kaybolmamasını sağlar.
Önemli Noktalar
context.filesDir'dirBelgeler dizini, uygulama kum havuzu (sandbox) içinde, kullanıcı dosyalarının kalıcı olarak saklanması için tasarlanmış özel bir depolama alanıdır. Önbelleğin aksine, bu dizindeki dosyalar kullanıcı için önemli kabul edilir: alan azaldığında sistem tarafından silinmez, uygulama güncellemeleri sırasında korunur ve cihaz senkronizasyonu sırasında yedeklenir. iOS'ta Documents dizini, Sandbox konteynerinin bir parçasıdır ve otomatik olarak iCloud yedeklemesine dahil edilir. Android'de doğrudan bir eşdeğeri yoktur — eşdeğeri, kalıcı dosyalar için de olan ancak yerleşik bir yedekleme mekanizması bulunmayan context.filesDir'dir.
Android'de belgeler dizini ile dahili depolama arasındaki fark minimumdur: her ikisi de uygulama kum havuzundadır, her ikisi de kaldırma sırasında silinir, her ikisi de diğer uygulamalar tarafından erişilemez. Temel fark anlamsaldır: Belgeler Dizini, dosyaların kullanıcı tarafından oluşturulduğunu veya içe aktarıldığını varsayarken, dahili depolama uygulamanın iç dosyalarını (veritabanları, yapılandırmalar) içerebilir. iOS'ta fark daha belirgindir: Documents otomatik olarak yedeklenirken, Library/Application Support yedeklenmez. Bu, depolama stratejisini etkiler: Documents'a yalnızca kullanıcının yeni bir cihazda geri yüklemek isteyeceği şeyleri koyun ve Application Support'e uygulamanın yeniden oluşturabileceği iç verileri koyun.
Kum havuzu mimarisi, diğer uygulamaların uygulamanızın belgeler dizinine erişememesini sağlar. iOS'ta, diğer uygulamaların Documents'ına jailbreak olmadan erişmek imkansızdır. Android'de, root erişimi herhangi bir uygulamanın filesDir'ini okumaya izin verir, bu nedenle hassas veriler (tokenlar, şifreleme anahtarları) EncryptedSharedPreferences veya AndroidX Security kitaplığından EncryptedFile kullanılarak ek olarak korunmalıdır.
Belgeler dizini, kullanıcı için değerli olan ve uygulama yeniden başlatıldıktan veya cihaz geri yüklendikten sonra erişilebilir olması gereken verileri saklamalıdır. Tüm dosyalar bu dizinde saklanmak için uygun değildir — seçim, veri türüne ve kullanım senaryosuna bağlıdır.
Kullanıcı dosyaları, belgeler dizininin ana içeriğidir. Bunlar, bir düzenleyicide oluşturulan metin belgeleri, uygulama kamerasıyla çekilen görüntüler, dışa aktarılan PDF raporları, ses kayıtları, notlar olabilir. Bu tür her dosya kullanıcı tarafından veya talebi üzerine oluşturulur ve her an erişilebilir olmalıdır. iOS'ta, Documents'taki dosyalar sistem Dosyalar uygulamasında görüntülenir ve kullanıcının bunları standart dosya yöneticisi aracılığıyla yönetmesine olanak tanır. Android'de benzer bir görüntüleme yoktur — uygulama, kaydedilen dosyaları görüntülemek için kendisi bir arayüz sağlamalıdır.
SQLite veritabanları ve ayar dosyaları genellikle belgeler dizininin yakınında saklanır, ancak içinde değil. iOS'ta, veritabanları Library/Application Support'a yerleştirilir, çünkü Dosyalar uygulamasında görünmemeli ve ayrı olarak yedeklenmemelidir. Android'de, veritabanları varsayılan olarak /data/data/<package>/databases/ içinde Room veya SQLiteOpenHelper aracılığıyla oluşturulur. Veritabanı kullanıcı içeriği (notlar, günlük, finansal kayıtlar) içeriyorsa, sistem yedeklemesini sağlamak için filesDir'e yerleştirilebilir. Room, RoomDatabase.Builder geri çağrısı aracılığıyla veritabanı depolaması için özel bir dizin belirlemeye izin verir.
val dbFile = File(context.filesDir, "user_database.db")
val db = Room.databaseBuilder<AppDatabase>(
context,
dbFile.absolutePath
).build()
Kullanıcının diğer uygulamalardan içe aktardığı veya uygulamanızdan dışa aktardığı dosyalar da belgeler dizininde saklanmalıdır. iOS'ta, UIDocumentPickerViewController aracılığıyla içe aktarma, asCopy: true parametresi kullanıldığında otomatik olarak dosyanın bir kopyasını Documents'a yerleştirir. Android'de, SAF diyalogu aracılığıyla içe aktarma da uygulama kum havuzunda dosyanın bir kopyasını oluşturur. Verileri dışa aktarırken (örneğin, kişilerle bir CSV dosyası oluşturmak), önce dosyayı Documents/filesDir'e kaydedin, ardından kullanıcıya Share Sheet aracılığıyla paylaşma seçeneği sunun. Bu, kullanıcı gönderdikten sonra dosyayı kaydetmeyi unutsa bile, daha sonra kullanılmak üzere uygulamada bir kopyanın kalmasını sağlar.
Android'de, belgeler dizini işlevini context.filesDir yerine getirir. Ek olarak, SD kartta context.externalFilesDir dizini bulunur, ancak veri bütünlüğünü garanti etmez. Bu dizinlerle çalışmanın ana tekniklerini inceleyelim.
filesDir, Android'de uygulamanın kalıcı dosyaları için ana dizindir. Uygulama kum havuzunda bulunur ve kaldırma sırasında tamamen silinir. Bir File örneği almak için, /data/data/<package>/files/ yolunu döndüren context.filesDir'i kullanın. Dosyalar oluşturmak ve okumak için standart Java/Kotlin File işlemlerini veya bir dosya adı alıp FileInputStream/FileOutputStream döndüren Context yöntemleri openFileInput() ve openFileOutput()'u kullanın. openFileOutput() yöntemi, dosya henüz yoksa otomatik olarak filesDir'de oluşturur ve erişim modunu belirlemeye izin verir: MODE_PRIVATE (yalnızca geçerli uygulama), MODE_APPEND (ekleme) veya MODE_WORLD_READABLE (kullanımdan kaldırıldı, API 24+'dan beri kullanılmıyor).
val fileName = "report.pdf"
val content = "PDF content".toByteArray()
context.openFileOutput(fileName, Context.MODE_PRIVATE).use { stream ->
stream.write(content)
}
val bytes = context.openFileInput(fileName).use { stream ->
stream.readBytes()
}
Android 10+'da, Scoped Storage modeli filesDir'i etkilemez — uygulamanın kendi kum havuzuna tam erişim devam eder. filesDir içindeki tüm okuma ve yazma işlemleri ek izinler gerektirmez. Ancak, filesDir aracılığıyla başka bir uygulamanın dosyalarına erişmeye çalışırsanız, bir istisna alırsınız. Dosyaları paylaşmak için, bir dosyayı başka bir uygulamaya aktarmak üzere geçici bir içerik URI'si oluşturan FileProvider'ı kullanın. FileProvider, AndroidManifest.xml'de <provider> etiketi aracılığıyla bildirilir ve bir XML yol dosyasında yapılandırılır. Bu, uygulamalar arasında dosya aktarımı için standart mekanizmadır ve örneğin, ACTION_SEND ile Intent aracılığıyla bir görüntü gönderirken kullanılır.
iOS'ta, Documents Directory özel statüye sahip uygulamanın Sandbox konteynerinin bir parçasıdır. Bu dizindeki dosyalar otomatik olarak iCloud yedeklemesine dahil edilir, Dosyalar uygulamasında görüntülenir ve App Store aracılığıyla uygulama güncellemeleri sırasında korunur.
Documents'ın otomatik yedeklenmesi iOS'un önemli bir avantajıdır. Kullanıcı cihazı iTunes'a bağladığında veya iCloud Backup'ı etkinleştirdiğinde, Documents/ içindeki tüm dosyalar yedeklemeye kopyalanır. Yeni bir cihazda geri yükleme yaparken, kullanıcı ek işlem yapmadan tüm dosyalarını alır. Ancak, uygulama Documents'ta büyük miktarda veri depoluyorsa bu avantaj dezavantaja dönüşür: yedekleme süresi artar ve iCloud depolama alanı hızla tükenebilir. Bu nedenle, Documents yalnızca kullanıcının geri yükleme sırasında gerçekten ihtiyaç duyduğu dosyaları saklamalıdır. Geçici dosyalar, önbellek ve yeniden oluşturulabilir veriler Caches veya Library/Application Support'ta bulunmalıdır. Apple, isExcludedFromBackup özelliği aracılığıyla internetten yeniden indirilebilen dosyaların yedeklemeden hariç tutulmasını önerir.
let fm = FileManager.default
let docsURL = fm.urls(
for: .documentDirectory,
in: .userDomainMask
).first!
let fileURL = docsURL.appendingPathComponent("notes.txt")
let text = "Not içeriği"
try text.write(to: fileURL, atomically: true, encoding: .utf8)
iCloud Drive, kullanıcının cihazları arasında Documents'taki dosyaların senkronize edilmesine olanak tanır. Senkronizasyonu etkinleştirmek için uygulamanın, sürümleme ve çakışma çözümünü otomatik olarak yöneten NSDocument veya UIDocument API'lerini kullanması gerekir. Alternatif bir yaklaşım, senkronizasyon üzerinde daha esnek kontrol sağlayan ancak CloudKit Dashboard'da yapılandırma gerektiren CloudKit ile iCloud kullanmaktır. iCloud Drive'ı kullanırken, düzenleme çakışmalarını doğru şekilde ele aldığınızdan (birleştirme veya son yazan kazanır) ve uygulama arayüzü aracılığıyla kullanıcıyı senkronizasyon durumu hakkında bilgilendirdiğinizden emin olun. iCloud anında senkronizasyonu garanti etmez — gecikme, dosya boyutuna ve bağlantı kalitesine bağlı olarak birkaç saniyeden birkaç dakikaya kadar değişebilir. Kritik veriler için, çakışma durumunda dosyanın önceki sürümünün geri yüklenebilmesi için işlemsel yazma ve sürümleme kullanın.
Doğru seçim Documents Directory ile Cache Directory arasında, kullanıcı verisi depolamanın güvenilirliğini belirler. Seçimdeki bir hata, ya veri kaybına (önemli dosyalar önbellekte saklanıyorsa) ya da yedekleme taşmasına (geçici dosyalar Documents'ta saklanıyorsa) yol açar.
| Kriter | Documents Directory | Cache Directory |
|---|---|---|
| Veri bütünlüğü garantisi | Yüksek — sistem tarafından silinmez | Düşük — temizlenebilir |
| Yedekleme (iOS) | Otomatik olarak iCloud'da | Yedeklenmez |
| Kullanıcı görünürlüğü (iOS) | Dosyalar uygulamasında | Gizli |
| Güncellemede temizlik | Temizlenmez | Temizlenebilir |
| Önerilen boyut | Herhangi bir, ancak ayarlarla kontrol edilir | 100–200 MB'a kadar |
| Veri türü | Kullanıcı dosyaları | Geçici yeniden oluşturulabilir veriler |
En iyi uygulamalar belgeler dizininin kullanımı için birkaç temel kural içerir. Birincisi, bu dizinden dosyaları silmeden önce her zaman kullanıcı onayı isteyin. Önbelleğin aksine, bir belgeyi silmek kullanıcı içeriğinin geri döndürülemez kaybına yol açabilir. İkincisi, dosya sürümlemesi uygulayın: mevcut bir dosyanın üzerine yazarken, önceki sürümü _backup sonekiyle kaydedin veya Snapshot mekanizmalarını kullanın. Üçüncüsü, kullanıcıya belgeler dizininden dosyaları görüntüleme, yeniden adlandırma, silme ve dışa aktarma için bir arayüz sağlayın. iOS'ta, Documents'taki dosyalar otomatik olarak Dosyalar'da görüntülenir; Android'de, kendi dosya yöneticinizi uygulamanız veya üçüncü taraf kitaplıkları kullanmanız gerekir.
Uygulama güncellemeleri sırasında veri geçişine özellikle dikkat edin. Yeni sürüm dosya depolama yapısını değiştirirse (örneğin, verileri bir alt dizinden diğerine taşır veya dosya biçimini değiştirir), güncellemeden sonraki ilk başlatmada tek seferlik bir geçiş uygulayın. Veri şeması sürüm numarasını SharedPreferences'ta saklayın ve eşleşmezlerse geçişi çalıştırın. Geçiş tamamlanmadan önce eski dosyaları silmeyin — hata durumunda kullanıcı veri kaybetmemelidir. Geçiş biçim dönüştürme içeriyorsa (örneğin, JSON'dan SQLite'a geçiş), orijinal dosyaları geçiş tarihiyle birlikte ayrı bir dizinde yedek olarak kaydedin. Kullanıcı, Apple Human Interface Guidelines'ın önerdiği gibi, güncellemeden sonraki ilk 30 gün içinde uygulama ayarları aracılığıyla değişiklikleri geri alabilmelidir.
Sıkça Sorulan Sorular
Documents Dosyalar uygulamasında görüntülenir ve otomatik olarak iCloud'a yedeklenir. Application Support Dosyalar'da görüntülenmez ve varsayılan olarak yedeklenmez. Kullanıcıya göstermeniz gerekmeyen uygulama iç verileri için Application Support'u seçin.
Evet, bir hesabı silerken, kullanıcıya bu hesapla ilişkili tüm yerel dosyaları temizleme seçeneği sunun. “Tüm yerel veriler silinsin mi?” diye soran bir iletişim kutusu gösterin ve hangi dosyaların etkileneceğini listeleyin. Bu bir GDPR gereksinimidir ve App Store ve Google Play politikalarına uyumluluktur.
iOS'ta, cihazı bir iCloud veya iTunes yedeklemesinden geri yüklemeniz yeterlidir — Documents'taki dosyalar otomatik olarak geri yüklenir. Android'de, filesDir'deki dosyaları yedeklemek için Google Drive Backup API'sini kullanın veya bir bulut hizmeti aracılığıyla dışa aktarma uygulayın.
iOS'ta, kullanıcı Dosyalar uygulaması aracılığıyla dosyaları silebilir. Android'de silme yalnızca uygulamanızın arayüzü aracılığıyla mümkündür. Yanlışlıkla veri kaybını önlemek için, silme işleminden sonraki 30 gün içinde geri yükleme olanağına sahip bir belge çöp kutusu uygulanması önerilir.
Ek bir işlem gerekmez — iOS ve Android, App Store veya Google Play aracılığıyla güncellemeler sırasında belgeler dizinini otomatik olarak korur. Ancak, depolama yapısını değiştirirken, ayarlardaki şema sürüm numarasını kontrol ederek yeni sürümün ilk başlatmasında veri geçişi uygulayın.
Özet
context.filesDir kullanır — dosyalar güncellemeler sırasında korunur ancak yerleşik yedekleme mekanizması yokturAnahtar 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.
Ayrıca okuyun