Background Fetch เป็นกลไกของ iOS ที่ปลุกแอปเป็นระยะในพื้นหลังเพื่อดาวน์โหลดเนื้อหาใหม่ ระบบจะวิเคราะห์พฤติกรรมของผู้ใช้และเลือกช่วงเวลาที่เหมาะสมที่สุดสำหรับการอัปเดต ตามข้อมูลของ Apple, 2026 แอปมีเวลา 30 ถึง 120 วินาทีในการดำเนินการ หลังจากนั้นระบบจะระงับหรือสิ้นสุดกระบวนการ
ประเด็นสำคัญ
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 และต่ำกว่า
iOS ใช้อัลกอริทึมการเรียนรู้ของเครื่องเพื่อกำหนดเวลาที่เหมาะสมที่สุดในการปลุกแอป ระบบจะวิเคราะห์ว่าผู้ใช้มักเปิดแอปเมื่อใด ใช้นานเท่าใด และกลับมาบ่อยแค่ไหน จากข้อมูลนี้ iOS จะคำนวณช่วงเวลาสำหรับ Background Fetch
เมื่อระบบตัดสินใจปลุกแอป มันจะเรียกเมธอด application(_:performFetchWithCompletionHandler:) ใน AppDelegate แอปควรโหลดข้อมูลใหม่จำนวนน้อยที่สุดและเรียกตัวจัดการความสำเร็จด้วยหนึ่งในสามสถานะ: .newData (โหลดข้อมูลแล้ว), .noData (ไม่มีข้อมูลใหม่) หรือ .failed (ข้อผิดพลาด) สถานะจะส่งผลต่อความถี่ในการปลุกในอนาคต
สถานะ .newData บอกระบบว่าการอัปเดตมีประโยชน์ — iOS อาจเพิ่มความถี่ในการปลุก .noData บ่งชี้ว่าไม่มีข้อมูล — ความถี่ยังคงเดิมหรือลดลง .failed แสดงถึงปัญหา — ระบบลดความถี่เพื่อประหยัดแบตเตอรี่ ควรเน้นที่สถานะที่ซื่อสัตย์ ไม่ใช่การบังคับ .newData
| สถานะ | ความหมาย | ผลกระทบ |
|---|---|---|
| .newData | โหลดข้อมูลสำเร็จ | ความถี่อาจเพิ่มขึ้น |
| .noData | การตรวจสอบไม่มีข้อมูลใหม่ | ความถี่คงเดิม |
| .failed | ข้อผิดพลาดเครือข่ายหรือเซิร์ฟเวอร์ | ความถี่ลดลง |
เพื่อเปิดใช้งาน Background Fetch จำเป็นต้องทำสองขั้นตอน: เปิดใช้งานความสามารถใน Xcode และตั้งค่าช่วงเวลาขั้นต่ำในโค้ด ความสามารถอยู่ใน Target — Signing & Capabilities — Background Modes — ทำเครื่องหมายที่ช่อง Background Fetch หากไม่มีขั้นตอนนี้ ระบบจะไม่ปลุกแอป
เมธอด UIApplication.shared.setMinimumBackgroundFetchInterval กำหนดเวลาขั้นต่ำเป็นวินาทีระหว่างการเรียก Fetch ค่า UIApplication.backgroundFetchIntervalMinimum (ประมาณ 15 นาที) บอกระบบให้ปลุกแอปบ่อยเท่าที่ประหยัดพลังงาน การตั้งค่าช่วงเวลาใน application(_:didFinishLaunchingWithOptions:) เป็นแนวทางปฏิบัติมาตรฐาน
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
return true
}
เมื่อเปิดใช้งาน Background Fetch ใน Xcode มันจะอัปเดต Info.plist โดยอัตโนมัติ — เพิ่มคีย์ UIBackgroundModes ด้วยค่า fetch นี่เป็นขั้นตอนบังคับ: หากไม่มี แอปจะไม่ได้รับการเรียก performFetchWithCompletionHandler คุณสามารถตรวจสอบผ่าน P list Source หรือ Build Settings
มาดูการใช้งาน Background Fetch แบบสมบูรณ์สำหรับแอปข่าว การทำงานรวมถึงการโหลดข้อมูล การแคช และการเรียกตัวจัดการความสำเร็จ โค้ดทำงานใน AppDelegate — ที่เดียวที่ระบบเรียก fetch
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 ในเธรดหลัก
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()
}
}
สำหรับการทดสอบ ให้ใช้ 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 เสร็จสิ้น แต่จะไม่ติดตามความคืบหน้าจนกว่าจะปลุกครั้งถัดไป
ตั้งแต่ iOS 13 เป็นต้นไป Apple แนะนำ BGTaskScheduler เป็นตัวแทนของ Background Fetch BGTaskScheduler ให้การจัดตารางเวลาที่ยืดหยุ่นกว่า งานสองประเภท (รีเฟรชและประมวลผล) และการลงทะเบียนงานด้วยตัวระบุ การโยกย้ายมีหลายขั้นตอนและแนะนำสำหรับโปรเจกต์ใหม่ทั้งหมด
ขั้นตอนแรก — กำหนดตัวระบุงานใน Info.plist ผ่านคีย์ BGTaskSchedulerPermittedIdentifiers ขั้นตอนที่สอง — ลงทะเบียนงานใน AppDelegate ผ่าน BGTaskScheduler.shared.register ขั้นตอนที่สาม — แทนที่การเรียก performFetchWithCompletionHandler ด้วยตัวจัดการที่ส่งไปยัง register ขั้นตอนที่สี่ — เรียก submit เพื่อจัดตารางงาน
// ก่อน (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 ให้ การควบคุมมากขึ้น: BGProcessingTask สำหรับการทำงานยาว (สูงสุด 10 นาที), เงื่อนไขการทำงานผ่าน requiresNetworkConnectivity และ requiresExternalPower, และตัวจัดการหมดอายุสำหรับการสิ้นสุดอย่างราบรื่น ระบบยังวิเคราะห์การใช้งานแอป แต่นักพัฒนาสามารถกำหนดข้อกำหนดที่แม่นยำมากขึ้น
หากแอปรองรับ iOS 12 และต่ำกว่า Background Fetch ยังคงเป็นตัวเลือกเดียวสำหรับการอัปเดตเป็นระยะ BGTaskScheduler พร้อมใช้งานตั้งแต่ iOS 13+ เท่านั้น ในกรณีนี้ ให้ใช้ wrapper: ตรวจสอบความพร้อมใช้งานผ่าน if #available(iOS 13, *) และเรียก API ที่เหมาะสม
คำถามที่พบบ่อย
ความถี่ที่แน่นอนไม่ได้ถูกบันทึกและขึ้นอยู่กับพฤติกรรมของผู้ใช้ ระบบวิเคราะห์ ว่าผู้ใช้เปิดแอปบ่อยแค่ไหนและปรับความถี่ตามนั้น โดยเฉลี่ย เมื่อใช้งานบ่อย fetch อาจถูกเรียก 1–3 ครั้งต่อชั่วโมง เมื่อใช้งานน้อย — 1–2 ครั้งต่อวัน
ตรวจสอบสามเงื่อนไข: ความสามารถ Background Fetch เปิดใช้งานใน Xcode หรือไม่, ตั้งค่า minimumBackgroundFetchInterval แล้ว และผู้ใช้ไม่ได้ปิด Background App Refresh สำหรับแอปในการตั้งค่า นอกจากนี้ตรวจสอบว่าอุปกรณ์ไม่ได้อยู่ในโหมดประหยัดพลังงานและระดับแบตเตอรี่สูงกว่า 20%
Background Fetch คือ API เก่า (iOS 7), BGAppRefreshTask คือ API ใหม่ (iOS 13+) BGAppRefreshTask ให้การควบคุมมากขึ้น: ตัวจัดการหมดอายุ, ความสามารถในการจัดตารางใหม่ และการตรวจสอบสถานะ Background Fetch ใช้งานง่ายกว่าแต่ยืดหยุ่นน้อยกว่า Apple แนะนำให้ใช้ BGAppRefreshTask สำหรับโปรเจกต์ใหม่
ไม่แนะนำ Background Fetch มีข้อจำกัดด้านเวลา (สูงสุด 30 วินาที) สำหรับการดาวน์โหลดขนาดใหญ่ ให้ใช้ URLSession พร้อมการกำหนดค่าพื้นหลัง — ระบบจะดาวน์โหลดต่อแม้หลังจาก fetch เสร็จสิ้น ทางเลือกคือ BGProcessingTask (iOS 13+) ซึ่งอนุญาตสูงสุด 10 นาทีและเงื่อนไขการชาร์จ
ใช่ การปลุกแต่ละครั้งใช้พลังงานในการเปิดโปรเซสเซอร์, เริ่มต้นสแต็กเครือข่าย และโหลดข้อมูล iOS ปรับความถี่ให้เหมาะสม เพื่อลดผลกระทบ ด้วยการใช้งานที่ถูกต้อง — โหลดเฉพาะข้อมูลใหม่, เรียกตัวจัดการความสำเร็จอย่างรวดเร็ว — ผลกระทบต่อแบตเตอรี่น้อยมาก
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม