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.
Medium because declaring unused background modes triggers rejection under guideline 2.5.4 and Apple's reviewers specifically cross-reference UIBackgroundModes against app functionality.
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.
app-store-review-blockers.technical-requirements.background-execution-justifiedmediumInfo.plist (or app.json ios.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 for UIBackgroundModes entries that do not correspond to any actual usage in source code. For Android, check AndroidManifest.xml for <service> elements with android:foregroundServiceType, WorkManager usage, AlarmManager with setExact(), 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).UIBackgroundModes array contains entries with no corresponding usage in source code; background services running more frequently than needed; location background mode declared without a feature that genuinely requires continuous location."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""ios": { "infoPlist": { "UIBackgroundModes": ["audio"] } }
Only include modes actually needed.WhenInUse authorization unless continuous background tracking is core to the app