How do privacy permissions work, and what do you do after the user says no?

6.1.4 · L3 · Interview

Predict first

A user denied camera access last week. What does calling the camera-permission request API again do?

// A: shows the prompt again
// B: nothing, the prompt only appears once
// C: crashes
  • A
  • B
  • C

Mental model. The system asks the user once, in front of everyone, and writes the answer in a ledger. You cannot ask again, only point them to the ledger.

Access to the camera, microphone, photos, contacts, location, Bluetooth, tracking and similar data is controlled by the system’s consent layer (historically called TCC). To ask, your app needs a usage description string in Info.plist for each protected resource; if it is missing, the app crashes when it touches the API. The first request shows the system prompt; the answer is stored per app and the status becomes authorized, denied, restricted (parental or device policy) or, for photos, limited. Notifications also have provisional.

The prompt appears once: after a denial, calling the request API again does nothing. The only path back is to explain the benefit and send the user to Settings for your app (UIApplication.openSettingsURLString). So ask at the moment the feature is needed, in context, check the status before using the API, and design the denied state as a normal path. Recent privacy rules also require a privacy manifest and justified reasons for some APIs, which the security topic covers.

The system remembers the answer. Your only option is to explain and direct the user to Settings.

Common traps

  • Requesting every permission at first launch. Users deny what they cannot connect to a need, and cannot be asked again.
  • Forgetting the usage description. The first access crashes the app with a message naming the missing key.

They might follow up with

  • How do you tell “not asked yet” from “denied”? The status is notDetermined before the prompt and denied after.
  • What is “limited” photo access? The user chose a subset of the library; your app only sees those assets.

Related questions

  • 6.7.1 What is Info.plist for, and which keys matter most?
  • 2.5.8 What belongs in UserDefaults, and how do you design and test around it?

← What are entitlements, and what happens when they do not match the…