Application Support คือไดเรกทอรีใน sandbox ของแอป iOS ที่ออกแบบมาเพื่อจัดเก็บข้อมูลเสริมที่จำเป็นสำหรับการทำงานของแอป แต่ไม่ได้ถูกสร้างขึ้นโดยผู้ใช้โดยตรง ตาม Apple File System Basics (2024) ไดเรกทอรีนี้เหมาะที่สุดสำหรับไฟล์กำหนดค่า ฐานข้อมูล SQLite ของ Core Data เอกสารที่ถูกแคช และข้อมูลอื่น ๆ ที่แอปสร้างขึ้นเอง ซึ่งแตกต่างจาก Documents Directory ตรงที่ Application Support จะไม่แสดงใน iTunes File Sharing และผู้ใช้ไม่สามารถเข้าถึงได้โดยตรง ซึ่งช่วยปกป้องข้อมูลบริการจากการถูกลบโดยไม่ตั้งใจ
ประเด็นสำคัญ
Application Support คือไดเรกทอรีใน sandbox ของแอป iOS ที่ออกแบบมาเพื่อจัดเก็บข้อมูลที่แอปสร้างและใช้สำหรับการทำงานของตัวเอง แต่ไม่ใช่เอกสารผู้ใช้ นี่คือตำแหน่งหลักสำหรับการกำหนดค่า ฐานข้อมูล เมตาดาต้าที่ถูกแคช และไฟล์เสริมอื่น ๆ
iOS กำหนดให้ Application Support เป็น ชั้นกลาง ระหว่าง Documents (ข้อมูลผู้ใช้) และ Caches (ข้อมูลชั่วคราว) ไฟล์ใน Application Support สามารถถาวรได้ แต่ผู้ใช้ไม่ควรเข้าถึงได้โดยตรง — นี่คือสิ่งที่ทำให้แตกต่างจาก Documents Directory
ตาม เอกสารสำหรับนักพัฒนา Apple (2024) Application Support เป็นตำแหน่งที่แนะนำสำหรับจัดเก็บฐานข้อมูล SQLite ของ Core Data, ไฟล์ Realm, การกำหนดค่าในรูปแบบ JSON/plist, เอกสารอ้างอิงที่ดาวน์โหลดมา และข้อมูลอื่น ๆ ที่แอปใช้แต่ผู้ใช้ไม่ได้สร้างขึ้นอย่างชัดแจ้ง
สำคัญ: โดยค่าเริ่มต้น Application Support จะถูกรวม ในการสำรองข้อมูล iCloud และ iTunes หากแอปจัดเก็บข้อมูลปริมาณมากในไดเรกทอรีนี้ที่สามารถสร้างขึ้นใหม่ได้ (เช่น คู่มือที่ดาวน์โหลดมา) คุณต้องตั้งค่าแฟล็ก isExcludedFromBackup สำหรับไฟล์ที่เกี่ยวข้อง
ใน Swift เส้นทางไปยัง Application Support Directory ได้รับผ่าน FileManager.urls(for: .applicationSupportDirectory) Apple แนะนำให้สร้างไดเรกทอรีย่อยด้วยชื่อแอปภายใน Application Support เพื่อแยกข้อมูล
import Foundation
let fileManager = FileManager.default
guard let appSupportURL = fileManager.urls(
for: .applicationSupportDirectory,
in: .userDomainMask
).first else { return }
// Create app subdirectory
let bundleID = Bundle.main.bundleIdentifier ?? "com.example.app"
let appDir = appSupportURL.appendingPathComponent(bundleID)
try fileManager.createDirectory(
at: appDir,
withIntermediateDirectories: true
)
Objective-C ใช้ NSSearchPathForDirectoriesInDomains กับ NSApplicationSupportDirectory เช่นเดียวกับ Swift แนะนำให้สร้างไดเรกทอรีย่อยด้วยชื่อแอป
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSApplicationSupportDirectory,
NSUserDomainMask,
YES
);
NSString *appSupportPath = paths.firstObject;
NSString *appDir = [appSupportPath stringByAppendingPathComponent:@"com.example.app"];
เมื่อเริ่มใช้งานครั้งแรก ไดเรกทอรี Application Support อาจไม่มีอยู่ — ต้องสร้างขึ้นโดยใช้ createDirectory(at:withIntermediateDirectories:) ซึ่งแตกต่างจาก Documents Directory ที่ระบบสร้างขึ้นโดยอัตโนมัติ
Application Support เหมาะสำหรับข้อมูลหลากหลายประเภทที่แอปใช้สำหรับการทำงานของตัวเอง การเลือกข้อมูลที่เหมาะสมสำหรับไดเรกทอรีนี้ช่วยปรับปรุงการจัดระเบียบระบบไฟล์และทำให้การสำรองข้อมูลง่ายขึ้น
ไฟล์ SQLite ของ Core Data ถูกสร้างขึ้นใน Application Support โดยค่าเริ่มต้น Realm ก็แนะนำให้วางฐานข้อมูลในไดเรกทอรีนี้เช่นกัน ซึ่งจะแยกเอกสารผู้ใช้ออกจากฐานข้อมูลภายในของแอป
ไฟล์ JSON, plist, XML พร้อมการตั้งค่าแอป, Feature Flags, เมตาดาต้าผู้ใช้ที่ถูกแคช (แต่ไม่ใช่โทเคนการตรวจสอบสิทธิ์ — ใช้ Keychain สำหรับสิ่งเหล่านั้น)
| ประเภทข้อมูล | Application Support | ทางเลือก |
|---|---|---|
| SQLite Core Data | ใช่ (ค่าเริ่มต้น) | — |
| การกำหนดค่า .plist / .json | ใช่ | UserDefaults (สำหรับแบบง่าย) |
| เอกสารอ้างอิง ที่ดาวน์โหลด | ใช่ | Documents (ถ้าสำหรับผู้ใช้) |
| บันทึก แอป | ตามเงื่อนไข | Caches (สำหรับบันทึก) |
| โทเคน การตรวจสอบสิทธิ์ | ไม่ | Keychain |
เกณฑ์การเลือก: หากข้อมูลถูกสร้างและใช้งานโดย แอป ไม่ใช่ผู้ใช้ และควรคงอยู่ระหว่างการเริ่มใช้งาน — ตำแหน่งของมันอยู่ใน Application Support
Core Data เป็นหนึ่งในผู้ใช้งานหลักของ Application Support เมื่อสร้าง NSPersistentContainer Core Data จะวางไฟล์ SQLite ใน Library/Application Support โดยอัตโนมัติด้วยชื่อที่ไม่ซ้ำกันตามชื่อโมเดล
การเข้าใจว่า Core Data จัดเก็บไฟล์ไว้ที่ไหนเป็นสิ่งสำคัญสำหรับ การโยกย้าย (migrations) การสำรองข้อมูล และการดีบัก ไฟล์หลัก: .sqlite (ข้อมูล), .sqlite-wal (บันทึกการเขียนล่วงหน้า), .sqlite-shm (หน่วยความจำที่ใช้ร่วมกัน)
import CoreData
// Create Core Data container
let container = NSPersistentContainer(name: "MyAppModel")
// Custom store URL directory
guard let appSupportURL = FileManager.default
.urls(for: .applicationSupportDirectory,
in: .userDomainMask).first else { return }
let storeURL = appSupportURL
.appendingPathComponent("MyAppModel.sqlite")
let description = NSPersistentStoreDescription(url: storeURL)
container.persistentStoreDescriptions = [description]
เมื่อใช้การซิงค์ Core Data กับ CloudKit ไฟล์ SQLite จะยังคงอยู่ใน Application Support และ CloudKit ทำหน้าที่เป็นชั้นการขนส่ง ในกรณีนี้ สิ่งสำคัญคือไม่ควรยกเว้นไฟล์จากการสำรองข้อมูล — มิฉะนั้นการซิงค์ระหว่างอุปกรณ์อาจหยุดชะงัก
ความแตกต่างระหว่าง Application Support และ Documents เป็นหนึ่งในสิ่งที่สำคัญที่สุดสำหรับการจัดโครงสร้างไฟล์แอป iOS อย่างถูกต้อง การเลือกผิดอาจทำให้ผู้ใช้ลบข้อมูลสำคัญของแอปโดยไม่ตั้งใจ หรือในทางกลับกัน ไม่สามารถหาไฟล์ของตนเองได้
| พารามิเตอร์ | Application Support | Documents Directory |
|---|---|---|
| การเข้าถึงของผู้ใช้ | ไม่มี (ซ่อน) | ผ่าน iTunes File Sharing |
| ประเภทข้อมูล | ข้อมูลบริการของแอป | เอกสารผู้ใช้ |
| การสำรองข้อมูล iCloud | ใช่ (ค่าเริ่มต้น) | ใช่ (ค่าเริ่มต้น) |
| ความเสี่ยงในการลบ | ต่ำ (ไม่มีการเข้าถึง) | ปานกลาง (ผู้ใช้เข้าถึงได้) |
| ตัวอย่าง | SQLite Core Data | PDF ที่ส่งออก |
กฎง่าย ๆ: หากผู้ใช้ควรเห็นไฟล์และสามารถลบได้ — ใช้ Documents หากไฟล์จำเป็นสำหรับการทำงานของแอปแต่ผู้ใช้ไม่จำเป็นต้องรู้ — ใช้ Application Support หากข้อมูลสามารถสร้างขึ้นใหม่ได้ — ใช้ Caches
การทำงานกับ Application Support จำเป็นต้องพิจารณาคุณสมบัติหลายประการที่ทำให้แตกต่างจากไดเรกทอรี sandbox อื่น ๆ การปฏิบัติตามแนวทางเหล่านี้ช่วยหลีกเลี่ยงการสูญเสียข้อมูล ปัญหาการโยกย้าย และพฤติกรรมแอปที่ไม่คาดคิด
ต่างจาก Documents ตรงที่ Application Support อาจไม่มีอยู่เมื่อเริ่มใช้งานครั้งแรก ใช้ createDirectory(at:withIntermediateDirectories:) ด้วยพารามิเตอร์ withIntermediateDirectories: true เพื่อรับประกันการสร้างสายโซ่ไดเรกทอรีย่อยทั้งหมด
สร้าง ไดเรกทอรีย่อยด้วย Bundle Identifier ภายใน Application Support ซึ่งจะแยกข้อมูลแอปของคุณจากแอปอื่น ๆ (แม้ว่า sandbox จะให้การแยกอยู่แล้ว) และทำให้การโยกย้ายง่ายขึ้นเมื่อเปลี่ยนผู้ให้บริการ
import Foundation
enum AppSupport {
static func ensureDirectory() throws -> URL {
let fm = FileManager.default
let baseURL = try fm.url(
for: .applicationSupportDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: true
)
let appDir = baseURL
.appendingPathComponent(Bundle.main.bundleIdentifier ?? "default")
try fm.createDirectory(at: appDir, withIntermediateDirectories: true)
return appDir
}
}
การปฏิบัติตามแนวทางเหล่านี้รับประกันว่าข้อมูลบริการของแอปถูกจัดระเบียบอย่างถูกต้อง ป้องกันจากการลบโดยไม่ตั้งใจโดยผู้ใช้ และกู้คืนได้อย่างถูกต้องจากการสำรองข้อมูล
คำถามที่พบบ่อย
ใช่ Application Support ไม่ได้ถูกสร้างขึ้นโดยอัตโนมัติเมื่อติดตั้งแอป ต่างจาก Documents และ Caches ที่ระบบสร้างขึ้นเมื่อเริ่มใช้งานครั้งแรก Application Support ต้องถูกสร้างขึ้นโดยนักพัฒนาด้วย FileManager.createDirectory(at:withIntermediateDirectories:) โดยปกติจะทำในเมธอด application(_:didFinishLaunchingWithOptions:)
ไม่ ผ่านอินเทอร์เฟซมาตรฐานของ iOS (Files, iTunes) ผู้ใช้ไม่สามารถเข้าถึง Application Support ได้ อย่างไรก็ตาม เมื่อแอปถูกลบ sandbox ทั้งหมด รวมถึง Application Support จะถูกลบออกอย่างสมบูรณ์ การสำรองข้อมูล iCloud จะคงอยู่จนกว่าจะกู้คืนหรือลบด้วยตนเอง
สำหรับวิดีโอที่ดาวน์โหลดซึ่งมีไว้สำหรับ ผู้ใช้ ควรใช้ Documents Directory เพื่อให้ผู้ใช้สามารถจัดการไฟล์เหล่านี้ผ่าน Files ได้ หากวิดีโอเป็นส่วนหนึ่งของแคชภายในของแอป (เช่น เนื้อหาการฝึกอบรมแบบออฟไลน์) สามารถใช้ Application Support กับแฟล็ก isExcludedFromBackup สำหรับไฟล์ขนาดใหญ่ได้
เพิ่ม การกำหนดเวอร์ชัน ของไดเรกทอรีย่อยภายใน Application Support เมื่ออัปเดต ให้ตรวจสอบเวอร์ชันข้อมูลปัจจุบัน และสร้างไดเรกทอรีย่อยใหม่หากจำเป็น โดยเก็บอันเก่าสำหรับการย้อนกลับ ลบไดเรกทอรีเก่าเฉพาะเมื่อยืนยันว่าผู้ใช้ทั้งหมดโยกย้ายไปยังเวอร์ชันข้อมูลใหม่สำเร็จแล้ว
ทางอ้อม — ใช่ หาก Application Support มีไฟล์ขนาดเล็กนับหมื่น FileManager.enumerator อาจทำให้การเริ่มต้นช้าลง แนะนำให้จำกัดจำนวนไฟล์ใน Application Support (ไม่เกิน 1000) และใช้ฐานข้อมูล (Core Data, Realm) แทนไฟล์แต่ละไฟล์จำนวนมากสำหรับข้อมูลที่มีโครงสร้าง
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม