Background modes and services are justified and not battery-draining
Why it matters
Apple's guideline 2.5.4 requires that background modes declared in UIBackgroundModes actually be used by the app. An app that declares location and fetch background modes but contains no corresponding background location or fetch code raises an immediate red flag — reviewers check Info.plist against the source code. Beyond rejection risk, unused background modes claim battery budget Apple allocates to those modes, harming device performance. Overly frequent background tasks (running every 15 minutes for work that could run daily) trigger Apple's background task termination policies and degrade the user's battery life.
Severity rationale
Medium because declaring unused background modes triggers rejection under guideline 2.5.4 and Apple's reviewers specifically cross-reference UIBackgroundModes against app functionality.
Remediation
Remove every UIBackgroundModes entry that has no corresponding runtime usage from app.json.
// app.json — only include modes actually used
"ios": {
"infoPlist": {
"UIBackgroundModes": ["audio"]
}
}
For background fetch on Expo, use TaskManager and BackgroundFetch with the minimum feasible interval — BackgroundFetch.setMinimumIntervalAsync(3600) for hourly is more defensible than 15 minutes for most use cases. For location: request WhenInUse authorization unless continuous background tracking is the app's core purpose. Include a note in your App Store review notes explaining each declared background mode.
Detection
- ID:
background-execution-justified - Severity:
medium - What to look for: Count all relevant instances and enumerate each. Check iOS
Info.plist(orapp.jsonios.infoPlist.UIBackgroundModes) for declared background modes:audio,bluetooth-central,bluetooth-peripheral,fetch,location,processing,remote-notification,voip. Each declared mode must actually be used by the app. Look forUIBackgroundModesentries that do not correspond to any actual usage in source code. For Android, checkAndroidManifest.xmlfor<service>elements withandroid:foregroundServiceType,WorkManagerusage,AlarmManagerwithsetExact(), or<uses-permission android:name="android.permission.FOREGROUND_SERVICE">. Check if background operations have appropriate frequency limits (not running every minute for a task that could run daily). - Pass criteria: All declared background modes are actually used by the app and are justified by the app's functionality. At least 1 implementation must be verified. Background tasks run with appropriate frequency and scope.
- Fail criteria:
UIBackgroundModesarray contains entries with no corresponding usage in source code; background services running more frequently than needed;locationbackground mode declared without a feature that genuinely requires continuous location. - Skip (N/A) when: App has no background execution — no background fetch, background audio, location updates, or foreground services declared anywhere.
- Detail on fail:
"Info.plist declares 'location' and 'fetch' UIBackgroundModes but no background location or fetch code found in source"or"WorkManager task is scheduled to run every 15 minutes but only checks a rarely-changing setting" - Remediation: Apple rejects apps that declare background modes they don't use and will terminate apps that abuse background execution.
- Remove any declared background modes that are not actively used:
Only include modes actually needed."ios": { "infoPlist": { "UIBackgroundModes": ["audio"] } } - For background fetch, use the minimum frequency needed (daily is sufficient for most)
- For location, use
WhenInUseauthorization unless continuous background tracking is core to the app - Document the justification for each background mode in your App Store review notes
- Remove any declared background modes that are not actively used:
External references
- external · apple-guideline-2.5.4-background-modes — Apple App Store Review Guideline 2.5.4 — Background Modes Must Be Justified
Taxons
History
- 2026-04-18·v1.0.0·Initial import from app-store-review-blockers·automated