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 เหล่านี้เป็น API ที่เรียบง่ายที่สุดในบรรดาไดเรกทอรีของกล่องทราย
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 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:) ควรถูกเรียกทันทีหลังจากทำรายการกับไฟล์ชั่วคราวเสร็จสิ้น ใช้ 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 MB ในทุกเวลา ทำความสะอาด tmp เป็นประจำ และตรวจสอบขนาดผ่าน FileManager
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม