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% من المطورين يضعون بشكل غير صحيح في Caches بيانات يجب أن تكون في Documents أو Application Support بسبب عدم فهم الفروق بين هذه الأدلة.
خاصية حرجة لـ 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 }
// 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 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: فهو آمن من حيث النوع ويتكامل بشكل أفضل مع الأطر الحديثة مثل SwiftUI و Combine.
Caches Directory مثالي لعدة فئات من البيانات التي يستخدمها التطبيق لتسريع الأداء، لكنه ليس المصدر الوحيد للحقيقة. اختيار البيانات الصحيحة للتخزين المؤقت يؤثر مباشرة على تجربة المستخدم وأداء التطبيق.
استجابات JSON من APIs، وبيانات خلاصات الأخبار، وقوائم الكائنات — كل ما يمكن للتطبيق إعادة تحميله من الخادم. استخدم URLCache للتخزين المؤقت التلقائي لاستجابات HTTP أو احفظ الكائنات المسلسلة يدوياً.
الصور التي تم تنزيلها من الشبكة هي حالة الاستخدام الأكثر شيوعاً لـ Caches Directory. المكتبات مثل SDWebImage و Kingfisher تحفظ الصور المخزنة مؤقتاً في Caches بشكل افتراضي.
| نوع البيانات | مناسب لـ Caches | فترة الاحتفاظ |
|---|---|---|
| JSON استجابات API | نعم | حتى تنظيف النظام |
| صور من الشبكة | نعم | حتى تنظيف النظام |
| سجلات التصحيح | بشروط | الأفضل في tmp |
| حفظ الألعاب | لا | Documents فقط |
| إعدادات التطبيق | لا | Application Support |
إذا كان لا يمكن استعادة البيانات، فهي ليست مكانها في Caches. هذا هو أبسط معيار: تخيل أن النظام غداً سيحذف جميع الملفات من Caches. إذا استمر التطبيق في العمل بشكل صحيح، فإن البيانات مخزنة بشكل صحيح.
iOS يدير تلقائياً تنظيف Caches Directory، لكن المحفزات والخوارزميات الدقيقة غير موثقة من قبل Apple. من المعروف أن النظام يمكنه حذف الملفات من Caches عند نقص مساحة القرص، وكذلك عند تفعيل ميزة Offload Unused Apps.
عملية التنظيف شفافة بالنسبة للتطبيق: النظام يحذف الملفات بدون إشعار. يجب على التطبيق التحقق من وجود الملف قبل القراءة وإنشائه من جديد إذا كان غائباً. عدم الاعتماد على التخزين طويل الأمد هو مطلب أساسي عند العمل مع Caches.
وفقاً لمقال Apple «File System Basics» (2024)، لا يجب على التطبيق توقع أن الملفات في Caches Directory ستكون متاحة بين الجلسات. يُنصح المطورون بتنفيذ آلية احتياطية: إذا كان ملف التخزين المؤقت مفقوداً، قم بتنزيل البيانات من الشبكة وحفظها في 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 في تطبيقك. على سبيل المثال، حد 50 ميجابايت للصور و 10 ميجابايت لاستجابات 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 }
// Enumerate and remove old files
// when exceeding size limit
}
اتباع هذه الممارسات يضمن أن التطبيق يعمل بشكل صحيح بغض النظر عن إجراءات تنظيف التخزين المؤقت للنظام، وألا يواجه المستخدمون فقداناً غير متوقع للبيانات.
الأسئلة المتكررة
لا، iOS لا يرسل إشعارات قبل حذف الملفات من Caches. عملية التنظيف شفافة تماماً للتطبيق. الطريقة الوحيدة لمعرفة الحذف هي عند محاولة قراءة ملف — FileManager يعيد nil أو يلقي خطأً، ويجب على التطبيق معالجة هذا الموقف.
ليس لدى المستخدم وصول مباشر إلى Caches Directory عبر Files أو iTunes. ومع ذلك، يمكن للمستخدم تنظيف التخزين المؤقت لجميع التطبيقات عبر الإعدادات > عام > التخزين، واختيار تطبيق معين والضغط على «إلغاء تحميل التطبيق». يمكن لـ iOS أيضاً تنظيف التخزين المؤقت تلقائياً عند نقص المساحة.
URLCache هو آلية مدمجة لتخزين طلبات HTTP من Foundation. يقوم تلقائياً بحفظ وتحميل الاستجابات المخزنة مؤقتاً، مستخدماً Caches Directory داخلياً. الحفظ اليدوي يعطي تحكماً أكبر: يمكنك اختيار التنسيق وتشفير البيانات وإدارة عمر كل ملف على حدة.
عند تحديث التطبيق عبر App Store، يتم الاحتفاظ بـ Caches Directory. ومع ذلك، قد يتم حذف المحتوى بواسطة النظام إذا كان التحديث الجديد يتطلب مساحة أكبر للتثبيت. لا يجب على المطور الاعتماد على استمرار Caches بعد التحديث — وهذا سبب إضافي لتنفيذ آلية احتياطية.
قم بتعيين URLCache إلى nil لجلسة NSURLSession محددة أو استخدم سياسة التخزين المؤقت .reloadIgnoringLocalCacheData. يمكنك أيضاً إنشاء URLSessionConfiguration مع تخزين مؤقت فارغ: sessionConfiguration.urlCache = nil. هذا مفيد للبيانات التي يجب أن تكون محدثة دائماً.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا