Background Task: แนวคิดหลัก การลงทะเบียนงาน และการทำงานในพื้นหลัง

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

Background Task เป็นกลไกของ iOS ที่ช่วยให้แอปพลิเคชันทำงานให้เสร็จสมบูรณ์หลังจากเปลี่ยนไปอยู่ในพื้นหลัง ระบบจะจัดสรรเวลาจำกัด (สูงสุด 30 วินาที) สำหรับการทำงาน เมื่อหมดเวลาแอปพลิเคชันจะถูกพักการทำงานโดยอัตโนมัติ ตามข้อมูลของ Apple, 2026 การใช้ expiration handler เป็นข้อกำหนดบังคับสำหรับการทำงานพื้นหลังให้เสร็จสมบูรณ์อย่างถูกต้อง

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

  • Background Task — กลไก iOS สำหรับทำงานให้เสร็จหลังจากแอปเข้าสู่พื้นหลัง
  • beginBackgroundTask — เมธอดหลักของ UIApplication สำหรับลงทะเบียนงานพื้นหลัง
  • Expiration handler — บล็อกโค้ดที่ระบบเรียกเมื่อเวลาที่จัดสรรหมดลง
  • ขีดจำกัด 30 วินาที — เวลาทำงานมาตรฐาน สามารถขยายได้ผ่าน Background Modes
  • UIApplication.shared.endBackgroundTask — การเรียกที่จำเป็นเพื่อทำงานให้เสร็จอย่างถูกต้อง

Background Task ใน iOS คืออะไร?

Background Task เป็นกลไกการเขียนโปรแกรม iOS ที่ช่วยให้แอปพลิเคชันขยายเวลาการทำงานหลังจากเปลี่ยนไปสู่พื้นหลัง เมื่อผู้ใช้ย่อแอปพลิเคชัน ระบบจะเรียก UIApplicationDelegate.applicationDidEnterBackground หากมีการดำเนินการที่สำคัญกำลังทำงานอยู่ในขณะนั้น (การบันทึกข้อมูล การส่งคำขอ) แอปพลิเคชันสามารถขอเวลาเพิ่มเติมผ่าน beginBackgroundTask

ทำไมถึงต้องมี Background Tasks

หากไม่ใช้ Background Task แอปพลิเคชันจะถูกพักการทำงานโดยอัตโนมัติภายใน 3–5 วินาทีหลังจากเข้าสู่พื้นหลัง การดำเนินการที่ยังไม่เสร็จทั้งหมดจะถูกขัดจังหวะ: ข้อมูลไม่ถูกบันทึก คำขอเครือข่ายถูกยกเลิก สถานะสูญหาย Background Task ให้เวลาแอปพลิเคชันสูงสุด 30 วินาทีเพื่อดำเนินการเหล่านี้ให้เสร็จอย่างถูกต้อง

  • การบันทึกสถานะ — การเขียนข้อมูลไปยัง CoreData, UserDefaults หรือระบบไฟล์
  • การดำเนินคำขอเครือข่ายให้เสร็จ — รอการตอบกลับจากเซิร์ฟเวอร์และประมวลผลผลลัพธ์
  • การส่งข้อมูลวิเคราะห์ — การส่งเหตุการณ์ไปยังเซิร์ฟเวอร์วิเคราะห์ก่อนการพักการทำงาน
  • การทำความสะอาดทรัพยากร — การปิดตัวบอกตำแหน่งไฟล์ การปล่อยหน่วยความจำ
  • การแคช — การเขียนผลลัพธ์กลางเพื่อกู้คืนในการเริ่มต้นครั้งถัดไป

ประวัติและวิวัฒนาการ

beginBackgroundTask ปรากฏใน iOS 4.0 — รุ่นแรกที่รองรับการทำงานหลายอย่างพร้อมกัน ก่อน iOS 4 แอปพลิเคชันจะถูกยุติอย่างสมบูรณ์เมื่อกดปุ่ม Home iOS 7 นำเสนอ Background Fetch และการกำหนดค่าพื้นหลังของ URLSession ตั้งแต่ iOS 13 เป็นต้นไป Apple แนะนำ BGTaskScheduler สำหรับโปรเจกต์ใหม่ แต่ beginBackgroundTask ยังคงมีความเกี่ยวข้องสำหรับการดำเนินการระยะสั้น

beginBackgroundTask ทำงานอย่างไร: วงจรชีวิต

beginBackgroundTask เป็นเมธอดของ UIApplication ที่ลงทะเบียนงานและส่งคืน UIBackgroundTaskIdentifier เฉพาะ ระบบจะเพิ่มตัวจับเวลาการทำงานพื้นหลัง เมื่อเวลาหมด expiration handler จะถูกเรียก หลังจากนั้นแอปพลิเคชันต้องเรียก endBackgroundTask(identifier:) เพื่อทำงานให้เสร็จอย่างถูกต้อง

กระบวนการทำงานทีละขั้นตอน

ขั้นตอนที่ 1 — แอปพลิเคชันได้รับการแจ้งเตือน didEnterBackground ขั้นตอนที่ 2 — เรียก beginBackgroundTask(expirationHandler:) ขั้นตอนที่ 3 — ดำเนินการที่สำคัญ (บันทึก, คำขอเครือข่าย) ขั้นตอนที่ 4 — เมื่อเสร็จสิ้น เรียก endBackgroundTask(identifier:) หากการดำเนินการไม่เสร็จภายใน 30 วินาที — ระบบจะเรียก expiration handler และแอปพลิเคชันต้องยุติงานทันที

swift
var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid

func startBackgroundTask() {
    backgroundTaskID = UIApplication.shared.beginBackgroundTask {
        // Expiration handler
        UIApplication.shared.endBackgroundTask(backgroundTaskID)
        backgroundTaskID = .invalid
    }
}

func finishBackgroundTask() {
    UIApplication.shared.endBackgroundTask(backgroundTaskID)
    backgroundTaskID = .invalid
}

UIApplication.shared.backgroundTimeRemaining

คุณสมบัติ backgroundTimeRemaining ส่งคืนจำนวนวินาทีที่เหลือก่อนที่งานพื้นหลังจะถูกยุติโดยอัตโนมัติ ค่าจะลดลงตามเวลาจริง หากแอปพลิเคชันไม่อยู่ในพื้นหลัง — จะส่งคืน DBL_MAX ใช้คุณสมบัตินี้เพื่อปรับพฤติกรรม: เมื่อเหลือน้อยกว่า 5 วินาที ให้ขัดจังหวะการดำเนินการที่ยาวนานและบันทึกความคืบหน้า

งานหลายรายการ

แอปพลิเคชันสามารถลงทะเบียน Background Tasks หลายรายการพร้อมกันได้ งานแต่ละงานจะได้รับตัวระบุของตนเอง เวลาทำงานทั้งหมดจะสะสม — หากลงทะเบียน 3 งาน แอปพลิเคชันจะได้รับเวลาสูงสุด 90 วินาที อย่างไรก็ตาม ระบบอาจยุติแอปพลิเคชันก่อนเวลาหากทรัพยากรหมดหรือเกินขีดจำกัดแบตเตอรี่

Expiration handler: การจัดการการสิ้นสุดที่จำเป็น

Expiration handler เป็นบล็อกโค้ดที่ระบบเรียกเมื่อเวลาที่จัดสรรสำหรับงานพื้นหลังหมดลง การมี expiration handler เป็นข้อกำหนดบังคับของ Apple หากไม่มี แอปพลิเคชันอาจถูกยุติโดยอัตโนมัติโดยระบบและข้อมูลอาจสูญหาย

สิ่งที่ควรอยู่ใน expiration handler

Expiration handler ต้องดำเนินการขั้นต่ำเพื่อบันทึกสถานะแอปพลิเคชัน: บันทึกข้อมูลปัจจุบันไปยังพื้นที่จัดเก็บถาวร เรียก endBackgroundTask พร้อมตัวระบุที่เกี่ยวข้อง และตั้งค่าตัวระบุเป็น .invalid ภายใน expiration handler ห้ามเริ่มดำเนินการที่ยาวนานใหม่ — เวลาดำเนินการจำกัดอยู่ที่ 1–2 วินาที

swift
func handleExpiration() {
    // กำลังบันทึกความคืบหน้าของการทำงาน
    saveProgressToUserDefaults()

    // กำลังยกเลิกคำขอเครือข่ายที่กำลังทำงานอยู่
    currentTask?.cancel()

    // กำลังยุติ Background Task
    UIApplication.shared.endBackgroundTask(backgroundTaskID)
    backgroundTaskID = .invalid
}

// การลงทะเบียนกับ expiration handler
backgroundTaskID = UIApplication.shared.beginBackgroundTask(
    withName: "SaveDocument",
    expirationHandler: handleExpiration
)

ข้อผิดพลาดทั่วไปกับ expiration handler

ข้อผิดพลาดที่พบบ่อยที่สุดคือไม่เรียก endBackgroundTask ภายใน expiration handler ในกรณีนี้ ระบบจะยังคงถือว่างานกำลังทำงานอยู่ แอปพลิเคชันจะไม่เปลี่ยนไปสู่สถานะพักการทำงาน และแบตเตอรี่จะหมด ข้อผิดพลาดที่สองคือการเริ่มดำเนินการที่ยาวนานภายใน expiration handler ระบบอาจยุติแอปพลิเคชันก่อนที่งานจะเสร็จและข้อมูลจะสูญหาย

การตรวจสอบเวลาที่เหลือ

ใน expiration handler เวลาดำเนินการมีจำกัดอย่างยิ่ง — โดยทั่วไป น้อยกว่า 1 วินาที ดังนั้น ภายใน handler คุณไม่สามารถดำเนินการ: การคำนวณซับซ้อน คำขอเครือข่าย การเขียนข้อมูลปริมาณมากไปยัง CoreData ได้เฉพาะการดำเนินการอะตอมมิก: การเขียนคีย์เดียวไปยัง UserDefaults การตั้งค่าแฟลกสถานะ การเรียก endBackgroundTask

ตัวอย่างโค้ด Background Task ใน Swift

มาดูการใช้งาน Background Task ที่สมบูรณ์สำหรับการบันทึกเอกสารเมื่อแอปเข้าสู่พื้นหลัง ตัวอย่างรวมถึงการลงทะเบียนงาน การดำเนินการพร้อมตรวจสอบเวลาที่เหลือ และการเสร็จสิ้นอย่างถูกต้องผ่าน endBackgroundTask

การบันทึกเอกสารพร้อมความคืบหน้า

เมื่อเข้าสู่พื้นหลัง แอปพลิเคชันจะเริ่มบันทึกเอกสารขนาดใหญ่ Background Task ให้เวลาสูงสุด 30 วินาทีสำหรับการดำเนินการ หากเวลาหมด — expiration handler จะบันทึกผลลัพธ์กลาง หลังจากการบันทึกเสร็จสมบูรณ์ จะเรียก endBackgroundTask เพื่อปล่อยทรัพยากร

swift
class DocumentManager {
    private var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid

    func saveDocumentInBackground(document: Document) {
        backgroundTaskID = UIApplication.shared.beginBackgroundTask {
            self.saveProgress(document)
            self.endBackgroundTask()
        }

        DispatchQueue.global().async {
            document.save()
            self.endBackgroundTask()
        }
    }

    private func endBackgroundTask() {
        UIApplication.shared.endBackgroundTask(backgroundTaskID)
        backgroundTaskID = .invalid
    }
}

การส่งข้อมูลไปยังเซิร์ฟเวอร์

คำขอเครือข่าย ในพื้นหลังต้องการความสนใจเป็นพิเศษ — expiration handler อาจขัดจังหวะคำขอก่อนที่จะได้รับการตอบกลับ ใช้ URLSession กับ dataTask และตรวจสอบ backgroundTimeRemaining ก่อนส่ง หากเหลือน้อยกว่า 5 วินาที — ให้เลื่อนการส่งออกไปจนกว่าแอปจะถูกปลุกครั้งถัดไป

swift
func sendCriticalData(data: Data) {
    backgroundTaskID = UIApplication.shared.beginBackgroundTask {
        // กำลังบันทึกข้อมูลสำหรับการส่งซ้ำ
        saveForRetry(data)
        self.endBackgroundTask()
    }

    let task = URLSession.shared.dataTask(with: request) { _, _, error in
        if error != nil {
            saveForRetry(data)
        }
        self.endBackgroundTask()
    }
    task.resume()
}

การตรวจสอบเวลาที่เหลือ

สำหรับการดำเนินการที่ยาวนาน ให้ตรวจสอบ UIApplication.shared.backgroundTimeRemaining หากค่าลดลงต่ำกว่าเกณฑ์ (10 วินาที) ให้ขัดจังหวะการดำเนินการปัจจุบันและเริ่มบันทึกผลลัพธ์กลาง วิธีนี้ช่วยให้เสร็จสมบูรณ์อย่างถูกต้องก่อนที่ expiration handler จะถูกเรียกโดยอัตโนมัติ

แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ Background Task

Background Task เป็นกลไกที่ทรงพลัง แต่การใช้ไม่เหมาะสมนำไปสู่ปัญหาแบตเตอรี่และประสิทธิภาพ การปฏิบัติตามคำแนะนำของ Apple และแนวทางปฏิบัติที่พิสูจน์แล้วของชุมชนจะช่วยหลีกเลี่ยงข้อผิดพลาดทั่วไปและรับประกันการทำงานของแอปพลิเคชันที่เสถียร

ลดเวลาดำเนินการให้น้อยที่สุด

ดำเนินการ Background Task ให้เสร็จโดยเร็วที่สุด ทุกวินาทีของการทำงานในพื้นหลังจะใช้พลังงานแบตเตอรี่ เวลาที่เหมาะสมที่สุด — น้อยกว่า 5 วินาที หากการดำเนินการใช้เวลานานกว่านั้น — พิจารณาใช้ BGTaskScheduler หรือ Background Modes อย่าขยายงานโดยไม่จำเป็นผ่านการเรียก beginBackgroundTask โดยไม่มีเหตุผลอันสมควร

การใช้ตัวระบุอย่างถูกต้อง

จัดเก็บ UIBackgroundTaskIdentifier เป็นคุณสมบัติของคลาสหรือโครงสร้าง อย่าส่งผ่านเป็นตัวแปรส่วนกลาง — สิ่งนี้จะนำไปสู่ความขัดแย้งกับงานหลายรายการ ตั้งค่าตัวระบุเป็น .invalid หลังจากเรียก endBackgroundTask เพื่อป้องกันการเสร็จสิ้นซ้ำ

การทดสอบ Background Task

ใน Xcode Simulator ให้เปลี่ยนแอปพลิเคชันไปยังพื้นหลังผ่านปุ่ม Home (Command + Shift + H) ใช้ Debug — Simulate Background Fetch สำหรับทดสอบการปลุกในพื้นหลัง เพื่อจำลองการหมดเวลา ให้ตั้งค่าตัวแปรสภาพแวดล้อม BACKGROUND_TASK_SIMULATE_EXPIRATION = YES — expiration handler จะถูกเรียกภายใน 5 วินาที

swift
// กำลังตรวจสอบเวลาที่เหลือก่อนเริ่มการดำเนินการ
let remaining = UIApplication.shared.backgroundTimeRemaining
guard remaining > 10.0 else {
    // เวลาไม่เพียงพอ — เลื่อนงานออกไป
    scheduleForNextLaunch()
    return
}

// กำลังดำเนินการพร้อมควบคุมเวลา
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
    saveProgress()
    self.endBackgroundTask()
}

หลีกเลี่ยง retain cycles

Expiration handler จับ self — สิ่งนี้สามารถสร้าง retain cycle หาก backgroundTaskID ถูกจัดเก็บเป็นคุณสมบัติของออบเจกต์เดียวกัน ใช้ [weak self] ในคลอเชอร์หรือจัดเก็บตัวระบุแยกต่างหาก Retain cycle ทำให้เกิดหน่วยความจำรั่ว — ออบเจกต์จะไม่ถูกปล่อยจนกว่าแอปพลิเคชันจะยุติ

Background Task vs BGTaskScheduler: การเปรียบเทียบแนวทาง

ด้วยการเปิดตัว iOS 13 Apple ได้นำเสนอ BGTaskScheduler — ตัวแทนที่ทันสมัยของ API Background Task เดิม ทั้งสองกลไกแก้ปัญหางานที่คล้ายกัน แต่ BGTaskScheduler ให้การควบคุมและความยืดหยุ่นมากกว่า การเข้าใจความแตกต่างจะช่วยเลือกเครื่องมือที่เหมาะสมสำหรับสถานการณ์เฉพาะ

คุณลักษณะBackground TaskBGTaskScheduler
เวอร์ชัน iOS4.0+13.0+
เวลาสูงสุด30 วินาที30 วินาที / 10 นาที (processing)
การเริ่มต้นdidEnterBackgroundการกำหนดเวลา + ระบบ
การรับประกันการทำงานเฉพาะเมื่อเข้าสู่พื้นหลังทุกเวลาที่ระบบสะดวก
Expiration handlerใช่, จำเป็นใช่, ผ่าน task.expirationHandler
อินเทอร์เน็ตจำเป็นเมื่อเริ่มต้นพร้อมใช้งานผ่าน requiresNetworkConnectivity
การชาร์จไม่จำเป็นไม่บังคับสำหรับ processing

เมื่อใดควรใช้ Background Task

beginBackgroundTask เหมาะสำหรับการดำเนินการระยะสั้นที่ต้องดำเนินการทันทีเมื่อเข้าสู่พื้นหลัง: การบันทึกสถานะ การทำคำขอเครือข่ายให้เสร็จ การแคชข้อมูล API เรียบง่ายและไม่ต้องการการกำหนดค่า Info.plist หรือการลงทะเบียนตัวระบุ เหมาะสำหรับการดำเนินการที่ใช้เวลาน้อยกว่า 10 วินาที

เมื่อใดควรใช้ BGTaskScheduler

BGTaskScheduler เหมาะสำหรับงานที่สามารถดำเนินการได้ทุกเวลาที่สะดวก: การซิงค์เป็นระยะ การทำความสะอาดแคช การอัปเดตวิดเจ็ต ระบบจะเลือกเวลาที่เหมาะสมที่สุดโดยพิจารณาจากพฤติกรรมผู้ใช้และสถานะแบตเตอรี่ สำหรับการดำเนินการที่ยาวนาน (สูงสุด 10 นาที) ให้ใช้ BGProcessingTask

การใช้ร่วมกัน

ทั้งสอง API สามารถใช้ในแอปพลิเคชันเดียวกันได้ Background Task — สำหรับการดำเนินการทันทีเมื่อเข้าสู่พื้นหลัง (การบันทึกแบบร่าง) BGTaskScheduler — สำหรับการอัปเดตตามกำหนดเวลา (การซิงค์ทุก 6 ชั่วโมง) การแยกความรับผิดชอบช่วยให้มั่นใจในการเก็บรักษาข้อมูลที่ถูกต้องและการบำรุงรักษาพื้นหลังที่ประหยัดพลังงาน

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

สามารถเรียก beginBackgroundTask นอก didEnterBackground ได้หรือไม่?

ได้ beginBackgroundTask สามารถเรียกได้ทุกจุดระหว่างการทำงานของแอปพลิเคชัน อย่างไรก็ตาม การจัดสรรเวลาของระบบจะเริ่มหลังจากเปลี่ยนไปสู่พื้นหลังเท่านั้น หากแอปพลิเคชันอยู่ในเบื้องหน้า การเรียก beginBackgroundTask ไม่มีผล — backgroundTimeRemaining ส่งคืน DBL_MAX และงานจะถูกเปิดใช้งานเมื่อเข้าสู่พื้นหลัง

จะเกิดอะไรขึ้นหากไม่เรียก endBackgroundTask?

หากไม่เรียก endBackgroundTask ระบบจะยังคงถือว่าแอปพลิเคชันทำงานอยู่ในพื้นหลัง หลังจาก 30 วินาที expiration handler จะถูกเรียก แต่หากไม่มี endBackgroundTask เช่นกัน — แอปพลิเคชันจะยังคงอยู่ในหน่วยความจำ ทำให้แบตเตอรี่หมด ใน iOS 13+ ระบบจะยุติแอปพลิเคชันดังกล่าวโดยอัตโนมัติหลังจาก 3 นาที

จะขยาย Background Task เกิน 30 วินาทีได้อย่างไร?

เวลามาตรฐานคือ 30 วินาที สามารถขยายได้ผ่าน Background Modes: เสียง (การเล่น), ตำแหน่ง (พิกัดทางภูมิศาสตร์), Bluetooth (BLE) หรือผ่าน BGProcessingTask (iOS 13+) — สูงสุด 10 นาทีพร้อมการชาร์จและ Wi-Fi beginBackgroundTask เองไม่มีวิธีการเพิ่มขีดจำกัด

Background Task ทำงานบน iPad หรือไม่?

ได้ iPadOS รองรับ beginBackgroundTask อย่างสมบูรณ์ด้วยข้อจำกัดเดียวกันกับ iOS บน iPad ที่มี Stage Manager แอปพลิเคชันอาจอยู่ในหน่วยความจำนานขึ้น — ระบบพักการทำงานของแอปพลิเคชันน้อยลงเนื่องจาก RAM ที่มากขึ้น แต่ขีดจำกัด 30 วินาทีสำหรับงานพื้นหลังยังคงอยู่

จะดีบัก Background Task บนอุปกรณ์จริงได้อย่างไร?

เชื่อมต่ออุปกรณ์กับ Xcode เปิดแอปพลิเคชัน ย่อขนาด — บันทึกของระบบจะปรากฏในคอนโซล ใช้ sysdiagnose เพื่อรวบรวมบันทึกโดยละเอียด: เรียก sysdiagnose จากอุปกรณ์โดยตรง (เพิ่มระดับเสียง + ลดระดับเสียง + เปิด/ปิด) ใน Xcode Debug Navigator ให้ตรวจสอบกิจกรรมของงานพื้นหลัง

สรุป

  • Background Task — กลไก iOS สำหรับทำงานให้เสร็จหลังจากเข้าสู่พื้นหลัง ใช้งานได้ตั้งแต่ iOS 4.0
  • beginBackgroundTask — เมธอด UIApplication ที่ลงทะเบียนงานและส่งคืนตัวระบุสำหรับการเสร็จสมบูรณ์
  • Expiration handler — บล็อกโค้ดที่จำเป็นซึ่งระบบเรียกเมื่อขีดจำกัด 30 วินาทีหมดลง
  • endBackgroundTask — การเรียกที่จำเป็นเพื่อทำงานให้เสร็จอย่างถูกต้อง หากไม่มี แอปพลิเคชันจะยังคงอยู่ในหน่วยความจำ
  • BGTaskScheduler — ทางเลือกที่ทันสมัย (iOS 13+) พร้อมการกำหนดเวลา งานสองประเภท และเงื่อนไขการทำงาน
  • backgroundTimeRemaining — คุณสมบัติสำหรับตรวจสอบเวลาที่เหลือและปรับพฤติกรรมของงาน
  • ใช้ Background Task สำหรับการดำเนินการระยะสันทันที และ BGTaskScheduler สำหรับการอัปเดตพื้นหลังตามกำหนดเวลาในโปรเจกต์ใหม่

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

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

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

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