Temporary Directory (tmp) — این یک دیرکتوری در سندباکس برنامه iOS برای ذخیره دادههای بسیار کوتاهمدت است که فقط در جلسه فعلی برنامه مورد نیاز هستند. به استناد Apple File System Programming Guide (2024)، سیستم میتواند tmp را در هر پایان برنامه یا در هنگام راهاندازی مجدد دستگاه پاک کند. به عکس Caches Directory، فایلهای موقت در tmp برای ذخیره بین بارهای اجرا طراحی نشدهاند — توسعهدهنده باید پس از استفاده آنها را صریحاً حذف کند تا فضای دیسک اشغال نشود.
نکات کلیدی
Temporary Directory (همچنین به عنوان tmp شناخته میشود) — این یک دیرکتوری در داخل سندباکس برنامه iOS است که برای ذخیره دادههایی طراحی شده که عمر آنها به جلسه فعلی محدود است. این کوتاهمدتترین ذخیره در میان تمام دیرکتوریهای سندباکس است.
iOS tmp را برای عملیاتی فراهم میکند که نیازمند واسطهای ذخیره فایل هستند: دانلود فایل قبل از انتقال به Documents، ایجاد کپی موقت قبل از خروجی، بافر کردن دادههای جریانی. پس از تکمیل عملیات، فایلهای موقت باید حذف شوند.
به استناد Apple Developer Documentation (2024)، دیرکتوری tmp منحصر به فرد است زیرا مسیر آن میتواند بین بارهای اجرای برنامه تغییر کند. iOS در هر بار اجرا یک مسیر جدید برای tmp تولید میکند — این تضمین میکند که دادههای جلسه قبلی به طور تصادفی خوانده نشوند. توسعهدهنده هرگز نباید مسیر tmp را بین بارهای اجرا ذخیره کند.
مهم: به عکس Caches Directory، که دادهها میتوانند چند بار اجرا را دوام آورند، tmp ذخیره دادهها را بین جلسات در درازمدت تضمین نمیکند. این قابل اعتمادترین راه برای ذخیره دادههای واقعاً موقت است.
در Swift برای دریافت مسیر tmp از تابع سراسری NSTemporaryDirectory() یا FileManager.temporaryDirectory استفاده میشود. این سادهترین API در میان تمام دیرکتوریهای سندباکس است.
import Foundation
// گزینه 1: NSTemporaryDirectory()
let tempDir = NSTemporaryDirectory()
let tempFile = (tempDir as NSString)
.appendingPathComponent("export_temp.pdf")
// گزینه 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 Tech Note 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:) باید بلافاصله پس از تکمیل عملیات با فایل موقت فراخوانی شود. در Swift از defer برای حذف تضمینی حتی در صورت بروز خطا استفاده کنید.
import Foundation
let tempURL = FileManager.default
.temporaryDirectory
.appendingPathComponent("upload_temp.dat")
defer {
try? FileManager.default.removeItem(at: tempURL)
}
// کار با فایل موقت
try "temporary data".write(to: tempURL, atomically: true)
// ... عملیات فایل ...
// defer با خروج از احاطه اجرا میشود
اگر دادهها ممکن است یک ساعت پس از ایجاد مورد نیاز باشند — آنها را در Caches یا Application Support ذخیره کنید. tmp برای عملیات دقیقهای طراحی شده، نه برای ذخیره.
رعایت این قواعد تضمین میکند که فایلهای موقت انباشته نشوند، فضای دیسک بهینه استفاده شود و برنامه به طور صحیح با هر سناریو پاکسازی سیستم فایل iOS برخورد کند.
سوالات متداول
معمولاً مسیر در یک جلسه تغییر نمیکند، اما iOS تضمینی نمیدهد. در موارد نادر، سیستم میتواند tmp را هنگام انتقال برنامه از پسزمینه به وضعیت فعال تغییر دهد. بنابراین Apple توصیه میکند مسیر tmp را در هر مراجعه از طریق NSTemporaryDirectory() به دست آورید، نه آن را در یک متغیر ذخیره کنید.
فایلها انباشته میشوند و فضای دیسک را اشغال میدهند. iOS میتواند tmp را در راهاندازی مجدد دستگاه پاک کند، اما تا آن زمان برنامه فضای دیسک را به هدر میدهد. در صورت انباشت قابل توجه، کاربر میتواند در تنظیمات ذخیره ببیند که برنامه فضای زیادی را اشغال کرده است.
بله، میتوانید از DataProtectionType با NSFileProtectionComplete برای فایلهای موقت حاوی دادههای حساس استفاده کنید. اما به یاد داشته باشید: اگر فایل فقط در جلسه فعلی خوانده میشود و سپس حذف میگردد — تشفیر ممکن است اضافی باشد. نیاز به تشفیر را بر اساس نوع داده ارزیابی کنید.
برای تولید یک شناسه یکتا از ProcessInfo.processInfo.globallyUniqueString یا UUID().uuidString استفاده کنید. FileManager همچنین روش urlForCreatingTemporaryFile را ارائه میدهد که به طور خودکار یک نام یکتا در tmp تولید میکند. این عدم وجود تصادف را در نوشتن همزمان تضمین میکند.
به طور غیرمستقیم — بله. Apple به اندازه کل دادههایی که برنامه روی دیسک ذخیره میکند توجه میکند. اگر tmp شامل گیگابایت فایلهای حذف نشده باشد، بررسی کننده میتواند برنامه را رد کند. حد توصیه شده برای tmp — حداکثر 100 مگابایت در هر لحظه. منظماً tmp را پاک کنید و اندازه آن را از طریق FileManager بررسی کنید.
نتیجهگیری
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید