Sandbox คือสภาพแวดล้อมการทำงานแบบแยกส่วนสำหรับแอป iOS ซึ่งจำกัดการเข้าถึงระบบไฟล์ เครือข่าย ทรัพยากรฮาร์ดแวร์ และข้อมูลของแอปอื่น ๆ แต่ละแอปจะได้รับสภาพแวดล้อม Sandbox ของตัวเองเมื่อติดตั้ง และการดำเนินการกับไฟล์ทั้งหมดจะถูกส่งต่อไปยังพื้นที่แยกส่วนนี้โดยอัตโนมัติ ตาม Apple App Sandbox Design Guide (2026) สถาปัตยกรรมแซนด์บ็อกซ์มีพื้นฐานอยู่บนการป้องกันสามระดับ: การแยกระบบไฟล์ การควบคุมการสื่อสารระหว่างกระบวนการ และการแบ่งแยกทรัพยากรฮาร์ดแวร์พร้อมการขอสิทธิ์อย่างชัดเจนผ่าน entitlements
ประเด็นสำคัญ
Sandbox คือระบบการควบคุมการเข้าถึงแบบบังคับ (Mandatory Access Control) ที่นำไปใช้ในระดับเคอร์เนลของ iOS (XNU — ส่วนขยายเคอร์เนล Sandbox.kext) แต่ละแอปจะได้รับโปรไฟล์ Sandbox UUID ที่ไม่ซ้ำกันเมื่อเริ่มทำงาน ซึ่งกำหนดว่าอนุญาตให้แอปเข้าถึงทรัพยากรใดบ้าง
สถาปัตยกรรม Sandbox ประกอบด้วยสามองค์ประกอบหลัก: File System Isolation (แต่ละแอปมองเห็นเฉพาะคอนเทนเนอร์ของตัวเอง), Network Access Control (คำขอไปยังเครือข่ายท้องถิ่นอาจถูกจำกัด) และ Inter-Process Communication (ห้าม IPC โดยตรงกับแอปอื่น) Apple เปิดตัว Sandbox ใน iOS 2.0 และตั้งแต่นั้นมาได้เพิ่มความแข็งแกร่งของข้อจำกัดในทุกเวอร์ชันหลัก
Sandbox ไม่ใช่ตัวเลือกเสริม — แอปทั้งหมดจาก App Store ทำงานในแซนด์บ็อกซ์ นักพัฒนาไม่สามารถปิด Sandbox หรือหลีกเลี่ยงข้อจำกัดของมันได้ การพยายามเข้าถึงทรัพยากรที่ถูกห้ามจะจบลงด้วยรหัสข้อผิดพลาด EPERM (Operation not permitted) และรายการในบันทึกของระบบ
import Foundation
// พยายามเข้าถึงไฟล์ของแอปอื่น — ส่งคืน nil
let otherAppPath = "/var/mobile/Containers/Data/Application/OTHER-UUID/Documents/file.txt"
let data = try? Data(contentsOf: URL(fileURLWithPath: otherAppPath))
// data == nil — Sandbox บล็อกการเข้าถึง
// การเข้าถึงที่ถูกต้อง — ภายใน Sandbox ของตัวเอง
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
let myFileURL = documentsURL.appendingPathComponent("notes.txt")
try "Hello, Sandbox!".write(to: myFileURL, atomically: true, encoding: .utf8)
Sandbox ของแต่ละแอปใน iOS มี ไดเรกทอรีที่กำหนดไว้ล่วงหน้าหลายรายการ ซึ่งเข้าถึงได้ผ่าน API ของ Foundation ตำแหน่งบนสื่อกายภาพคือ /var/mobile/Containers/Data/Application/{UUID}/ แต่ผู้พัฒนาไม่ควรใช้เส้นทางนี้โดยตรง เพราะมัน เปลี่ยนแปลงทุกครั้งที่รีสตาร์ทอุปกรณ์ ในเวอร์ชัน iOS ที่แตกต่างกัน
ไดเรกทอรีหลักของ Sandbox: Bundle (.app — อ่านอย่างเดียว ประกอบด้วยโค้ดที่รันได้และทรัพยากร), Documents (ข้อมูลผู้ใช้ สำรองไปยัง iCloud), Library (Caches, Preferences, Application Support — มีกฎการสำรองข้อมูลที่แตกต่างกัน), tmp (ไฟล์ชั่วคราว ระบบจะลบเมื่อพื้นที่ไม่เพียงพอ) แต่ละไดเรกทอรีมีวงจรชีวิตและนโยบายการจัดเก็บของตัวเอง
เส้นทางกายภาพของ Sandbox สามารถรับได้ผ่าน NSHomeDirectory() หรือ FileManager.url(for: .documentDirectory) Apple แนะนำให้ใช้ API แบบใช้ URL เพราะมันซ่อนโครงสร้างภายในของระบบไฟล์และคงความเสถียรเมื่อ macOS Sandbox เปลี่ยนแปลงบนเดสก์ท็อป
| ไดเรกทอรี Sandbox | การรับผ่าน FileManager | สิทธิ์ |
|---|---|---|
| Documents | .documentDirectory | อ่านและเขียน |
| Bundle | Bundle.main.bundlePath | อ่านอย่างเดียว |
| Library | .libraryDirectory | อ่านและเขียน |
| tmp | NSTemporaryDirectory() | อ่านและเขียน |
| App Group | .containerURL(forSecurityApplicationGroupIdentifier:) | อ่านและเขียน |
การเข้าถึงโดยตรง ต่อระบบไฟล์ของแอปอื่นใน iOS ถูกบล็อกโดยสิ้นเชิง แม้ว่านักพัฒนาจะรู้ UUID ของคอนเทนเนอร์ของแอปอื่น Sandbox ในระดับเคอร์เนลก็จะส่งคืนข้อผิดพลาดเมื่อพยายามอ่านหรือเขียน นี่คือความแตกต่างพื้นฐานระหว่าง iOS และ macOS ที่ Sandbox มีความยืดหยุ่นมากกว่า
Apple มีกลไกที่ถูกต้องตามกฎหมายสามอย่างสำหรับการแลกเปลี่ยนข้อมูลระหว่างแอป: UIDocumentPickerViewController (ผู้ใช้เลือกไฟล์ผ่านอินเทอร์เฟซระบบ และแอปได้รับ Security-Scoped URL), Share Extension (ส่วนขยายสำหรับส่งข้อมูลไปยังแอปอื่น) และ App Groups (ไดเรกทอรีที่ใช้ร่วมกันสำหรับแอปของผู้พัฒนารายเดียวกัน)
UIDocumentPicker เป็นวิธีเดียวในการเข้าถึงไฟล์จากแอปอื่นโดยไม่ต้องตั้งค่าล่วงหน้า ผู้ใช้เลือกไฟล์อย่างชัดเจนผ่านตัวเลือกไฟล์มาตรฐานของระบบ และ iOS ให้ Security-Scoped URL ชั่วคราวแก่แอป การเข้าถึงมีผลจนกว่าจะปิดตัวเลือกไฟล์หรือจนกว่าจะเรียก stopAccessingSecurityScopedResource
Security-Scoped Bookmark คือกลไกของ iOS ที่อนุญาตให้คงการเข้าถึงไฟล์ภายนอก Sandbox ระหว่างการเริ่มทำงานของแอป เมื่อผู้ใช้เลือกไฟล์ผ่าน UIDocumentPicker แอปสามารถสร้าง bookmark จาก Security-Scoped URL และบันทึกลงใน UserDefaults หรือพื้นที่เก็บข้อมูลอื่น
ในการเริ่มทำงานครั้งถัดไป แอปจะกู้คืนการเข้าถึงผ่าน URLByResolvingBookmarkData ซึ่งส่งคืน Security-Scoped URL จากนั้นต้องเรียก startAccessingSecurityScopedResource ก่อนอ่านไฟล์ และ stopAccessingSecurityScopedResource หลังทำงานเสร็จ ความสมดุลของการเรียก เป็นสิ่งจำเป็น — ทุก start ต้องมี stop ที่สอดคล้องกัน มิฉะนั้นระบบจะใช้ขีดจำกัดทรัพยากร Security-Scoped หมด
// สร้าง Security-Scoped Bookmark
func createBookmark(for url: URL) -> Data? {
return try? url.bookmarkData(
options: .minimalBookmark,
includingResourceValuesForKeys: nil,
relativeTo: nil
)
}
// แปลงข้อมูลบุ๊กมาร์กเป็น URL
func resolveBookmark(data: Data) -> URL? {
var isStale = false
let url = try? URL.byResolvingBookmarkData(
data,
options: .withoutUI,
relativeTo: nil,
bookmarkDataIsStale: &isStale
)
if isStale {
// บุ๊กมาร์กล้าสมัย ต้องสร้างใหม่
}
return url
}
ข้อจำกัดสำคัญ: Security-Scoped Bookmarks ไม่ทำงานกับไฟล์ภายใน Sandbox ของคุณเอง — เฉพาะไฟล์ที่ได้รับผ่าน UIDocumentPicker หรือ iCloud Drive เท่านั้น bookmark ประกอบด้วยข้อมูล Security-Scoped ที่ช่วยให้ระบบระบุได้ว่าแอปใดกำลังขอสิทธิ์เข้าถึงไฟล์ใด หากใบรับรองของแอปหมดอายุหรือเปลี่ยนแปลง bookmark จะไม่ถูกต้อง
App Groups คือกลไกของ iOS ที่อนุญาตให้แอปหลายตัว (และส่วนขยายของแอป) จากผู้พัฒนารายเดียวกันใช้ไดเรกทอรี Sandbox ร่วมกันได้ หากต้องการเปิดใช้งาน ต้องเพิ่ม Capability App Groups ใน Xcode และระบุตัวระบุกลุ่มเดียวกันสำหรับแอปเป้าหมายทั้งหมด
ไดเรกทอรี App Groups ที่ใช้ร่วมกันอยู่ภายนอก Sandbox ของแต่ละแอป แต่แอปทั้งหมดในกลุ่มมี สิทธิ์เข้าถึงเต็มรูปแบบ สำหรับการอ่านและเขียน ซึ่งช่วยให้สามารถแลกเปลี่ยนไฟล์ ฐานข้อมูล (Core Data ที่มี Store URL ใน App Group) และ UserDefaults (ผ่าน initWithSuiteName) ระหว่างแอปหลัก, Today Widget, Watch Extension และ Share Extension ได้
Apple แนะนำให้ใช้ App Groups สำหรับ การซิงโครไนซ์สถานะ ระหว่างแอปและส่วนขยายของมัน ตัวอย่างเช่น Today Widget สามารถอ่านข้อมูลจากไดเรกทอรี App Groups ที่ใช้ร่วมกัน ซึ่งแอปหลักเขียนข้อมูลล่าสุดลงไป ในขณะเดียวกัน แต่ละแอปยังคงถูกแยกจาก App Groups อื่น ๆ — เฉพาะแอปที่มีตัวระบุกลุ่มเดียวกันเท่านั้นที่เข้าถึงได้
Sandbox ใน iOS กำหนด ข้อจำกัดที่เข้มงวด หลายประการที่ต้องพิจารณาระหว่างการพัฒนา ข้อหลัก: การห้ามโค้ดแบบไดนามิก (การโหลดและรันโค้ดภายนอก Sandbox), การห้ามเข้าถึงสมุดรายชื่อ ปฏิทิน และรูปภาพโดยตรงโดยไม่ได้รับอนุญาตจากผู้ใช้ (Privacy framework) และข้อจำกัดในการสร้างกระบวนการลูก (fork และ exec ถูกห้าม)
เครือข่าย: แอปสามารถเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลใดก็ได้ผ่าน TCP/UDP แต่ การเข้าถึง localhost ถูกจำกัด — แอปอื่นไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ภายในแอปของคุณได้ (ยกเว้นบิลด์สำหรับดีบัก) UDP แบบ multicast และ broadcast ก็ถูกบล็อกสำหรับแอป App Store เช่นกัน
ทรัพยากรฮาร์ดแวร์: การเข้าถึงกล้อง ไมโครโฟน ตำแหน่งทางภูมิศาสตร์ Bluetooth และ HealthKit ต้องได้รับ การอนุญาตอย่างชัดเจน จากผู้ใช้ผ่านกล่องโต้ตอบของระบบ สำหรับทรัพยากรแต่ละประเภท iOS จะใช้ entitlement แยกต่างหากและคีย์ Info.plist พร้อมคำอธิบายเหตุผล (NSPhotoLibraryUsageDescription, NSCameraUsageDescription) การขออนุญาตโดยไม่มีคำอธิบายเหตุผลใน Info.plist จะทำให้แอปปิดตัวลง
คำถามที่พบบ่อย
Sandbox คือสภาพแวดล้อมการทำงานแบบแยกส่วนสำหรับแอป iOS ซึ่งจำกัดการเข้าถึงระบบไฟล์ เครือข่าย และข้อมูลของแอปอื่น แต่ละแอปมีคอนเทนเนอร์ Sandbox ที่ไม่ซ้ำกัน การเข้าถึงถูกควบคุมในระดับเคอร์เนลของ iOS ผ่าน Sandbox.kext
แอปเข้าถึงได้: Documents (ข้อมูลผู้ใช้), Library (Caches, Preferences, Application Support), tmp (ไฟล์ชั่วคราว) และ Bundle (อ่านอย่างเดียว) ไดเรกทอรี App Group พร้อมใช้งานสำหรับแอปในกลุ่มผู้พัฒนาเดียวกัน
ผ่าน UIDocumentPickerViewController — ผู้ใช้เลือกไฟล์ผ่านอินเทอร์เฟซระบบ iOS ให้ Security-Scoped URL ซึ่งพร้อมใช้งานจนกว่าจะเรียก stopAccessingSecurityScopedResource ทางเลือกคือ Share Extension สำหรับส่งข้อมูลระหว่างแอป
Security-Scoped Bookmark คือ Data ที่คงการเข้าถึงไฟล์ภายนอก Sandbox ระหว่างการเริ่มทำงานของแอป สร้างขึ้นจาก Security-Scoped URL (ได้รับจาก UIDocumentPicker) ผ่าน bookmarkData ในการเริ่มทำงานครั้งถัดไป bookmark จะถูกกู้คืนผ่าน URLByResolvingBookmarkData
ไม่ได้ ไม่สามารถปิด Sandbox สำหรับแอปจาก App Store ได้ บนอุปกรณ์ที่เจลเบรกแล้วสามารถปิดได้ แต่ไม่เข้ากันได้กับการเผยแพร่บน App Store นักพัฒนาสามารถทดสอบโดยไม่มี Sandbox บนตัวจำลองได้ แต่อุปกรณ์จริงจะใช้ Sandbox เสมอ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม