# Permissions (/docs/e2e/conditions/permissions)



`device.permissions` sets the app's privacy permissions directly, so a spec does not tap through a system prompt (iOS does not always raise one) and can test the denied path on purpose.

```ts
await device.permissions.set({ location: "denied", notifications: "granted" });
await app.open();
```

Set permissions before `app.open()`: iOS terminates a running app whose permission changes.

| Member                                                   | Does                                                                                                                                                                     |
| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `set({ location?, camera?, photos?, … }, { bundleId? })` | each `"granted" \| "denied" \| "unset"` (`unset` asks again). Returns `{ bundleId, applied, skipped }`; none applicable throws `E_UNSUPPORTED`. Default app: the suite's |
| `reset({ bundleId? })`                                   | every name this test set back to the suite's value, else `"unset"`                                                                                                       |

Names: `location` `locationAlways` `camera` `photos` `photosAdd` `contacts` `contactsLimited` `notifications` `microphone` `calendar` `reminders` `motion` `mediaLibrary` `siri`. A name the platform or the app cannot take comes back in `skipped` ([which](/docs/sims/conditions/permissions#skipped-names)).

## In a suite [#in-a-suite]

```ts title="warden.config.ts"
conditions: { permissions: { location: "denied", camera: "granted" } },
```

Applied before the app launches, and put back after each spec.

By hand with `warden ui permission`: [Permissions on a simulator](/docs/sims/conditions/permissions).
