Caches Directory คือไดเรกทอรีภายในแซนด์บ็อกซ์ของแอปพลิเคชัน iOS ที่ออกแบบมาเพื่อจัดเก็บข้อมูลชั่วคราวที่สามารถกู้คืนหรือโหลดซ้ำจากเครือข่ายได้ ตามข้อมูลของ Apple File System Basics (2024) ระบบสามารถลบไฟล์ออกจาก Caches Directory ได้ตลอดเวลาเพื่อเพิ่มพื้นที่ว่างบนดิสก์ แอปพลิเคชันต้องจัดการกับการไม่มีไฟล์เหล่านี้อย่างถูกต้องและกู้คืนเมื่อจำเป็น แตกต่างจาก Documents Directory ข้อมูลจาก Caches จะไม่รวมอยู่ในสำรองข้อมูล iCloud และ iTunes ซึ่งช่วยลดภาระบนพื้นที่จัดเก็บข้อมูลคลาวด์ของผู้ใช้
ประเด็นสำคัญ
Caches Directory คือไดเรกทอรีภายในแซนด์บ็อกซ์ของแอปพลิเคชัน 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 จะแนะนำ Swift API แต่โค้ด 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 เหมาะสมที่สุดสำหรับข้อมูลหลายประเภทที่แอปพลิเคชันใช้เพื่อเพิ่มประสิทธิภาพ แต่ไม่ใช่แหล่งข้อมูลเดียว การเลือกข้อมูลที่เหมาะสมสำหรับการแคชส่งผลโดยตรงต่อ UX และประสิทธิภาพของแอปพลิเคชัน
การตอบสนอง JSON จาก API ข้อมูลฟีดข่าว รายการอ็อบเจกต์ ทุกสิ่งที่แอปพลิเคชันสามารถดาวน์โหลดซ้ำจากเซิร์ฟเวอร์ ใช้ 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 MB สำหรับรูปภาพและ 10 MB สำหรับการตอบสนอง 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 อย่างไรก็ตาม พวกเขาสามารถล้างแคชของแอปพลิเคชันทั้งหมดผ่าน Settings > General > Storage เลือกแอปพลิเคชันเฉพาะและแตะ “Offload App” iOS ยังสามารถล้างแคชโดยอัตโนมัติเมื่อพื้นที่ไม่เพียงพอ
URLCache เป็นกลไกการแคชคำขอ HTTP ในตัวจาก Foundation มันบันทึกและโหลดการตอบสนองที่ถูกแคชโดยอัตโนมัติ ใช้ Caches Directory ภายใน การบันทึกด้วยตนเองให้การควบคุมมากขึ้น: คุณสามารถเลือกรูปแบบ เข้ารหัสข้อมูล และจัดการอายุการใช้งานของแต่ละไฟล์เป็นรายบุคคล
เมื่ออัปเดตแอปพลิเคชันผ่าน App Store Caches Directory จะถูกเก็บรักษาไว้ อย่างไรก็ตาม เนื้อหาอาจถูกลบโดยระบบหากการอัปเดตใหม่ต้องการพื้นที่มากขึ้นสำหรับการติดตั้ง นักพัฒนาไม่ควรพึ่งพาความคงอยู่ของ Caches หลังการอัปเดต นี่เป็นเหตุผลเพิ่มเติมในการใช้กลไกสำรอง
ตั้งค่า URLCache เป็น nil สำหรับเซสชัน NSURLSession เฉพาะ หรือใช้นโยบายแคช .reloadIgnoringLocalCacheData คุณยังสามารถสร้าง URLSessionConfiguration ด้วยแคชว่าง: sessionConfiguration.urlCache = nil สิ่งนี้มีประโยชน์สำหรับข้อมูลที่ต้องเป็นปัจจุบันเสมอ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม