Temporary Directory (tmp) هو دليل داخل صندوق الحماية (sandbox) لتطبيق iOS لتخزين البيانات قصيرة المدى للغاية التي تكون مطلوبة فقط خلال جلسة العمل الحالية للتطبيق. وفقاً لـ Apple File System Programming Guide (2024)، يمكن للنظام مسح tmp عند كل إنهاء للتطبيق أو عند إعادة تشغيل الجهاز. على عكس Caches Directory، الملفات المؤقتة في tmp ليست مخصصة للتخزين بين عمليات التشغيل — يجب على المطور حذفها صراحةً بعد الاستخدام لتجنب إهدار مساحة القرص.
الخلاصة
Temporary Directory (المعروف أيضاً باسم tmp) هو دليل داخل صندوق الحماية لتطبيق iOS مصمم لتخزين البيانات التي يكون عمرها محدوداً بالجلسة الحالية. إنه التخزين الأقصر عمراً بين جميع أدلة صندوق الحماية.
يوفر iOS tmp للعمليات التي تتطلب تخزيناً وسيطاً للملفات: تنزيل ملف قبل نقله إلى Documents، إنشاء نسخة مؤقتة قبل التصدير، تخزين بيانات البث مؤقتاً. بعد اكتمال العملية، يجب حذف الملفات المؤقتة.
وفقاً لوثائق Apple Developer (2024)، دليل tmp فريد من نوعه لأن مساره يمكن أن يتغير بين عمليات تشغيل التطبيق. ينشئ iOS مساراً جديداً لـ tmp عند كل تشغيل — وهذا يضمن عدم قراءة بيانات الجلسة السابقة عن طريق الخطأ. يجب على المطور أبداً حفظ مسار tmp بين عمليات التشغيل.
من المهم: على عكس Caches Directory، حيث يمكن للبيانات البقاء عبر عدة عمليات تشغيل، فإن tmp لا يحتفظ بالبيانات بين الجلسات على المدى الطويل. إنها الطريقة الأكثر موثوقية لتخزين البيانات المؤقتة حقاً.
في Swift، للحصول على المسار إلى tmp يتم استخدام الدالة العامة NSTemporaryDirectory() أو FileManager.temporaryDirectory. هذه هي أبسط واجهات برمجة التطبيقات بين جميع أدلة صندوق الحماية.
import Foundation
// Option 1: NSTemporaryDirectory()
let tempDir = NSTemporaryDirectory()
let tempFile = (tempDir as NSString)
.appendingPathComponent("export_temp.pdf")
// Option 2: FileManager.temporaryDirectory (URL)
let tempURL = FileManager.default.temporaryDirectory
let exportURL = tempURL.appendingPathComponent("export_temp.pdf")
يستخدم Objective-C نفس الدالة العامة NSTemporaryDirectory(). النتيجة هي سلسلة نصية تحتوي على المسار الكامل للدليل المؤقت للتطبيق.
@import Foundation;
NSString *tempDir = NSTemporaryDirectory();
NSString *tempFile = [tempDir stringByAppendingPathComponent:@"temp_data.bin"];
الفرق الرئيسي عن الأدلة الأخرى: NSTemporaryDirectory() لا تتطلب تحديد نطاق أو قناع بحث — إنها دالة عامة. ومع ذلك، قد يتغير المسار عند التشغيل التالي، لذلك لا تحفظه أبداً في UserDefaults أو أي تخزين دائم.
Temporary Directory مخصص لمجموعة محددة بدقة من السيناريوهات. غالباً ما يخلط المطورون بين tmp و Caches، واضعين في tmp بيانات يجب أن تعيش لأكثر من جلسة واحدة. دعنا نلقي نظرة على حالات الاستخدام الصحيحة.
الملفات التي يتم إنشاؤها أثناء تصدير البيانات: نسخة مؤقتة من تقرير قبل إرساله بالبريد الإلكتروني، أرشيف مضغوط قبل التحميل، ملف وسيط لتحويل التنسيق. بعد اكتمال التصدير، يجب حذف الملف.
مخازن مؤقتة لتسجيل الصوت أو الفيديو أو بيانات البث التي تتم معالجتها في الوقت الفعلي. على سبيل المثال، تسجيل صوتي قبل الحفظ في التخزين الدائم، أو تخزين فيديو مؤقت أثناء البث.
| السيناريو | الدليل | المبرر |
|---|---|---|
| تصدير PDF قبل الإرسال | tmp | الملف غير مطلوب بعد الإرسال |
| تخزين الصور مؤقتاً | Caches | مفيد بين الجلسات |
| تنزيل ملف قبل النقل | tmp | تخزين وسيط |
| سجلات الجلسة | tmp | ذات صلة فقط أثناء الجلسة |
| تحرير مستند | tmp | نسخة قبل الحفظ |
إذا كانت البيانات مطلوبة فقط هنا والآن — استخدم tmp. إذا كانت قد تكون مفيدة في الجلسة التالية — استخدم Caches. إذا كان فقدان البيانات غير مقبول — استخدم Documents.
iOS يدير دورة حياة tmp بشكل مختلف عن أدلة صندوق الحماية الأخرى. فهم هذه الدورة أمر بالغ الأهمية لتصميم تخزين ملفات مناسب في التطبيق.
عند كل تشغيل للتطبيق، قد يخصص iOS مساراً جديداً لـ tmp. يصبح المسار السابق غير قابل للوصول، على الرغم من أن الملفات الفعلية قد تبقى على القرص حتى إعادة تشغيل الجهاز. لهذا السبب توصي Apple بشدة بعدم حفظ مسار tmp بين الجلسات.
وفقاً لملاحظة Apple الفنية TN2150 (2024)، يمكن للنظام مسح tmp في الحالات التالية: إعادة تشغيل الجهاز، الوصول إلى حد مساحة القرص، تفريغ التطبيق (Offload). على عكس Caches، tmp غير مصمم لتخزين البيانات حتى عبر عدة عمليات تشغيل — إنه التخزين الأقل موثوقية في صندوق الحماية.
يجب على المطور حذف الملفات المؤقتة صراحةً بعد إكمال العملية باستخدام FileManager.removeItem(at:). الملفات غير المحذوفة في tmp تتراكم وتهدر مساحة القرص — iOS لا يضمن تنظيفها التلقائي في المستقبل القريب.
مقارنة tmp و Caches تساعد المطورين على اتخاذ القرار الصحيح عند اختيار دليل للتخزين. الاختيار الخاطئ يمكن أن يؤدي إما إلى فقدان مبكر للبيانات أو استهلاك غير ضروري للمساحة.
| المعلمة | Temporary Directory | Caches Directory |
|---|---|---|
| العمر | الجلسة الحالية فقط | بين الجلسات (بدون ضمانات) |
| تغير المسار | قد يتغير كل تشغيل | مسار ثابت |
| التنظيف التلقائي | عند إعادة التشغيل، عند التفريغ | عند نقص المساحة |
| حذف المطور | إلزامي بعد العملية | موصى به عند تجاوز الحد |
| الاستخدام | العمليات الوسيطة | ذاكرة تخزين مؤقت دائمة |
قاعدة عملية: اختر tmp للبيانات التي سيتم حذفها في غضون ثوانٍ أو دقائق بعد الإنشاء. اختر Caches للبيانات التي من المفيد الاحتفاظ بها لساعات أو أيام بين الجلسات ولكن يمكن إعادة إنشائها.
العمل مع Temporary Directory يتطلب انضباطاً: نظراً لأن البيانات في tmp قصيرة العمر وتراكمها يمكن أن يؤدي إلى إهدار المساحة، يجب على المطورين اتباع عدة ممارسات رئيسية.
FileManager.removeItem(at:) يجب استدعاؤه فوراً بعد الانتهاء من العملية مع الملف المؤقت. استخدم defer في Swift لضمان الحذف حتى في حالة حدوث خطأ.
import Foundation
let tempURL = FileManager.default
.temporaryDirectory
.appendingPathComponent("upload_temp.dat")
defer {
try? FileManager.default.removeItem(at: tempURL)
}
// Work with temp file
try "temporary data".write(to: tempURL, atomically: true)
// ... file operation ...
// defer executes when scope exits
إذا كانت البيانات قد تكون مطلوبة بعد ساعة من إنشائها — قم بحفظها في Caches أو Application Support. tmp مصمم للعمليات التي تستغرق دقائق، وليس للتخزين.
اتباع هذه القواعد يضمن أن الملفات المؤقتة لا تتراكم، وأن مساحة القرص تستخدم بكفاءة، وأن التطبيق يتعامل بشكل صحيح مع أي سيناريوهات لتنظيف نظام ملفات iOS.
الأسئلة الشائعة
عادةً لا يتغير المسار ضمن جلسة واحدة، لكن iOS لا يضمن ذلك. في حالات نادرة، قد يغير النظام tmp عند انتقال التطبيق من الخلفية إلى المقدمة. لهذا توصي Apple باستدعاء NSTemporaryDirectory() في كل مرة تحتاج فيها المسار بدلاً من تخزينه في متغير.
الملفات ستتراكم وتشغل مساحة على القرص. قد يمسح iOS tmp عند إعادة تشغيل الجهاز، لكن حتى ذلك الحين سيهدر التطبيق مساحة القرص. مع التراكم الكبير، قد يرى المستخدم في إعدادات التخزين أن التطبيق يشغل مساحة كبيرة.
نعم، يمكنك استخدام DataProtectionType مع NSFileProtectionComplete للملفات المؤقتة التي تحتوي على بيانات حساسة. لكن ضع في اعتبارك: إذا كان الملف سيُقرأ فقط ضمن الجلسة الحالية ثم يُحذف، فقد يكون التشفير مبالغاً فيه. قيّم الحاجة إلى التشفير بناءً على نوع البيانات.
استخدم ProcessInfo.processInfo.globallyUniqueString لتوليد معرف فريد، أو UUID().uuidString. يوفر FileManager أيضاً طريقة urlForCreatingTemporaryFile التي تنشئ تلقائياً اسماً فريداً في tmp. هذا يضمن عدم وجود تعارضات أثناء الكتابة المتوازية.
بشكل غير مباشر — نعم. Apple تهتم بالحجم الإجمالي للبيانات التي يخزنها التطبيق على القرص. إذا كان tmp يحتوي على غيغابايت من الملفات غير المحذوفة، قد يرفض المراجع التطبيق. الحد الموصى به لـ tmp هو لا يزيد عن 100 ميجابايت في أي وقت. نظف tmp بانتظام وتحقق من حجمه عبر FileManager.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا