Documents Directory, iOS uygulama sandbox'ı içinde, uygulama oturumları arasında kalıcı olması gereken ve kullanıcının iTunes File Sharing ve iCloud aracılığıyla erişebileceği kullanıcı verilerini depolamak için tasarlanmış bir dizindir. Apple File System Programming Guide (2024)'e göre, bu dizinin içeriği otomatik olarak iCloud ve iTunes yedeklemelerine dahil edilir, bu nedenle geliştirici hangi verileri Documents'a koyacağını bilinçli olarak seçmelidir. Caches Directory'nin aksine, Documents'taki dosyalar alan yetersizliğinde sistem tarafından silinmez — boyut yönetimi sorumluluğu uygulamaya aittir.
Önemli Noktalar
Documents Directory, iOS uygulama sandbox'ı içinde, başlatmalar arasında kalıcı olması ve kullanıcı tarafından erişilebilir olması gereken kullanıcı verilerini depolamak için tasarlanmış bir dizindir. Her uygulama kendi izole sandbox'ını alır ve Documents, Caches, tmp ve Library ile birlikte temel dizinlerden biridir.
iOS katı bir sandbox kullanır: bir uygulama, özel izinler olmadan diğer uygulamaların dosya sistemine veya sistem dizinlerine erişemez. Documents Directory, kullanıcının iTunes File Sharing aracılığıyla içeriğini görüntüleyebileceği tek dizindir (Info.plist'te UIFileSharingEnabled anahtarı etkinleştirildiğinde).
Apple WWDC 2023'e göre, App Store'daki uygulamaların %85'inden fazlası, dışa aktarılan PDF'lerden kaydedilmiş oyun dosyalarına ve dışa aktarılan görsellere kadar en az bir tür kullanıcı verisini depolamak için Documents Directory'yi kullanır.
Geliştiricinin anlaması önemlidir: Documents'taki dosyalar iCloud ve iTunes yedeklemelerine otomatik olarak dahil edilir. Bir uygulama Documents'ta büyük miktarda kurtarılabilir veri depoluyorsa (örneğin, görsel önbelleği veya geçici dosyalar), bu kullanıcının iCloud depolama alanının gereksiz yere tüketilmesine yol açar.
Swift'te, Documents Directory yolu FileManager aracılığıyla alınır. Apple, modern iOS yetenekleriyle daha iyi uyumluluk için dize tabanlı API yerine URL tabanlı API kullanılmasını önerir.
import Foundation
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
// Documents'ta dosya oluştur
let fileURL = documentsURL.appendingPathComponent("report.pdf")
let data = Data("Hello, world!".utf8)
try data.write(to: fileURL)
Objective-C, NSSearchPathForDirectoriesInDomains kullanır — URL yerine dize yolu döndüren daha eski ancak hala desteklenen bir yaklaşım.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,
NSUserDomainMask,
YES
);
NSString *documentsPath = paths.firstObject;
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"report.pdf"];
Swift'teki modern projeler FileManager.urls kullanmalıdır, çünkü bu yöntem dize yerine URL döndürür, bu da yol kodlama hataları riskini azaltır ve kodu daha tip güvenli hale getirir.
Documents Directory, kullanıcı tarafından oluşturulan veya kullanıcının açıkça ihtiyaç duyduğu veriler içindir. Apple bu dizin için uygun olan birkaç kategoriyi vurgular.
Kullanıcının oluşturduğu veya içe aktardığı dosyalar — metin belgeleri, PDF'ler, görseller, dışa aktarılan raporlar, yedek dosyaları. Bu veriler kullanıcı için doğrudan değere sahiptir ve kaybedilmeleri kritik olurdu.
Oyun kayıtları, uygulama durum dosyaları, dışa aktarılan projeler — kullanıcının uygulamayı yeniden yükledikten sonra geri yüklemeyi beklediği her şey. Ancak, kritik veriler için ayrıca iCloud Key-Value Storage veya iCloud senkronizasyonlu Core Data kullanılması önerilir.
| Veri Türü | Documents İçin Uygun | Alternatif |
|---|---|---|
| PDF ve metin belgeleri | Evet | — |
| Görsel önbelleği | Hayır | Caches Directory |
| Oyun kayıtları | Evet | iCloud KVS |
| Günlükler ve hata ayıklama verileri | Hayır | Caches veya tmp |
| Dışa aktarılan raporlar | Evet | — |
Temel kriter: veriler ağdan yeniden indirilebiliyor veya yeniden oluşturulabiliyorsa — yeri Caches'tir, Documents değil. Documents'taki her gigabayt, kullanıcının iCloud yedeklemesindeki bir gigabayttır.
iOS, cihaz iTunes'a bağlandığında veya iCloud ile senkronize edildiğinde Documents Directory içeriğini otomatik olarak yedeklemelere dahil eder. Bu davranış dizin düzeyinde devre dışı bırakılamaz — yalnızca NSURLIsExcludedFromBackupKey özniteliği aracılığıyla dosya bazında yapılabilir.
iOS 5.0'dan itibaren Apple, Documents'ta büyük miktarda kurtarılabilir veri depolayan uygulamaları reddetmeye başladı. Apple'ın önerisi: yeniden indirilebilen dosyalar, yedekleme hariç tutma bayrağıyla Caches Directory'de saklanmalıdır.
import Foundation
let documentsURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)
.first!
// Dosyayı iCloud yedeklemesinden hariç tut
var resourceValues = URLResourceValues()
resourceValues.isExcludedFromBackup = true
var fileURL = documentsURL.appendingPathComponent("cached_data.json")
try fileURL.setResourceValues(resourceValues)
iCloud senkronizasyonu, uygulama iCloud Documents kullanıyorsa NSUbiquitousContainer aracılığıyla çalışır. Bu durumda, Documents Directory'deki dosyalar kullanıcının cihazları arasında otomatik olarak senkronize edilir. iCloud'u olmayan uygulamalar için senkronizasyon yedekleme ile sınırlıdır.
Documents ve Caches arasındaki fark, yeni başlayan iOS geliştiricileri arasındaki en yaygın yanılgılardan biridir. Temel fark: sistem, alan boşaltmak için istediği zaman Caches'ten dosyaları silebilir, ancak kullanıcının bilgisi olmadan Documents'a asla dokunmaz.
| Özellik | Documents Directory | Caches Directory |
|---|---|---|
| iCloud yedeklemesi | Evet (varsayılan) | Hayır |
| Sistem tarafından silme | Asla | Alan yetersizliğinde |
| iTunes File Sharing | Evet (bayrak etkinken) | Hayır |
| Amaç | Kullanıcı verileri | Önbellek, geçici veriler |
| Veri kurtarma | Geri yükleme gerektirir | Yeniden indirilebilir |
Apple Developer Documentation (2024)'e göre, Documents Directory'nin uygunsuz kullanımı inceleme sırasında uygulama reddinin yaygın nedenlerinden biridir: bir uygulama Documents'ta birkaç megabayttan fazla kurtarılabilir veri depoluyorsa, Apple bunları Caches'e taşımayı veya NSURLIsExcludedFromBackupKey uygulamayı önerir.
Pratik bir kural: kullanıcı dosyayı kaybetmeye üzülecekse — Documents'ta saklayın. Dosya yeniden indirilebiliyor veya yeniden oluşturulabiliyorsa — Caches'te saklayın.
Deneyimli iOS geliştiricileri, uygulama yaşam döngüsünün tüm aşamalarında (geliştirmeden App Store yayınına kadar) Documents Directory ile ilgili sorunları önlemeye yardımcı olan birkaç kural geliştirmiştir.
FileManager.enumerator(at:includingPropertiesForKeys:) aracılığıyla Documents Directory boyutunu düzenli olarak kontrol edin. Kullanıcı verisi olmayan 100 MB'ı aşarsa — depolama mimarisini yeniden gözden geçirme nedenidir.
Yeniden indirilebilen tüm dosyalar için isExcludedFromBackup = true olarak ayarlayın. Bu, kullanıcının iCloud deposundaki yükü azaltır ve App Review tarafından reddedilme riskini düşürür.
Documents'taki veri biçimini değiştirirken geçiş planlayın: yeni dosyaların doğru oluşturulduğundan emin olana kadar eski dosyaları silmeyin. Sürüme özel alt dizinler kullanın.
import Foundation
let documentsURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)
.first!
let versionDir = documentsURL.appendingPathComponent("v2")
try FileManager.default.createDirectory(
at: versionDir,
withIntermediateDirectories: true
)
Bu uygulamaları takip etmek, kullanıcı verisi kaybı riskini azaltır, iCloud yedekleme boyutunu küçültür ve App Store incelemesini basitleştirir.
Sıkça Sorulan Sorular
Evet, Files (iOS 11'den itibaren yerleşik iOS uygulaması) aracılığıyla. Info.plist'te UIFileSharingEnabled anahtarı etkinleştirildiğinde, Documents Directory içeriği Dosyalar uygulamasında "iPhone'umda" bölümünde görüntülenir. Kullanıcı dosyaları görüntüleyebilir, kopyalayabilir ve silebilir.
Uygulamanın tüm sandbox'ı (Documents Directory, Caches, tmp ve Library dahil) cihazdan tamamen kaldırılır. iCloud'daki yedeklemeler, geri yükleme veya manuel silme işlemine kadar korunur. Yeniden yükleme sırasında uygulama temiz bir sandbox ile başlar.
Dizindeki tüm dosyaları dolaşmak ve boyutlarını toplamak için FileManager.enumerator kullanın. Her dosya için resourceValues(forKeys:) aracılığıyla .fileSize özniteliğini alın. Alternatif olarak, URLResourceKey.fileSizeKey ve .directoryEnumerationResults kullanın.
Varsayılan olarak, Core Data SQLite dosyasını Library/Application Support'ta oluşturur, Documents'ta değil. Veritabanını Documents'a taşımak önerilmez — iTunes File Sharing'e dahil edilir ve kullanıcı yanlışlıkla silebilir veya değiştirebilir. İstisna, uygulamanın Core Data aracılığıyla kullanıcıya açıkça veri erişimi vermesidir.
UIFileSharingEnabled (Application supports iTunes file sharing), Info.plist'teki bir boole anahtarıdır. YES olarak ayarlandığında, kullanıcılar iTunes ve Files aracılığıyla Documents Directory'den dosya kopyalayabilir. Info.plist'e anahtarı ekleyin: UIFileSharingEnabled = YES. Yalnızca uygulama gerçekten kullanıcı belgeleri oluşturuyorsa etkinleştirin.
Ö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.
Ayrıca okuyun