Caches Directory, iOS uygulamasının sandbox’ında bulunan ve ağdan geri yüklenebilecek veya yeniden yüklenebilecek geçici verileri depolamak için tasarlanmış bir dizindir. Apple File System Basics (2024)’e göre sistem, disk alanı boşaltmak için Caches Directory’den dosyaları herhangi bir zamanda silebilir. Uygulama, bu dosyaların yokluğunu doğru şekilde ele almalı ve gerektiğinde bunları geri yüklemelidir. Documents Directory’nin aksine, Caches’teki veriler iCloud ve iTunes yedeklemelerine dahil edilmez, bu da kullanıcının bulut deposu üzerindeki yükü azaltır.
Anahtar Noktalar
Caches Directory, iOS uygulama sandbox’ı içinde, gerektiğinde geri yüklenebilecek verileri depolamak için optimize edilmiş bir dizindir. Documents Directory’nin aksine Caches, kullanıcı verileri için değil, uygulama performansını hızlandırmak için geçici bir depolama alanıdır.
iOS, önbelleğe alınmış ağ yanıtlarını, önceden yüklenmiş görselleri, serileştirilmiş nesneleri ve uygulamanın geri yükleyebileceği verileri depolamak için Caches Directory’yi kullanır. Geliştiriciler bu dizinde uzun süreli veri depolamaya güvenmemelidir.
Apple WWDC 2020’ye göre, iOS uygulamalarının yaklaşık %40’ı önbelleğe alınmış görselleri ve ağ verilerini depolamak için Caches Directory’yi kullanırken, geliştiricilerin %25’i bu dizinler arasındaki farkları anlamadıkları için Documents veya Application Support’ta olması gereken verileri yanlışlıkla Caches’e yerleştirmektedir.
Caches’in kritik bir özelliği: uygulama, sistem tarafından bir önbellek dosyası silindiğinde bu durumu doğru şekilde ele almalıdır. Önbelleği kaldırmak uygulama işlevselliğini bozuyorsa, veriler yanlış dizinde depolanıyor demektir.
Swift’te, Caches Directory yoluna .cachesDirectory ile standart FileManager yöntemi kullanılarak erişilir. Bu, ağ verileriyle çalışan hemen her iOS uygulamasında kullanılan basit bir işlemdir.
import Foundation
let fileManager = FileManager.default
guard let cachesURL = fileManager.urls(
for: .cachesDirectory,
in: .userDomainMask
).first else { return }
// Save cached JSON
let cacheFile = cachesURL.appendingPathComponent("feed_cache.json")
let jsonData = try JSONSerialization.data(
withJSONObject: response,
options: [.prettyPrinted]
)
try jsonData.write(to: cacheFile)
Objective-C, NSCachesDirectory ile NSSearchPathForDirectoriesInDomains’i kullanır. Apple Swift API’sini önermesine rağmen, Caches Directory ile Objective-C kodu çalışmaya devam eder ve desteklenir.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSCachesDirectory,
NSUserDomainMask,
YES
);
NSString *cachesPath = paths.firstObject;
NSString *cacheFile = [cachesPath stringByAppendingPathComponent:@"feed_cache.plist"];
Swift projeleri URL tabanlı API’yi tercih etmelidir: tür güvenlidir ve SwiftUI ve Combine gibi modern framework’lerle daha iyi entegre olur.
Caches Directory, uygulamanın performansı hızlandırmak için kullandığı birkaç veri kategorisi için idealdir, ancak tek bilgi kaynağı değildir. Önbelleğe almak için doğru verileri seçmek, UX’i ve uygulama performansını doğrudan etkiler.
API’lerden JSON yanıtları, haber akışı verileri, nesne listeleri. Uygulamanın sunucudan yeniden indirebileceği her şey. HTTP yanıtlarının otomatik önbelleğe alınması için URLCache kullanın veya serileştirilmiş nesneleri manuel olarak kaydedin.
Ağdan indirilen görseller, Caches Directory’nin en yaygın kullanım durumudur. SDWebImage ve Kingfisher gibi kütüphaneler, varsayılan olarak önbelleğe alınmış görselleri Caches’e kaydeder.
| Veri Türü | Caches için Uygun | Saklama Süresi |
|---|---|---|
| JSON API yanıtları | Evet | Sistem temizliğine kadar |
| Ağdaki görseller | Evet | Sistem temizliğine kadar |
| Hata ayıklama günlükleri | Koşullu | tmp’de daha iyi |
| Oyun kayıtları | Hayır | Sadece Documents |
| Uygulama yapılandırmaları | Hayır | Application Support |
Veriler geri yüklenemiyorsa, Caches’e ait değillerdir. Bu en basit kriterdir: yarın sistemin Caches’teki tüm dosyaları sileceğini hayal edin. Uygulama doğru şekilde çalışmaya devam ediyorsa, veriler doğru şekilde depolanmıştır.
iOS, Caches Directory temizliğini otomatik olarak yönetir, ancak kesin tetikleyiciler ve algoritmalar Apple tarafından belgelenmemiştir. Sistemin, disk alanı azaldığında ve Offload Unused Apps özelliği etkin olduğunda Caches’ten dosyaları silebildiği bilinmektedir.
Temizleme süreci uygulama için şeffaftır: sistem bildirim yapmadan dosyaları siler. Uygulama, okumadan önce dosyanın varlığını kontrol etmeli ve yoksa yeniden oluşturmalıdır. Uzun süreli depolamaya güvenmemek, Caches ile çalışırken temel bir gerekliliktir.
Apple’ın “File System Basics” (2024) makalesine göre, uygulama Caches Directory’deki dosyaların oturumlar arasında kullanılabilir olmasını beklememelidir. Geliştiricilere bir yedekleme mekanizması uygulamaları önerilir: önbellekteki bir dosya eksikse, verileri ağdan indirin ve tekrar Caches’e kaydedin.
Ayrı bir senaryo da uygulama boşaltma (Offload) işlemidir. Bu özellik etkinleştirildiğinde, iOS uygulamayı kaldırır ancak Documents Directory’sini korur. Caches Directory bu işlem sırasında silinir. Uygulamayı geri yükleyen bir kullanıcı, önbelleğe alınmış verilere sahip olmaz. Uygulama bunları yeniden indirmelidir.
Caches ve Temporary (tmp) dizinleri arasındaki fark, geliştiriciler arasında sık sık kafa karışıklığına neden olur. Her iki dizin de geçici verileri depolar, ancak farklı yaşam süresi garantileri ve amaçlarla.
| Özellik | Caches Directory | Temporary Directory |
|---|---|---|
| Yaşam süresi | Oturumdan oturuma (garantili değil) | Sadece bir oturum içinde |
| Sistem temizliği | Alan azaldığında | Oturum sonunda veya yeniden başlatmada |
| Amaç | Performansı hızlandırmak için önbellek | Çok geçici veriler |
| Örnek | Önbelleğe alınmış görseller | Dışa aktarmadan önce geçici dosya |
| Yedekleme | Hayır | Hayır |
Uygulama başlatmaları arasında veri saklamak faydalıysa ancak geri yüklenebiliyorsa Caches’i seçin. Veriler sadece mevcut oturumda gerekiyorsa ve uygulama sonlandıktan sonra değeri yoksa tmp kullanın.
Caches Directory ile çalışmak, veri kaybını, beklenmeyen uygulama davranışını ve performans sorunlarını önlemeye yardımcı olan birkaç kurala uymayı gerektirir.
FileManager.fileExists(atPath:), Caches’ten her okumadan önce çağrılmalıdır. Dosya eksikse, verileri kaynaktan yükleyin ve önbelleğe kaydedin. Caches’te bir dosyanın var olduğunu asla varsaymayın.
Uygulamanızda Caches Directory için maksimum bir boyut belirleyin. Örneğin, görseller için 50 MB ve JSON yanıtları için 10 MB sınırı. Sınır aşıldığında, değiştirme tarihine göre en eski dosyaları silin.
import Foundation
func trimCache(to maxSizeBytes: Int) {
let cachesURL = FileManager.default
.urls(for: .cachesDirectory, in: .userDomainMask)
.first!
guard let enumerator = FileManager.default
.enumerator(
at: cachesURL,
includingPropertiesForKeys: [.fileSizeKey, .contentModificationDateKey]
)
else { return }
// Enumerate and remove old files
// when exceeding size limit
}
Bu uygulamaları takip etmek, sistem önbellek temizleme eylemlerinden bağımsız olarak uygulamanın doğru çalışmasını ve kullanıcıların beklenmedik veri kaybıyla karşılaşmamasını sağlar.
Sıkça Sorulan Sorular
Hayır, iOS, Caches’ten dosyaları silmeden önce bildirim göndermez. Temizleme süreci uygulama için tamamen şeffaftır. Silme işleminden haberdar olmanın tek yolu, bir dosyayı okumaya çalışmaktır. FileManager nil döndürür veya hata verir ve uygulama bu durumu ele almalıdır.
Kullanıcıların Files veya iTunes aracılığıyla Caches Directory’ye doğrudan erişimi yoktur. Ancak, Ayarlar > Genel > Depolama üzerinden tüm uygulamaların önbelleğini temizleyebilir, belirli bir uygulamayı seçip “Uygulamayı Boşalt” düğmesine dokunabilirler. iOS, alan yetersiz olduğunda önbelleği otomatik olarak da temizleyebilir.
URLCache, Foundation’dan HTTP istek önbelleğe alma için yerleşik bir mekanizmadır. Önbelleğe alınmış yanıtları otomatik olarak kaydeder ve yükler, içte Caches Directory’yi kullanır. Manuel kaydetme daha fazla kontrol sağlar: biçimi seçebilir, verileri şifreleyebilir ve her dosyanın ömrünü bireysel olarak yönetebilirsiniz.
Uygulama App Store üzerinden güncellendiğinde, Caches Directory korunur. Ancak, yeni güncelleme kurulum için daha fazla alan gerektiriyorsa içerik sistem tarafından silinebilir. Geliştirici, güncelleme sonrası Caches’in kalıcılığına güvenmemelidir. Bu, yedekleme mekanizması uygulamak için ek bir nedendir.
Belirli bir NSURLSession oturumu için URLCache’i nil olarak ayarlayın veya .reloadIgnoringLocalCacheData önbellek politikasını kullanın. Boş önbellekle bir URLSessionConfiguration da oluşturabilirsiniz: sessionConfiguration.urlCache = nil. Bu, her zaman güncel olması gereken veriler için kullanışlı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.
Ayrıca okuyun