ReferenceBeginner3-5 min reference
Mobile Permissions
Runtime permissions (camera, location, photos, notifications…) are a rich source of mobile bugs because apps forget the denied and revoked-later paths. This sheet lists the states, the platform differences, and the cases worth covering. It complements the broader Mobile Testing sheet linked below.
Permission states
| State | Means | App should |
|---|---|---|
| Not determined | Never asked | Show rationale, then request |
| Allowed | Granted | Use the feature |
| Allowed while using | Granted only in foreground (location) | Degrade gracefully in background |
| Allowed once | Granted for this session (iOS) | Re-request next launch |
| Limited | Partial access (iOS Photos) | Work with the chosen subset |
| Denied | Refused once | Show fallback + path to Settings |
| Denied (don't ask again) | Android: blocked | Deep-link to system Settings |
| Revoked later | Changed in Settings after granting | Detect on resume, recover |
iOS vs Android quick notes
- iOS prompts once per permission; a second "no" can't be re-prompted in-app — you must send the user to Settings.
- Android allows re-prompting until the user checks "don't ask again"; after that, only Settings works.
- Android 12+ offers approximate vs precise location; iOS 14+ offers a limited Photos selection.
- A permission granted then revoked in Settings can kill a backgrounded app's process — test the resume path.
What to test
- First-run grant and deny for every permission the app requests.
- The "denied forever / Settings" recovery path.
- Background behaviour when "while using" is selected.
- Revoke-in-Settings, then return to the app.
- The feature degrades gracefully when permission is absent (no crash, clear messaging).
Common mistakes
- Testing only "Allow" — the deny and revoke paths are where apps crash or hang.
- Requesting a permission before the user understands why (no rationale screen).
- Assuming a granted permission stays granted across sessions/OS updates.
- Forgetting notifications are a runtime permission on modern iOS and Android 13+.
// Related resources