Caches Directory — دایرکتوری در sandbox برنامه iOS است که برای ذخیره دادههای موقتی در نظر گرفته شده که میتوانند از شبکه بازیابی یا دوباره بارگذاری شوند. بر اساس Apple File System Basics (2024)، سیستم میتواند در هر لحظه فایلها را از Caches Directory حذف کند تا فضای دیسک آزاد شود — برنامه باید عدم وجود این فایلها را به درستی مدیریت کرده و در صورت نیاز آنها را بازیابی کند. برخلاف Documents Directory، دادههای Caches در پشتیبانگیری iCloud و iTunes گنجانده نمیشوند که بار ذخیرهسازی ابری کاربر را کاهش میدهد.
نکات کلیدی
Caches Directory — دایرکتوری داخل sandbox برنامه iOS است که برای ذخیره دادههایی که در صورت نیاز قابل بازیابی هستند بهینه شده. برخلاف Documents Directory، Caches برای دادههای کاربری در نظر گرفته نشده — این یک ذخیرهسازی موقت برای سرعت بخشیدن به عملکرد برنامه است.
iOS از Caches Directory برای قرار دادن پاسخهای شبکه کش شده، تصاویر از پیش بارگذاری شده، اشیاء سریالسازی شده و دادههایی که برنامه میتواند بازیابی کند استفاده میکند. توسعهدهنده نباید به ذخیرهسازی طولانیمدت دادهها در این دایرکتوری تکیه کند.
بر اساس دادههای Apple WWDC 2020، حدود 40٪ از برنامههای iOS از Caches Directory برای ذخیره تصاویر کش شده و دادههای شبکه استفاده میکنند، در حالی که 25٪ از توسعهدهندگان به دلیل عدم درک تفاوت بین این دایرکتوریها، دادههایی را که باید در Documents یا Application Support باشند به اشتباه در Caches قرار میدهند.
ویژگی حیاتی Caches: برنامه باید وضعیتی را که فایل کش توسط سیستم حذف شده به درستی مدیریت کند. اگر پس از حذف کش عملکرد برنامه مختل شود — یعنی دادهها در دایرکتوری اشتباهی ذخیره شدهاند.
در Swift مسیر Caches Directory با استفاده از روش استاندارد FileManager با تعیین .cachesDirectory دریافت میشود. این یک عملیات ساده است که تقریباً در هر برنامه iOS که با دادههای شبکه کار میکند استفاده میشود.
import Foundation
let fileManager = FileManager.default
guard let cachesURL = fileManager.urls(
for: .cachesDirectory,
in: .userDomainMask
).first else { return }
// ذخیره JSON کش شده
let cacheFile = cachesURL.appendingPathComponent("feed_cache.json")
let jsonData = try JSONSerialization.data(
withJSONObject: response,
options: [.prettyPrinted]
)
try jsonData.write(to: cacheFile)
Objective-C از NSSearchPathForDirectoriesInDomains با NSCachesDirectory استفاده میکند. با وجود اینکه Apple API Swift را توصیه میکند، کد Objective-C با Caches Directory همچنان کارآمد و پشتیبانی میشود.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSCachesDirectory,
NSUserDomainMask,
YES
);
NSString *cachesPath = paths.firstObject;
NSString *cacheFile = [cachesPath stringByAppendingPathComponent:@"feed_cache.plist"];
پروژههای Swift باید API مبتنی بر URL را ترجیح دهند: این API از نظر نوع ایمن است و با فریمورکهای مدرنی مانند SwiftUI و Combine بهتر یکپارچه میشود.
Caches Directory برای چند دسته داده که برنامه برای سرعت بخشیدن به کار از آنها استفاده میکند بهینه است، اما تنها منبع حقیقت نیست. انتخاب صحیح دادهها برای کش کردن مستقیماً بر UX و عملکرد برنامه تأثیر میگذارد.
پاسخهای JSON از API، دادههای فید خبری، لیست اشیاء — هر چیزی که برنامه میتواند دوباره از سرور بارگیری کند. برای کش خودکار پاسخهای HTTP از URLCache استفاده کنید یا اشیاء سریالسازی شده را به صورت دستی ذخیره کنید.
تصاویر بارگیری شده از شبکه — رایجترین مورد استفاده از Caches Directory. کتابخانههایی مانند SDWebImage و Kingfisher به طور پیشفرض تصاویر کش شده را دقیقاً در Caches ذخیره میکنند.
| نوع داده | مناسب برای Caches | مدت نگهداری |
|---|---|---|
| JSON پاسخهای API | بله | تا پاکسازی سیستم |
| تصاویر از شبکه | بله | تا پاکسازی سیستم |
| لاگهای اشکالزدایی | مشروط | بهتر در tmp |
| ذخیرههای بازی | خیر | فقط Documents |
| تنظیمات برنامه | خیر | Application Support |
اگر دادهها قابل بازیابی نیستند — جای آنها در Caches نیست. این سادهترین معیار است: تصور کنید فردا سیستم تمام فایلها را از Caches حذف میکند. اگر برنامه به درستی به کار خود ادامه دهد — دادهها به درستی ذخیره شدهاند.
iOS به طور خودکار پاکسازی Caches Directory را مدیریت میکند، اما محرکها و الگوریتمهای دقیق توسط Apple مستند نشدهاند. مشخص است که سیستم میتواند هنگام کمبود فضای دیسک و همچنین در هنگام عملکرد ویژگی Offload Unused Apps فایلها را از Caches حذف کند.
فرآیند پاکسازی برای برنامه شفاف است: سیستم فایلها را بدون اطلاعرسانی حذف میکند. برنامه باید قبل از خواندن وجود فایل را بررسی کرده و در صورت نبودن آن را دوباره ایجاد کند. عدم تکیه بر ذخیرهسازی طولانیمدت — الزام کلیدی در کار با Caches است.
بر اساس مقاله Apple "File System Basics" (2024)، برنامه نباید روی در دسترس بودن فایلهای Caches Directory بین جلسات حساب کند. به توسعهدهندگان توصیه میشود مکانیزم fallback را پیادهسازی کنند: در صورت نبودن فایل کش — دادهها را از شبکه بارگیری کرده و دوباره در Caches ذخیره کنید.
سناریوی جداگانه — تخلیه برنامه (Offload). هنگام فعال شدن این ویژگی، iOS برنامه را حذف میکند اما Documents Directory آن را حفظ میکند. Caches Directory در این فرآیند حذف میشود. کاربری که برنامه را بازیابی کرده دادههای کش شده را دریافت نخواهد کرد — برنامه باید آنها را دوباره بارگیری کند.
تفاوت بین Caches و Temporary (tmp) اغلب باعث سردرگمی در بین توسعهدهندگان میشود. هر دو دایرکتوری دادههای موقت را ذخیره میکنند، اما با تضمینهای متفاوت طول عمر و هدف.
| ویژگی | Caches Directory | Temporary Directory |
|---|---|---|
| طول عمر | از جلسه به جلسه (تضمین نشده) | فقط در چارچوب جلسه |
| پاکسازی توسط سیستم | هنگام کمبود فضا | پایان جلسه یا راهاندازی مجدد |
| هدف | کش برای سرعت بخشیدن به کار | دادههای بسیار موقت |
| مثال | تصاویر کش شده | فایل موقت قبل از خروجی |
| پشتیبانگیری | خیر | خیر |
Caches را انتخاب کنید اگر دادهها برای نگهداری بین راهاندازیهای برنامه مفید هستند اما قابل بازیابی میباشند. از tmp استفاده کنید اگر دادهها فقط در جلسه جاری مورد نیاز هستند و پس از پایان برنامه ارزشی ندارند.
کار با Caches Directory نیازمند رعایت چند قانون است که به جلوگیری از از دست دادن دادهها، رفتار غیرمنتظره برنامه و مشکلات عملکرد کمک میکند.
FileManager.fileExists(atPath:) باید قبل از هر خواندن از Caches فراخوانی شود. اگر فایل وجود ندارد — دادهها را از منبع اصلی بارگیری کرده و در کش ذخیره کنید. هرگز تصور نکنید که فایل از Caches وجود دارد.
تعیین کنید حداکثر اندازه Caches Directory در برنامه. به عنوان مثال، محدودیت ۵۰ مگابایت برای تصاویر و ۱۰ مگابایت برای پاسخهای JSON. هنگام تجاوز از محدودیت، قدیمیترین فایلها را بر اساس تاریخ تغییر حذف کنید.
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 }
// شمارش و حذف فایلهای قدیمی
// هنگام تجاوز از محدودیت اندازه
}
رعایت این روشها تضمین میکند که برنامه در هرگونه اقدام سیستم برای پاکسازی کش به درستی کار کند و کاربر با از دست دادن غیرمنتظره دادهها مواجه نشود.
سوالات متداول
خیر، iOS قبل از حذف فایلها از Caches اعلانی ارسال نمیکند. فرآیند پاکسازی کاملاً برای برنامه شفاف است. تنها راه اطلاع از حذف — هنگام تلاش برای خواندن فایل، FileManager nil برمیگرداند یا خطا پرتاب میکند و برنامه باید این وضعیت را مدیریت کند.
دسترسی مستقیم به Caches Directory از طریق Files یا iTunes کاربر ندارد. با این حال، کاربر میتواند کش همه برنامهها را از طریق تنظیمات > عمومی > ذخیرهگاه با انتخاب برنامه خاص و فشار دادن "تخلیه برنامه" پاک کند. همچنین iOS میتواند به طور خودکار کش را هنگام کمبود فضا پاک کند.
URLCache — یک مکانیزم داخلی کش کردن درخواستهای HTTP از Foundation است. این مکانیزم به طور خودکار پاسخهای کش شده را ذخیره و بارگیری میکند و از Caches Directory در پشت صحنه استفاده میکند. ذخیره دستی کنترل بیشتری میدهد: میتوان فرمت را انتخاب کرد، دادهها را رمزنگاری نمود و طول عمر هر فایل را به صورت جداگانه مدیریت کرد.
در هنگام بهروزرسانی برنامه از طریق App Store، Caches Directory حفظ میشود. با این حال، اگر بهروزرسانی جدید برای نصب به فضای بیشتری نیاز داشته باشد، محتوا ممکن است توسط سیستم حذف شود. توسعهدهنده نباید به حفظ Caches پس از بهروزرسانی تکیه کند — این دلیل اضافی برای پیادهسازی مکانیزم fallback است.
URLCache را برای جلسه خاص NSURLSession nil قرار دهید یا از سیاست کش .reloadIgnoringLocalCacheData استفاده کنید. همچنین میتوانید پیکربندی URLSessionConfiguration با کش خالی ایجاد کنید: sessionConfiguration.urlCache = nil. این برای دادههایی که همیشه باید بهروز باشند مفید است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید