Background Fetch: คืออะไร หลักการทำงาน และการกำหนดค่าการอัปเดต

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

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

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

  • Background Fetch คือ API ของ iOS สำหรับอัปเดตเนื้อหาเป็นระยะในพื้นหลัง
  • ระบบควบคุม ความถี่ในการปลุกโดยอิงจากการวิเคราะห์พฤติกรรมของผู้ใช้
  • ช่วงเวลาขั้นต่ำ ถูกกำหนดผ่าน UIApplication.minimumBackgroundFetchInterval
  • การเลิกใช้งาน — ตั้งแต่ iOS 13+ กลไกนี้ถือว่าเก่า แนะนำให้ใช้ BGTaskScheduler
  • เวลาดำเนินการ — สูงสุด 30 วินาที หลังจากนั้นระบบจะบังคับสิ้นสุดงาน

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

Background Fetch คือ API ของ iOS ที่ช่วยให้แอปได้รับข้อมูลใหม่เป็นระยะในพื้นหลัง ถูกนำเสนอครั้งแรกใน iOS 7 พร้อมกับกลไก Background App Refresh เป้าหมายหลักคือเพื่อให้เนื้อหาอัปเดตอยู่เสมอเมื่อผู้ใช้เปิดแอป โดยไม่ต้องรอให้โหลด

ความแตกต่างจากการแจ้งเตือนแบบพุช

การแจ้งเตือนแบบพุช เริ่มต้นโดยเซิร์ฟเวอร์ — เซิร์ฟเวอร์ส่งสัญญาณไปยังอุปกรณ์ และระบบตัดสินใจว่าจะปลุกแอปหรือไม่ Background Fetch เริ่มต้นโดย iOS เองตามรูปแบบการใช้งานอุปกรณ์ พุชเหมาะสำหรับข้อความเร่งด่วน ในขณะที่ Fetch เหมาะสำหรับการอัปเดตเนื้อหาตามกำหนด (ข่าว ฟีดโซเชียลมีเดีย)

ตำแหน่งในระบบนิเวศงานพื้นหลัง

Background Fetch เป็นหนึ่งในกลไกการทำงานพื้นหลังหลายอย่างใน iOS BGAppRefreshTask (iOS 13+) ทำงานเดียวกันแต่มีการจัดตารางเวลาที่ยืดหยุ่นกว่า Background Modes (เสียง, ตำแหน่ง) สำหรับการทำงานต่อเนื่อง Silent Push คือการอัปเดตที่เริ่มต้นโดยเซิร์ฟเวอร์ Fetch ยังคงเกี่ยวข้องสำหรับโปรเจกต์ที่รองรับ iOS 12 และต่ำกว่า

  • Background Fetch — เป็นระยะ, เริ่มต้นโดยระบบ, iOS 7+
  • BGAppRefreshTask — เป็นระยะ, เริ่มต้นโดยระบบ, iOS 13+
  • BGProcessingTask — งานยาว, iOS 13+
  • Silent Push — เริ่มต้นโดยเซิร์ฟเวอร์, iOS 7+

Background Fetch ทำงานอย่างไร: สถาปัตยกรรมและวงจรชีวิต

iOS ใช้อัลกอริทึมการเรียนรู้ของเครื่องเพื่อกำหนดเวลาที่เหมาะสมที่สุดในการปลุกแอป ระบบจะวิเคราะห์ว่าผู้ใช้มักเปิดแอปเมื่อใด ใช้นานเท่าใด และกลับมาบ่อยแค่ไหน จากข้อมูลนี้ iOS จะคำนวณช่วงเวลาสำหรับ Background Fetch

กระบวนการดำเนินงาน

เมื่อระบบตัดสินใจปลุกแอป มันจะเรียกเมธอด application(_:performFetchWithCompletionHandler:) ใน AppDelegate แอปควรโหลดข้อมูลใหม่จำนวนน้อยที่สุดและเรียกตัวจัดการความสำเร็จด้วยหนึ่งในสามสถานะ: .newData (โหลดข้อมูลแล้ว), .noData (ไม่มีข้อมูลใหม่) หรือ .failed (ข้อผิดพลาด) สถานะจะส่งผลต่อความถี่ในการปลุกในอนาคต

ผลกระทบของตัวจัดการความสำเร็จต่อความถี่ในการเรียก

สถานะ .newData บอกระบบว่าการอัปเดตมีประโยชน์ — iOS อาจเพิ่มความถี่ในการปลุก .noData บ่งชี้ว่าไม่มีข้อมูล — ความถี่ยังคงเดิมหรือลดลง .failed แสดงถึงปัญหา — ระบบลดความถี่เพื่อประหยัดแบตเตอรี่ ควรเน้นที่สถานะที่ซื่อสัตย์ ไม่ใช่การบังคับ .newData

สถานะความหมายผลกระทบ
.newDataโหลดข้อมูลสำเร็จความถี่อาจเพิ่มขึ้น
.noDataการตรวจสอบไม่มีข้อมูลใหม่ความถี่คงเดิม
.failedข้อผิดพลาดเครือข่ายหรือเซิร์ฟเวอร์ความถี่ลดลง

การตั้งค่า Background Fetch ในโปรเจกต์ Xcode

เพื่อเปิดใช้งาน Background Fetch จำเป็นต้องทำสองขั้นตอน: เปิดใช้งานความสามารถใน Xcode และตั้งค่าช่วงเวลาขั้นต่ำในโค้ด ความสามารถอยู่ใน Target — Signing & Capabilities — Background Modes — ทำเครื่องหมายที่ช่อง Background Fetch หากไม่มีขั้นตอนนี้ ระบบจะไม่ปลุกแอป

การตั้งค่าช่วงเวลาขั้นต่ำ

เมธอด UIApplication.shared.setMinimumBackgroundFetchInterval กำหนดเวลาขั้นต่ำเป็นวินาทีระหว่างการเรียก Fetch ค่า UIApplication.backgroundFetchIntervalMinimum (ประมาณ 15 นาที) บอกระบบให้ปลุกแอปบ่อยเท่าที่ประหยัดพลังงาน การตั้งค่าช่วงเวลาใน application(_:didFinishLaunchingWithOptions:) เป็นแนวทางปฏิบัติมาตรฐาน

swift
func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
    UIApplication.shared.setMinimumBackgroundFetchInterval(
        UIApplication.backgroundFetchIntervalMinimum
    )
    return true
}

Info.plist และความสามารถ

เมื่อเปิดใช้งาน Background Fetch ใน Xcode มันจะอัปเดต Info.plist โดยอัตโนมัติ — เพิ่มคีย์ UIBackgroundModes ด้วยค่า fetch นี่เป็นขั้นตอนบังคับ: หากไม่มี แอปจะไม่ได้รับการเรียก performFetchWithCompletionHandler คุณสามารถตรวจสอบผ่าน P list Source หรือ Build Settings

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

มาดูการใช้งาน Background Fetch แบบสมบูรณ์สำหรับแอปข่าว การทำงานรวมถึงการโหลดข้อมูล การแคช และการเรียกตัวจัดการความสำเร็จ โค้ดทำงานใน AppDelegate — ที่เดียวที่ระบบเรียก fetch

swift
func application(
    _ application: UIApplication,
    performFetchWithCompletionHandler handler: @escaping (UIBackgroundFetchResult) -> Void
) {
    let url = URL(string: "https://api.example.com/latest")!

    URLSession.shared.dataTask(with: url) { data, response, error in
        guard let data = data, error == nil else {
            handler(.failed)
            return
        }

        do {
            let articles = try JSONDecoder().decode([Article].self, from: data)
            cacheArticles(articles)
            handler(articles.isEmpty ? .noData : .newData)
        } catch {
            handler(.failed)
        }
    }.resume()
}

การแคชข้อมูลที่โหลดแล้ว

หลังจากโหลดข้อมูลผ่าน Background Fetch แล้ว จำเป็นต้องบันทึกไว้ในพื้นที่จัดเก็บในเครื่อง — CoreData, UserDefaults หรือ File Manager เมื่อเปิดแอป ข้อมูลควรพร้อมใช้งานแล้ว ใช้ CoreData พร้อมบริบทพื้นหลังเพื่อการเขียนที่ปลอดภัยต่อเธรด หลังจากบันทึก ให้อัปเดต UI ในเธรดหลัก

swift
func cacheArticles(_ articles: [Article]) {
    let container = NSPersistentContainer(name: "AppModel")
    container.performBackgroundTask { context in
        articles.forEach { article in
            let entity = ArticleEntity(context: context)
            entity.id = Int64(article.id)
            entity.title = article.title
            entity.body = article.body
        }
        try? context.save()
    }
}

การทดสอบ Background Fetch

สำหรับการทดสอบ ให้ใช้ Simulator — เลือก Debug — Simulate Background Fetch ใน Xcode บนอุปกรณ์จริง คุณต้องรอให้ระบบตัดสินใจทำ fetch เพื่อเพิ่มความเร็ว คุณสามารถตั้งช่วงเวลาขั้นต่ำเป็น 1 นาที แต่ระบบอาจไม่สนใจเมื่อแบตเตอรี่ต่ำ

ข้อจำกัดและข้อควรระวัง

Background Fetch มีข้อจำกัดหลายประการที่สำคัญต้องพิจารณาเมื่อออกแบบสถาปัตยกรรมแอป หลัก ๆ คือระบบควบคุมความถี่ในการเรียกอย่างสมบูรณ์ และนักพัฒนาไม่สามารถรับประกันได้ แม้จะตั้งค่าช่วงเวลาขั้นต่ำแล้ว ระบบอาจไม่เรียก fetch เป็นเวลาหลายชั่วโมง

ข้อจำกัดด้านเวลาดำเนินการ

ระบบจัดสรร เวลาจำกัด ให้แอปทำงาน — โดยทั่วไปสูงสุด 30 วินาที หากแอปไม่เรียกตัวจัดการความสำเร็จภายในเวลานั้น ระบบจะบังคับสิ้นสุดกระบวนการและลดความถี่ในการปลุกในอนาคต คำขอเครือข่ายทั้งหมดควรกระชับ — ไม่เกิน 1-2 ครั้งต่อการเรียก

การพึ่งพาแบตเตอรี่

iOS พิจารณาระดับแบตเตอรี่เมื่อจัดตาราง Background Fetch เมื่อประจุต่ำกว่า 20% ความถี่ในการปลุกจะลดลง เมื่อเปิด โหมดประหยัดพลังงาน ระบบอาจปิดการอัปเดตพื้นหลังทั้งหมดสำหรับทุกแอป ผู้ใช้ยังสามารถปิด Background App Refresh สำหรับแอปเฉพาะในการตั้งค่า

ข้อจำกัดด้านเครือข่าย

URLSession ที่เริ่มต้นจาก Background Fetch ทำงานในโหมดมาตรฐาน — ไม่รองรับเซสชันพื้นหลัง สำหรับการดาวน์โหลดขนาดใหญ่ ให้ใช้ URLSession พร้อมการกำหนดค่าพื้นหลัง ระบบจะดาวน์โหลดต่อแม้หลังจาก fetch เสร็จสิ้น แต่จะไม่ติดตามความคืบหน้าจนกว่าจะปลุกครั้งถัดไป

การโยกย้ายจาก Background Fetch ไปยัง BGTaskScheduler

ตั้งแต่ iOS 13 เป็นต้นไป Apple แนะนำ BGTaskScheduler เป็นตัวแทนของ Background Fetch BGTaskScheduler ให้การจัดตารางเวลาที่ยืดหยุ่นกว่า งานสองประเภท (รีเฟรชและประมวลผล) และการลงทะเบียนงานด้วยตัวระบุ การโยกย้ายมีหลายขั้นตอนและแนะนำสำหรับโปรเจกต์ใหม่ทั้งหมด

การโยกย้ายทีละขั้นตอน

ขั้นตอนแรก — กำหนดตัวระบุงานใน Info.plist ผ่านคีย์ BGTaskSchedulerPermittedIdentifiers ขั้นตอนที่สอง — ลงทะเบียนงานใน AppDelegate ผ่าน BGTaskScheduler.shared.register ขั้นตอนที่สาม — แทนที่การเรียก performFetchWithCompletionHandler ด้วยตัวจัดการที่ส่งไปยัง register ขั้นตอนที่สี่ — เรียก submit เพื่อจัดตารางงาน

swift
// ก่อน (Background Fetch)
UIApplication.shared.setMinimumBackgroundFetchInterval(
    UIApplication.backgroundFetchIntervalMinimum
)

// หลังการโยกย้าย (BGTaskScheduler)
BGTaskScheduler.shared.register(
    forTaskWithIdentifier: "com.example.refresh",
    using: nil
) { task in
    self.handleAppRefresh(task: task as! BGAppRefreshTask)
}

let request = BGAppRefreshTaskRequest(
    identifier: "com.example.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)

ข้อดีของ BGTaskScheduler

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

เมื่อใดควรคง Background Fetch ไว้

หากแอปรองรับ iOS 12 และต่ำกว่า Background Fetch ยังคงเป็นตัวเลือกเดียวสำหรับการอัปเดตเป็นระยะ BGTaskScheduler พร้อมใช้งานตั้งแต่ iOS 13+ เท่านั้น ในกรณีนี้ ให้ใช้ wrapper: ตรวจสอบความพร้อมใช้งานผ่าน if #available(iOS 13, *) และเรียก API ที่เหมาะสม

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

iOS เรียก Background Fetch บ่อยแค่ไหน?

ความถี่ที่แน่นอนไม่ได้ถูกบันทึกและขึ้นอยู่กับพฤติกรรมของผู้ใช้ ระบบวิเคราะห์ ว่าผู้ใช้เปิดแอปบ่อยแค่ไหนและปรับความถี่ตามนั้น โดยเฉลี่ย เมื่อใช้งานบ่อย fetch อาจถูกเรียก 1–3 ครั้งต่อชั่วโมง เมื่อใช้งานน้อย — 1–2 ครั้งต่อวัน

ทำไม Background Fetch ของฉันไม่ถูกเรียก?

ตรวจสอบสามเงื่อนไข: ความสามารถ Background Fetch เปิดใช้งานใน Xcode หรือไม่, ตั้งค่า minimumBackgroundFetchInterval แล้ว และผู้ใช้ไม่ได้ปิด Background App Refresh สำหรับแอปในการตั้งค่า นอกจากนี้ตรวจสอบว่าอุปกรณ์ไม่ได้อยู่ในโหมดประหยัดพลังงานและระดับแบตเตอรี่สูงกว่า 20%

ความแตกต่างระหว่าง Background Fetch และ BGAppRefreshTask คืออะไร?

Background Fetch คือ API เก่า (iOS 7), BGAppRefreshTask คือ API ใหม่ (iOS 13+) BGAppRefreshTask ให้การควบคุมมากขึ้น: ตัวจัดการหมดอายุ, ความสามารถในการจัดตารางใหม่ และการตรวจสอบสถานะ Background Fetch ใช้งานง่ายกว่าแต่ยืดหยุ่นน้อยกว่า Apple แนะนำให้ใช้ BGAppRefreshTask สำหรับโปรเจกต์ใหม่

สามารถดาวน์โหลดไฟล์ขนาดใหญ่ผ่าน Background Fetch ได้หรือไม่?

ไม่แนะนำ Background Fetch มีข้อจำกัดด้านเวลา (สูงสุด 30 วินาที) สำหรับการดาวน์โหลดขนาดใหญ่ ให้ใช้ URLSession พร้อมการกำหนดค่าพื้นหลัง — ระบบจะดาวน์โหลดต่อแม้หลังจาก fetch เสร็จสิ้น ทางเลือกคือ BGProcessingTask (iOS 13+) ซึ่งอนุญาตสูงสุด 10 นาทีและเงื่อนไขการชาร์จ

Background Fetch กินแบตเตอรี่หรือไม่?

ใช่ การปลุกแต่ละครั้งใช้พลังงานในการเปิดโปรเซสเซอร์, เริ่มต้นสแต็กเครือข่าย และโหลดข้อมูล iOS ปรับความถี่ให้เหมาะสม เพื่อลดผลกระทบ ด้วยการใช้งานที่ถูกต้อง — โหลดเฉพาะข้อมูลใหม่, เรียกตัวจัดการความสำเร็จอย่างรวดเร็ว — ผลกระทบต่อแบตเตอรี่น้อยมาก

สรุป

  • Background Fetch คือ API ของ iOS สำหรับการโหลดข้อมูลพื้นหลังเป็นระยะ พร้อมใช้งานตั้งแต่ iOS 7 และแนะนำให้แทนที่ด้วย BGTaskScheduler
  • ระบบควบคุม ความถี่ในการเรียกโดยวิเคราะห์พฤติกรรมผู้ใช้ — นักพัฒนาไม่สามารถรับประกันเวลาในการปลุก
  • สามสถานะของตัวจัดการความสำเร็จ — .newData, .noData, .failed — ส่งผลต่อความถี่ในการปลุกแอปในอนาคต
  • ข้อจำกัด 30 วินาที — อย่ารันการทำงานยาวหรือคำขอเครือข่ายหลายรายการตามลำดับ
  • ความสามารถบังคับ — Background Fetch ใน Xcode + การตั้งค่า minimumBackgroundFetchInterval ในโค้ด
  • BGTaskScheduler คือตัวแทนที่ทันสมัยตั้งแต่ iOS 13+ ให้การควบคุมมากขึ้นและงานสองประเภท
  • สำหรับโปรเจกต์ที่รองรับ iOS 12 และต่ำกว่า ให้ใช้ Background Fetch พร้อมตรวจสอบความพร้อมใช้งานของ BGTaskScheduler ผ่าน if #available

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

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

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

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