Background Modes คือชุดความสามารถที่สามารถประกาศได้ของ iOS ที่ทำให้แอพสามารถดำเนินโค้ดต่อไปหลังจากเข้าสู่โหมดพื้นหลัง แต่ละโหมดจะตรงกับงานประเภทใดประเภทหนึ่ง: เสียง, ตำแหน่งที่ตั้ง, VoIP, Bluetooth, fetch และ processing ตามข้อมูลจาก Apple, 2026 การใช้ Background Modes อย่างไม่ถูกต้องเป็นสาเหตุทั่วไปของการปฏิเสธแอพระหว่างการตรวจสอบใน App Store
โดยสรุป
Background Modes คือความสามารถของโปรเจกต์ Xcode ที่ประกาศความตั้งใจของแอพที่จะดำเนินการเฉพาะประเภทในพื้นหลัง ต่างจาก Android ที่แอพสามารถเริ่มต้น Service ใดก็ได้ในพื้นหลัง iOS ต้องการการประกาศโหมดอย่างชัดเจนใน Info.plist แต่ละโหมดมีกฎการใช้งานที่เข้มงวดและจะถูกตรวจสอบโดย Apple ระหว่างการตรวจสอบ
เมื่อแอพเข้าสู่พื้นหลัง iOS จะระงับมันภายใน 3–5 วินาที หากแอพประกาศ Background Mode และใช้ API ที่เกี่ยวข้องอย่างจริงจัง (เช่น AVAudioSession สำหรับเสียง) ระบบจะวางมันไว้ในโหมดการทำงานพิเศษ แอพจะอยู่ในหน่วยความจำ และสามารถดำเนินโค้ดที่จำกัดโดยประเภทโหมด
iOS รองรับ Background Modes ต่อไปนี้: เสียง, ตำแหน่ง, VoIP, Bluetooth LE (อุปกรณ์ BLE), Background Fetch (อัพเดตตามระยะ), Background Processing (งานระยะยาว), External Accessory Communication, Push to Talk (PTT) และ HealthKit แต่ละโหมด ต้องการคำอธิบายในคำอธิบายแอพ
| โหมด | คีย์ Info.plist | วัตถุประสงค์ | เวอร์ชัน iOS |
|---|---|---|---|
| Audio | audio | เสียงพื้นหลัง, AirPlay | 4.0+ |
| Location | location | ติดตามตำแหน่ง | 4.0+ |
| VoIP | voip | การแจ้งเตือนแบบผลัก VoIP | 4.0+ |
| BLE | bluetooth-central | การทำงานกับอุปกรณ์ BLE | 7.0+ |
| Fetch | fetch | ดาวน์โหลดข้อมูลตามระยะ | 7.0+ |
| Processing | processing | งานพื้นหลังระยะยาว | 13.0+ |
| Push to Talk | push-to-talk | เสียง push-to-talk | 16.0+ |
โหมดเสียงพื้นหลัง เป็นโหมดที่พบบ่อยที่สุด ใช้โดยโปรแกรมเพลง, แอพพอดคาสท์ และบริการเสียง แอพสามารถเล่นเสียงต่อไป ควบคุมผ่านศูนย์ควบคุม และปรากฏบนหน้าจอล็อค เพื่อเปิดใช้งาน เพียงแค่ตั้งค่า AVAudioSession ด้วยหมวดหมู่ .playback
เพื่อให้เสียงทำงานในพื้นหลัง จำเป็นต้องตั้งค่า AVAudioSession และเปิดใช้งานมัน หมวดหมู่ .playback บอกระบบว่าแอพกำลังเล่นเสียงและควรคงทำงานในพื้นหลัง หากไม่มีการตั้งค่านี้ เสียงจะหยุดภายใน 5–10 วินาทีหลังจากย่อแอพ
import AVFoundation
func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(
.playback,
mode: .default,
options: []
)
try session.setActive(true)
} catch {
print("ข้อผิดพลาดเซสชันเสียง: \(error)")
}
}
สำหรับการผนวกกับ ศูนย์ควบคุม และหน้าจอล็อค ต้องตั้งค่า MPRemoteCommandCenter โดยจะจัดการคำสั่ง เล่น, หยุดชั่วคราว, ถัดไป และ ย้อนกลับ นอกจากนี้ยังต้องอัพเดต MPNowPlayingInfoProperty เพื่อแสดงเมตาดาต้า: ชื่อเพลง, ศิลปิน, ภาพปก และความคืบหน้าการเล่น
เริ่มต้นตั้งแต่ iOS 14 โหมดเสียงพื้นหลังยังรองรับ Picture in Picture สำหรับวิดีโอ แอพสามารถแสดงวิดีโอต่อไปในหน้าต่างลอยเมื่อย่อแอพ เพื่อเปิดใช้งาน ใช้ AVPictureInPictureController กับ AVPlayerLayer โหมดนี้จะทำงานเมื่อแอพกำลังเล่นแทร็กเสียงเท่านั้น
โหมดตำแหน่งพื้นหลัง ช่วยให้แอพสามารถรับอัพเดตตำแหน่งในพื้นหลัง ใช้ในแอพนำทาง, ตัวติดตามฟิตเนส, แอพจัดส่ง และโซเชียลมีเดีย หากไม่มีโหมดนี้ แอพจะรับตำแหน่งเพียงครั้งเดียวเมื่อเข้าสู่พื้นหลัง หลังจากนั้นอัพเดตจะหยุดลง
CLLocationManager รองรับหลายกลวิธีการติดตาม: การเปลี่ยนแปลงตำแหน่งที่สำคัญ, การติดตามตำแหน่งมาตรฐาน และการตรวจสอบภูมิภาค สำหรับงานเบื้องหลังด้วยความแม่นยำสูงสุด ใช้ allowsBackgroundLocationUpdates = true และ pausesLocationUpdatesAutomatically = false
การติดตามตำแหน่งอย่างต่อเนื่องในพื้นหลังเป็นหนึ่งในสถานการณ์ที่ใช้พลังงานมากที่สุด iOS จะปรับความถี่ของการอัพเดตโดยอัตโนมัติ ตามความเร็วของการเคลื่อนไหว: เมื่อเดิน ทุก 10–30 วินาที เมื่อขับรถ ทุก 1–5 วินาที สำหรับการนำทาง ใช้ desiredAccuracy = kCLLocationAccuracyBestForNavigation
let locationManager = CLLocationManager()
locationManager.requestAlwaysAuthorization()
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.activityType = .fitness
locationManager.startUpdatingLocation()
โหมด significant-change location ทำงานโดยไม่ต้องใช้โหมดตำแหน่งพื้นหลัง — ระบบจะปลุกแอพเมื่อพิกัดเปลี่ยนแปลงอย่างมีนัยสำคัญ (โดยทั่วไป 500 เมตรหรือมากกว่า) ไม่ต้องใช้ GPS ตลอดเวลา ช่วยประหยัดแบตเตอรี่ เหมาะสำหรับแอพสภาพอากาศที่อัพเดตข้อมูลเมื่อผู้ใช้เคลื่อนย้าย
โหมด Bluetooth LE พื้นหลัง ช่วยให้แอพสามารถโต้ตอบกับอุปกรณ์ BLE ในพื้นหลัง ใช้ในสายรัดฟิตเนส, เซ็นเซอร์ทางการแพทย์, อุปกรณ์ Smart Home และการนำทางด้วยบีคอน โหมดแบ่งเป็นสองประเภทย่อย: bluetooth-central (แอพเชื่อมต่อกับอุปกรณ์) และ bluetooth-peripheral (แอพทำหน้าที่เป็นอุปกรณ์)
แอพที่ทำหน้าที่เป็น Central สามารถสแกนและเชื่อมต่อกับอุปกรณ์ BLE ในพื้นหลัง โดยระบุ bluetooth-central ใน Background Modes และเรียกใช้ CBCentralManager.scanForPeripherals ด้วยตัวเลือก CBCentralManagerScanOptionAllowDuplicatesKey ในพื้นหลัง การสแกนจะทำงานด้วยความถี่ต่ำลง — ระบบอาจหน่วงการค้นหาเพื่อประหยัดพลังงาน
แอพที่ทำหน้าที่เป็น Peripheral สามารถประกาศบริการและตอบสนองต่อคำขอจากอุปกรณ์อื่น โหมด bluetooth-peripheral ช่วยให้แอพสามารถมองเห็นได้สำหรับอุปกรณ์ BLE อื่นแม้ในพื้นหลัง ใช้ในแอพ HealthKit และโซลูชัน IoT
การตรวจสอบ iBeacon ทำงานในพื้นหลังโดยไม่ต้องใช้อนุญาตเพิ่มเติม — ระบบจะติดตามการเข้าและออกจากภูมิภาค Beacon เอง แต่การสแกนเนื้อหา Beacon (proximity UUID, major, minor) ต้องใช้อนุญาต Bluetooth และ bluetooth-central Background Mode ใช้ CLLocationManager กับ CLBeaconRegion สำหรับการตรวจสอบ
โหมด VoIP พื้นหลัง ถูกออกแบบมาสำหรับแอพสื่อสารด้วยเสียง (Skype, Zoom, WhatsApp) โหมดนี้ช่วยให้แอพสามารถเชื่อมต่อกับเซิร์ฟเวอร์ไว้เพื่อรับสายเข้า เริ่มต้นตั้งแต่ iOS 8 ใช้ PushKit สำหรับ VoIP — เฟรมเวิร์คที่จัดการการแจ้งเตือนแบบผลักจากเซิร์ฟเวอร์ VoIP โดยไม่ต้องใช้ APNs
PushKit เป็นกลไกเดียวที่รับประกันการส่งมอบการแจ้งเตือน VoIP ไปยังอุปกรณ์ เมื่อได้รับการแจ้งเตือน PushKit ระบบจะปลุกแอพแม้ว่าจะถูกยุติแล้วก็ตาม แอพต้องสร้างการเชื่อมต่อกับเซิร์ฟเวอร์ภายใน 30 วินาทีและแสดงการแจ้งเตือนในเครื่องสำหรับสายเข้า
import PushKit
class VoIPHandler: NSObject, PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping () -> Void
) {
let caller = payload.dictionaryPayload["caller"] as! String
reportIncomingCall(from: caller)
completion()
}
}
PushKit ไม่สามารถใช้กับการแจ้งเตือนทั่วไป — ใช้กับ VoIP, watchOS และผู้ให้บริการไฟล์เท่านั้น Apple จะตรวจสอบ เรื่องนี้ระหว่างการตรวจสอบ การใช้งานอย่างไม่เหมาะสมนำไปสู่การปฏิเสธแอพ เริ่มต้นตั้งแต่ iOS 13 PushKit จะส่งมอบเฉพาะการแจ้งเตือน — การเรียก CXProvider (CallKit) เพื่อแสดงหน้าจอสายเป็นสิ่งบังคับ
Background Fetch และ Background Processing เป็นโหมดสำหรับการอัพเดตเนื้อหาในพื้นหลังและงานระยะยาว Fetch สำหรับการอัพเดตตามระยะสั้น (สูงสุด 30 วินาที), Processing สำหรับงานระยะยาว (สูงสุด 10 นาที) โดยมีเงื่อนไข (Wi-Fi, การชาร์จ) Processing ใช้ได้ใน iOS 13+ เท่านั้น
โหมด Fetch ช่วยให้ระบบสามารถปลุกแอพเป็นระยะเพื่อดาวน์โหลดเนื้อหาใหม่ ระบบจะวิเคราะห์พฤติกรรมของผู้ใช้และเลือกเวลาที่เหมาะสมที่สุด แอพต้องเรียก completion handler ภายใน 30 วินาที Fetch เหมาะสำหรับแอพข่าว, ฟีดโซเชียลมีเดีย และสภาพอากาศ
BGProcessingTask ถูกออกแบบมาสำหรับงานที่สามารถทำได้โดยไม่ต้องใช้ผู้ใช้: ทำความสะอาดแคช, ซิงโครไนซ์ฐานข้อมูลขนาดใหญ่, ประมวลผลไฟล์มีเดีย ระบบจะเริ่มงานภายใต้เงื่อนไขที่เอื้ออำนวยเท่านั้น — อุปกรณ์กำลังชาร์จ, เชื่อมต่อ Wi-Fi, ไม่อยู่ในโหมดประหยัดพลังงานต่ำ ใช้ได้นานสูงสุด 10 นาที
สำหรับ BGProcessingTask ต้องระบุ requiresExternalPower และ requiresNetworkConnectivity ระบบอาจเลื่อนการดำเนินงานออกไปอย่างไม่มีกำหนดหากไม่ตรงตามเงื่อนไข ต่างจาก BGAppRefreshTask ที่ต้องทำงานอย่างน้อยวันละครั้ง Processing อาจไม่ทำงานเป็นเวลาหลายสัปดาห์หากอุปกรณ์ไม่ค่อยชาร์จ
Apple ตรวจสอบการใช้ Background Modes อย่างเข้มงวดระหว่างการตรวจสอบแอพ กฎหลัก: แต่ละโหมดที่เปิดใช้งานต้องอธิบายได้โดยฟังก์ชันการทำงานของแอพ หากแอพประกาศใช้ Location Mode แต่ไม่ใช้ตำแหน่งที่ตั้ง มันจะถูกปฏิเสธโดยต้องลบความสามารถนั้นออก
การละเมิดที่พบบ่อยที่สุด: Location Mode โดยไม่มีความจำเป็นที่ชัดเจน (แอพขอเข้าถึงแบบ "ตลอดเวลา" เพื่อแสดงโฆษณา), Audio Mode โดยไม่มีการเล่นเสียงในพื้นหลัง, VoIP โดยไม่มี PushKit, BLE Mode โดยไม่มีอุปกรณ์ Bluetooth Apple อาจปฏิเสธแอพแม้ในขั้นตอนอัพเดตหากไม่ใช้โหมดนั้นอีกต่อไป
เมื่อส่งเพื่อการตรวจสอบ ให้ระบุเหตุผลเฉพาะสำหรับแต่ละโหมดใน หมายเหตุ ตัวอย่างเช่น "Location Background Mode ใช้เพื่อติดตามเส้นทางของผู้ใช้ในฟีเจอร์ฟิตเนส" หากไม่มีคำอธิบาย ผู้ตรวจสอบอาจปฏิเสธแอพ สำหรับฟีเจอร์ที่เป็นความลับ (VoIP) Apple อาจขอบัญชีทดสอบ
ใช้ชุดโหมดที่จำเป็นขั้นต่ำที่สุด หากแอพของคุณต้องการดาวน์โหลดข้อมูลในพื้นหลังชั่วโมงละครั้ง — อย่าเปิดใช้ Location Mode ให้ใช้ Fetch หรือ BGAppRefreshTask แทน โหมดที่เกินความจำเป็น ไม่เพียงแต่นำไปสู่การปฏิเสธแต่ยังสร้างความประทับใจที่ไม่ดี: ผู้ใช้จะเห็นในการตั้งค่าว่าแอพใช้ตำแหน่งที่ตั้งในพื้นหลัง
คำถามที่พบบ่อย
ไม่มีข้อจำกัดด้านจำนวน แต่ แต่ละโหมด ต้องอธิบายได้โดยฟังก์ชันการทำงานของแอพ การเปิดใช้งานทุกโหมดโดยไม่จำเป็นเป็นสาเหตุแน่นอนของการปฏิเสธระหว่างการตรวจสอบ ข้อจำกัดในทางปฏิบัติคือ 2–3 โหมดต่อแอพ มิฉะนั้นผู้ใช้จะเห็นคำขออนุญาตจำนวนมาก
ใช้ UIApplication.shared.applicationState — แอพสามารถตรวจสอบได้ว่าอยู่ในพื้นหลังหรือไม่ (state == .background) นอกจากนี้ยังสามารถติดตามการแจ้งเตือน UIApplication.didEnterBackgroundNotification และ willEnterForegroundNotification เพื่อสลับพฤติกรรม
Audio — เล่นเสียงผ่านลำโพงหรือหูฟัง AirPlay — สตรีมเสียงและวิดีโอไปยัง Apple TV และอุปกรณ์ AirPlay อื่น ในทางปฏิบัติ โหมด Audio ครอบคลุมทั้งสองสถานการณ์เนื่องจาก AirPlay ใช้เซสชันเสียง ไม่จำเป็นต้องใช้โหมด AirPlay แยกต่างหากตั้งแต่ iOS 7+
ใช่ สำหรับสิ่งนี้ให้ใช้ requestWhenInUseAuthorization() แทน requestAlwaysAuthorization() แอพจะรับตำแหน่งเฉพาะในเบื้องหน้าเท่านั้น หากต้องการติดตามสั้นๆ ในพื้นหลัง ให้เรียก startUpdatingLocation() และหยุดใน willResignActive
แต่ละโหมดเพิ่มการใช้พลังงาน Location Mode ใช้พลังงานมากที่สุด สามารถลดอายุแบตเตอรี่ลง 30–50% เมื่อติดตามต่อเนื่อง โหมดเสียงอยู่ในระดับปานกลาง (15–20%) Fetch และ Processing อยู่ในระดับน้อยที่สุด (2–5%) BLE Mode อยู่ในระดับต่ำ (5–10%) เนื่องจากประสิทธิภาพพลังงานของ Bluetooth LE
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม