Sandbox — คืออะไร หลักการแยกสภาพแวดล้อม และระบบไฟล์

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-07-09 เวลาอ่าน: 10 นาที

Sandbox คือสภาพแวดล้อมการทำงานแบบแยกส่วนสำหรับแอป iOS ซึ่งจำกัดการเข้าถึงระบบไฟล์ เครือข่าย ทรัพยากรฮาร์ดแวร์ และข้อมูลของแอปอื่น ๆ แต่ละแอปจะได้รับสภาพแวดล้อม Sandbox ของตัวเองเมื่อติดตั้ง และการดำเนินการกับไฟล์ทั้งหมดจะถูกส่งต่อไปยังพื้นที่แยกส่วนนี้โดยอัตโนมัติ ตาม Apple App Sandbox Design Guide (2026) สถาปัตยกรรมแซนด์บ็อกซ์มีพื้นฐานอยู่บนการป้องกันสามระดับ: การแยกระบบไฟล์ การควบคุมการสื่อสารระหว่างกระบวนการ และการแบ่งแยกทรัพยากรฮาร์ดแวร์พร้อมการขอสิทธิ์อย่างชัดเจนผ่าน entitlements

ประเด็นสำคัญ

  • Sandbox — ระบบไฟล์แบบแยกส่วนและสภาพแวดล้อมการทำงาน เฉพาะสำหรับแต่ละแอป iOS
  • แต่ละแอป มีไดเรกทอรี Sandbox ของตัวเองพร้อมโฟลเดอร์ย่อย Documents, Library, tmp และ Bundle
  • การเข้าถึงแอปอื่น ถูกห้าม: การอ่าน การเขียน และการรันโค้ดภายนอก Sandbox ถูกบล็อกโดยระบบ
  • Entitlements และ Capabilities ขยาย Sandbox: App Groups, iCloud, Security-Scoped Bookmarks ต้องได้รับอนุญาตอย่างชัดเจน
  • UIDocumentPicker และ Share Extension — วิธีเดียวในการแลกเปลี่ยนไฟล์ระหว่างแอปที่แยกส่วน

Sandbox คืออะไร

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) และรายการในบันทึกของระบบ

swift
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อ่านและเขียน
BundleBundle.main.bundlePathอ่านอย่างเดียว
Library.libraryDirectoryอ่านและเขียน
tmpNSTemporaryDirectory()อ่านและเขียน
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 Bookmarks

Security-Scoped Bookmark คือกลไกของ iOS ที่อนุญาตให้คงการเข้าถึงไฟล์ภายนอก Sandbox ระหว่างการเริ่มทำงานของแอป เมื่อผู้ใช้เลือกไฟล์ผ่าน UIDocumentPicker แอปสามารถสร้าง bookmark จาก Security-Scoped URL และบันทึกลงใน UserDefaults หรือพื้นที่เก็บข้อมูลอื่น

ในการเริ่มทำงานครั้งถัดไป แอปจะกู้คืนการเข้าถึงผ่าน URLByResolvingBookmarkData ซึ่งส่งคืน Security-Scoped URL จากนั้นต้องเรียก startAccessingSecurityScopedResource ก่อนอ่านไฟล์ และ stopAccessingSecurityScopedResource หลังทำงานเสร็จ ความสมดุลของการเรียก เป็นสิ่งจำเป็น — ทุก start ต้องมี stop ที่สอดคล้องกัน มิฉะนั้นระบบจะใช้ขีดจำกัดทรัพยากร Security-Scoped หมด

swift
// สร้าง 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 จะไม่ถูกต้อง

Sandbox และ App Groups

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 อื่น ๆ — เฉพาะแอปที่มีตัวระบุกลุ่มเดียวกันเท่านั้นที่เข้าถึงได้

ข้อจำกัดของแซนด์บ็อกซ์ใน iOS

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 จะทำให้แอปปิดตัวลง

  • โค้ดแบบไดนามิก — ถูกห้าม: JavaScriptCore สำหรับ JS ใน WebView แต่ไม่ใช่โค้ดเครื่องจักรตามอำเภอใจ
  • กระบวนการลูก — fork, exec, system ไม่สามารถใช้ได้จาก Sandbox
  • การเข้าถึงอุปกรณ์ — กล้อง ไมโครโฟน และ GPS ต้องใช้กล่องโต้ตอบของระบบ
  • เครือข่ายท้องถิ่น — UDP แบบ multicast และ broadcast ถูกบล็อกสำหรับ App Store
  • คีย์การเข้ารหัส — Keychain พร้อมใช้งาน แต่เฉพาะสำหรับแอปของคุณเองเท่านั้น (kSecAttrAccessGroup สำหรับ App Group)

คำถามที่พบบ่อย

Sandbox ใน iOS คืออะไร?

Sandbox คือสภาพแวดล้อมการทำงานแบบแยกส่วนสำหรับแอป iOS ซึ่งจำกัดการเข้าถึงระบบไฟล์ เครือข่าย และข้อมูลของแอปอื่น แต่ละแอปมีคอนเทนเนอร์ Sandbox ที่ไม่ซ้ำกัน การเข้าถึงถูกควบคุมในระดับเคอร์เนลของ iOS ผ่าน Sandbox.kext

ไฟล์ใดบ้างที่พร้อมใช้งานใน Sandbox ของแอป?

แอปเข้าถึงได้: Documents (ข้อมูลผู้ใช้), Library (Caches, Preferences, Application Support), tmp (ไฟล์ชั่วคราว) และ Bundle (อ่านอย่างเดียว) ไดเรกทอรี App Group พร้อมใช้งานสำหรับแอปในกลุ่มผู้พัฒนาเดียวกัน

จะเข้าถึงไฟล์ของแอปอื่นได้อย่างไร?

ผ่าน UIDocumentPickerViewController — ผู้ใช้เลือกไฟล์ผ่านอินเทอร์เฟซระบบ iOS ให้ Security-Scoped URL ซึ่งพร้อมใช้งานจนกว่าจะเรียก stopAccessingSecurityScopedResource ทางเลือกคือ Share Extension สำหรับส่งข้อมูลระหว่างแอป

Security-Scoped Bookmark คืออะไร?

Security-Scoped Bookmark คือ Data ที่คงการเข้าถึงไฟล์ภายนอก Sandbox ระหว่างการเริ่มทำงานของแอป สร้างขึ้นจาก Security-Scoped URL (ได้รับจาก UIDocumentPicker) ผ่าน bookmarkData ในการเริ่มทำงานครั้งถัดไป bookmark จะถูกกู้คืนผ่าน URLByResolvingBookmarkData

สามารถปิด Sandbox ใน iOS ได้หรือไม่?

ไม่ได้ ไม่สามารถปิด Sandbox สำหรับแอปจาก App Store ได้ บนอุปกรณ์ที่เจลเบรกแล้วสามารถปิดได้ แต่ไม่เข้ากันได้กับการเผยแพร่บน App Store นักพัฒนาสามารถทดสอบโดยไม่มี Sandbox บนตัวจำลองได้ แต่อุปกรณ์จริงจะใช้ Sandbox เสมอ

สรุป

  • Sandbox — ระบบความปลอดภัยพื้นฐานของ iOS ที่แยกแต่ละแอปในระดับเคอร์เนลด้วย Mandatory Access Control
  • โครงสร้าง Sandbox ประกอบด้วยไดเรกทอรี Documents, Library, tmp และ Bundle พร้อมสิทธิ์การเข้าถึงและนโยบายการสำรองข้อมูลที่แตกต่างกัน
  • การเข้าถึงโดยตรง ต่อระบบไฟล์ของแอปอื่นถูกบล็อกโดยสิ้นเชิง — มีเพียง UIDocumentPicker และ App Groups เท่านั้นที่ถูกต้อง
  • Security-Scoped Bookmarks ให้การเข้าถึงไฟล์ภายนอก Sandbox อย่างต่อเนื่องที่ได้รับผ่านอินเทอร์เฟซของระบบ
  • App Groups สร้างพื้นที่ Sandbox ที่ใช้ร่วมกันสำหรับชุดแอปและส่วนขยายจากผู้พัฒนารายเดียว
  • ข้อจำกัดของ Sandbox รวมถึงการห้ามโค้ดแบบไดนามิก กระบวนการลูก เครือข่าย multicast และกล่องโต้ตอบของระบบบังคับสำหรับทรัพยากรฮาร์ดแวร์
  • แอป App Store ทั้งหมด ทำงานใน Sandbox — นี่ไม่ใช่คุณสมบัติเสริม แต่เป็นคุณสมบัติทางสถาปัตยกรรมที่จำเป็นของ iOS

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม