Background Modes là một tập hợp các khả năng có thể khai báo của iOS cho phép ứng dụng tiếp tục thực thi mã sau khi chuyển sang chế độ nền. Mỗi chế độ tương ứng với một loại tác vụ cụ thể: âm thanh, định vị, VoIP, Bluetooth, fetch và processing. Theo Apple, 2026, việc sử dụng Background Modes không đúng cách là một trong những nguyên nhân phổ biến khiến ứng dụng bị từ chối trong quá trình xem xét trên App Store.
Điểm chính
Background Modes là các khả năng của dự án Xcode khai báo ý định của ứng dụng thực hiện các loại thao tác cụ thể trong nền. Khác với Android, nơi ứng dụng có thể khởi chạy bất kỳ Service nào trong nền, iOS yêu cầu khai báo rõ ràng chế độ trong Info.plist. Mỗi chế độ có quy tắc sử dụng nghiêm ngặt và được Apple kiểm tra trong quá trình xem xét.
Khi ứng dụng chuyển sang nền, iOS tạm dừng nó trong vòng 3–5 giây. Nếu ứng dụng khai báo Background Mode và sử dụng API tương ứng (ví dụ AVAudioSession cho âm thanh), hệ thống sẽ đưa nó vào chế độ thực thi đặc biệt. Ứng dụng vẫn ở lại trong bộ nhớ và có thể thực thi mã bị giới hạn bởi loại chế độ.
iOS hỗ trợ các Background Modes sau: Âm thanh, Vị trí, VoIP, Bluetooth LE (phụ kiện BLE), Background Fetch (cập nhật định kỳ), Background Processing (tác vụ dài), External Accessory Communication, Push to Talk (PTT) và HealthKit. Mỗi chế độ cần có lý do giải trình trong mô tả ứng dụng.
| Chế độ | Khóa Info.plist | Mục đích | Phiên bản iOS |
|---|---|---|---|
| Audio | audio | Âm thanh nền, AirPlay | 4.0+ |
| Location | location | Theo dõi vị trí | 4.0+ |
| VoIP | voip | Thông báo push VoIP | 4.0+ |
| BLE | bluetooth-central | Làm việc với thiết bị BLE | 7.0+ |
| Fetch | fetch | Tải dữ liệu định kỳ | 7.0+ |
| Processing | processing | Tác vụ nền dài | 13.0+ |
| Push to Talk | push-to-talk | 16.0+ |
Chế độ âm thanh nền là chế độ phổ biến nhất, được sử dụng bởi trình phát nhạc, ứng dụng podcast và dịch vụ âm thanh. Ứng dụng có thể tiếp tục phát âm thanh, được điều khiển qua Trung tâm điều khiển và xuất hiện trên Màn hình khóa. Để kích hoạt, chỉ cần cấu hình AVAudioSession với danh mục .playback.
Để âm thanh hoạt động trong nền, cần cấu hình AVAudioSession và kích hoạt nó. Danh mục .playback cho hệ thống biết rằng ứng dụng đang phát âm thanh và phải duy trì hoạt động trong nền. Nếu không có cấu hình này, âm thanh sẽ dừng sau 5–10 giây kể từ khi thu nhỏ ứng dụng.
import AVFoundation
func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(
.playback,
mode: .default,
options: []
)
try session.setActive(true)
} catch {
print("Lỗi phiên âm thanh: \(error)")
}
}
Để tích hợp với Trung tâm điều khiển và Màn hình khóa, cần cấu hình MPRemoteCommandCenter. Nó xử lý các lệnh Phát, Tạm dừng, Tiếp theo và Trước đó. Cũng cần cập nhật MPNowPlayingInfoProperty để hiển thị siêu dữ liệu: tên bài hát, nghệ sĩ, ảnh bìa và tiến trình phát.
Bắt đầu từ iOS 14, Chế độ âm thanh nền cũng hỗ trợ Picture in Picture cho video. Ứng dụng có thể tiếp tục hiển thị video trong cửa sổ nổi khi thu nhỏ. Để kích hoạt, sử dụng AVPictureInPictureController với AVPlayerLayer. Chế độ này chỉ hoạt động nếu ứng dụng đang phát track âm thanh.
Chế độ vị trí nền cho phép ứng dụng nhận cập nhật vị trí trong nền. Nó được sử dụng trong ứng dụng điều hướng, trình theo dõi thể dục, ứng dụng giao hàng và mạng xã hội. Nếu không có chế độ này, ứng dụng chỉ nhận vị trí một lần khi chuyển sang nền, sau đó các cập nhật sẽ dừng.
CLLocationManager hỗ trợ nhiều chiến lược theo dõi: thay đổi vị trí đáng kể, theo dõi vị trí tiêu chuẩn và giám sát vùng. Để làm việc trong nền với độ chính xác tối đa, sử dụng allowsBackgroundLocationUpdates = true và pausesLocationUpdatesAutomatically = false.
Theo dõi vị trí liên tục trong nền là một trong những kịch bản tốn nhiều năng lượng nhất. iOS tự động điều chỉnh tần suất cập nhật dựa trên tốc độ di chuyển: khi đi bộ, cập nhật mỗi 10–30 giây; khi lái xe, mỗi 1–5 giây. Để điều hướng, sử dụng desiredAccuracy = kCLLocationAccuracyBestForNavigation.
let locationManager = CLLocationManager()
locationManager.requestAlwaysAuthorization()
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.activityType = .fitness
locationManager.startUpdatingLocation()
Chế độ significant-change location hoạt động mà không cần Chế độ vị trí nền — hệ thống đánh thức ứng dụng chỉ khi tọa độ thay đổi đáng kể (thường là 500 m trở lên). Không yêu cầu GPS liên tục, tiết kiệm pin. Phù hợp cho ứng dụng thời tiết cập nhật dữ liệu khi người dùng di chuyển.
Chế độ Bluetooth LE nền cho phép ứng dụng tương tác với thiết bị BLE trong nền. Nó được sử dụng trong vòng đeo thể dục, cảm biến y tế, thiết bị nhà thông minh và điều hướng bằng Beacon. Chế độ này được chia thành hai loại phụ: bluetooth-central (ứng dụng kết nối với thiết bị) và bluetooth-peripheral (ứng dụng hoạt động như một thiết bị).
Ứng dụng hoạt động như Central có thể quét và kết nối với thiết bị BLE trong nền. Để làm điều này, hãy chỉ định bluetooth-central trong Background Modes và gọi CBCentralManager.scanForPeripherals với tùy chọn CBCentralManagerScanOptionAllowDuplicatesKey. Trong nền, việc quét hoạt động ở tần suất thấp hơn — hệ thống có thể trì hoãn việc phát hiện để tiết kiệm năng lượng.
Ứng dụng hoạt động như Peripheral có thể quảng cáo dịch vụ và trả lời yêu cầu từ thiết bị khác. Chế độ bluetooth-peripheral cho phép ứng dụng duy trì khả năng hiển thị với các thiết bị BLE khác ngay cả trong nền. Nó được sử dụng trong các ứng dụng HealthKit và giải pháp IoT.
Giám sát iBeacon hoạt động trong nền mà không cần quyền bổ sung — hệ thống tự theo dõi việc ra vào các vùng Beacon. Nhưng để quét nội dung Beacon (UUID khoảng cách, major, minor) cần có quyền Bluetooth và chế độ bluetooth-central Background Mode. Sử dụng CLLocationManager với CLBeaconRegion để giám sát.
Chế độ VoIP nền được thiết kế cho các ứng dụng thoại (Skype, Zoom, WhatsApp). Chế độ này cho phép ứng dụng duy trì kết nối với máy chủ để nhận cuộc gọi đến. Bắt đầu từ iOS 8, PushKit được sử dụng cho VoIP — một framework xử lý thông báo push từ máy chủ VoIP mà không cần APNs.
PushKit là cơ chế duy nhất đảm bảo phân phối thông báo VoIP đến thiết bị. Khi nhận được thông báo PushKit, hệ thống đánh thức ứng dụng, ngay cả khi nó đã bị kết thúc. Ứng dụng phải thiết lập kết nối với máy chủ trong vòng 30 giây và hiển thị thông báo cục bộ cho cuộc gọi đến.
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 không thể được sử dụng cho thông báo thông thường — chỉ dành cho VoIP, liên lạc watchOS và nhà cung cấp tệp. Apple kiểm tra điều này trong quá trình xem xét. Sử dụng không đúng cách dẫn đến từ chối ứng dụng. Bắt đầu từ iOS 13, PushKit chỉ phân phối thông báo — việc gọi CXProvider (CallKit) để hiển thị màn hình cuộc gọi là bắt buộc.
Background Fetch và Background Processing là các chế độ để cập nhật nội dung nền và các tác vụ dài. Fetch dành cho cập nhật định kỳ ngắn (tối đa 30 giây), Processing dành cho tác vụ dài (tối đa 10 phút) với điều kiện (Wi-Fi, sạc). Processing chỉ khả dụng trên iOS 13+.
Chế độ Fetch cho phép hệ thống đánh thức ứng dụng định kỳ để tải nội dung mới. Hệ thống phân tích hành vi người dùng và chọn thời điểm tối ưu. Ứng dụng phải gọi completion handler trong vòng 30 giây. Fetch phù hợp cho ứng dụng tin tức, nguồn cấp dữ liệu mạng xã hội và thời tiết.
BGProcessingTask được thiết kế cho các tác vụ có thể chạy mà không cần sự can thiệp của người dùng: dọn bộ nhớ đệm, đồng bộ hóa cơ sở dữ liệu lớn, xử lý tệp phương tiện. Hệ thống chỉ bắt đầu tác vụ trong điều kiện thuận lợi — thiết bị đang sạc, kết nối Wi-Fi, không ở chế độ năng lượng thấp. Khả dụng tối đa 10 phút.
Đối với BGProcessingTask, cần chỉ định requiresExternalPower và requiresNetworkConnectivity. Hệ thống có thể hoãn thực thi vô thời hạn nếu các điều kiện không được đáp ứng. Không giống như BGAppRefreshTask, phải chạy ít nhất một lần mỗi ngày, Processing có thể không chạy trong nhiều tuần nếu thiết bị hiếm khi được sạc.
Apple kiểm tra nghiêm ngặt việc sử dụng Background Modes trong quá trình xem xét ứng dụng. Quy tắc chính: mỗi chế độ được bật phải được biện minh bởi chức năng của ứng dụng. Nếu ứng dụng khai báo Location Mode nhưng không sử dụng định vị, nó sẽ bị từ chối với yêu cầu xóa khả năng.
Các vi phạm phổ biến nhất: Location Mode mà không có nhu cầu rõ ràng (ứng dụng yêu cầu quyền truy cập “Luôn luôn” để hiển thị quảng cáo), Audio Mode không có phát âm thanh nền, VoIP không có PushKit, BLE Mode không có thiết bị Bluetooth. Apple có thể từ chối ứng dụng ngay cả ở giai đoạn cập nhật nếu chế độ không còn được sử dụng.
Khi gửi đi xem xét, hãy cung cấp lý do cụ thể cho từng chế độ trong Ghi chú. Ví dụ, “Location Background Mode được sử dụng để theo dõi lộ trình của người dùng trong tính năng thể dục.” Nếu không có giải thích, người xem xét có thể từ chối ứng dụng. Đối với các tính năng bảo mật (VoIP), Apple có thể yêu cầu tài khoản thử nghiệm.
Sử dụng bộ chế độ tối thiểu cần thiết. Nếu ứng dụng cần tải dữ liệu nền mỗi giờ một lần — đừng bật Location Mode, hãy sử dụng Fetch hoặc BGAppRefreshTask. Các chế độ thừa không chỉ dẫn đến từ chối mà còn tạo ấn tượng tiêu cực: người dùng thấy trong Cài đặt rằng ứng dụng sử dụng định vị trong nền.
Câu hỏi thường gặp
Không có giới hạn về số lượng, nhưng mỗi chế độ phải được biện minh bởi chức năng của ứng dụng. Bật tất cả các chế độ mà không cần thiết là nguyên nhân chắc chắn bị từ chối trong quá trình xem xét. Giới hạn thực tế là 2–3 chế độ cho mỗi ứng dụng, nếu không người dùng sẽ thấy quá nhiều yêu cầu cấp quyền.
Sử dụng UIApplication.shared.applicationState — ứng dụng có thể kiểm tra xem nó có đang ở nền hay không (state == .background). Bạn cũng có thể theo dõi các thông báo UIApplication.didEnterBackgroundNotification và willEnterForegroundNotification để chuyển đổi hành vi.
Audio — phát âm thanh qua loa hoặc tai nghe. AirPlay — truyền phát âm thanh và video tới Apple TV và các thiết bị AirPlay khác. Trong thực tế, Audio Mode bao gồm cả hai kịch bản vì AirPlay sử dụng phiên âm thanh. Không cần chế độ AirPlay riêng từ iOS 7+.
Có, để làm điều này hãy sử dụng requestWhenInUseAuthorization() thay vì requestAlwaysAuthorization(). Ứng dụng sẽ chỉ nhận vị trí ở tiền cảnh. Nếu cần theo dõi ngắn trong nền, hãy gọi startUpdatingLocation() và dừng trong willResignActive.
Mỗi chế độ làm tăng mức tiêu thụ năng lượng. Location Mode là tốn kém nhất, có thể giảm tuổi thọ pin 30–50% khi theo dõi liên tục. Audio Mode ở mức vừa phải (15–20%). Fetch và Processing ở mức tối thiểu (2–5%). BLE Mode ở mức thấp (5–10%) nhờ hiệu quả năng lượng của Bluetooth LE.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm