> ## Documentation Index
> Fetch the complete documentation index at: https://docs.qawolf.com/llms.txt
> Use this file to discover all available pages before exploring further.

# iOS Device Pools

> Choose between QA Wolf's shared device pool, allowlisted devices, and private devices for iOS tests.

By default, QA Wolf runs iOS tests on real, physical devices shared across customers, resigning your app during installation so it can install unreleased builds without a per-app provisioning profile. Two situations need different device access instead:

* **A feature can't be tested on a resigned app** — push notifications and universal links (associated domains) depend on capabilities tied to a provisioning profile for your app's bundle ID, which only you can produce. Sign the app yourself for QA Wolf's devices instead — these are [allowlisted devices](#allowlisted-devices).
* **A test needs full device control, or data/configuration to persist across runs** — for example, MDM (Mobile Device Management) testing. QA Wolf can dedicate devices to your team — these are [private devices](#private-devices).

<Note>
  Contact your QA Wolf representative to enable allowlisted or private devices for your team.
</Note>

## Shared vs. allowlisted vs. private

|                    | Shared (default)             | Allowlisted                         | Private                            |
| ------------------ | ---------------------------- | ----------------------------------- | ---------------------------------- |
| Device pool        | Shared across customers      | Part of the shared pool             | Dedicated to your team             |
| App signing        | Resigned by QA Wolf          | Signed by you for QA Wolf's devices | Signed by you; resigning skippable |
| State between runs | Cleaned up between every run | Cleaned up between every run        | Can persist across runs            |

Private devices can do anything allowlisted devices can. You can share the UDIDs of private devices and skip resigning when that's needed for your tests.

## Allowlisted devices

### Sign the app for QA Wolf's devices

<Steps>
  <Step>
    QA Wolf shares a set of device UDIDs with you. Add these devices to the provisioning profile for your app's bundle ID.
  </Step>

  <Step>
    Build and sign the app for those devices using that profile.
  </Step>
</Steps>

### Include QA Wolf instrumentation

When QA Wolf resigns an app, it injects an instrumentation library that lets your tests mock system behavior. When you sign the app yourself, include this library so mocking still works.

* **Fastlane users** — use the `inject_qawolf_instrumentation` action from the [QA Wolf Fastlane plugin](https://github.com/qawolf/fastlane-plugin-qawolf).
* **Non-Fastlane users** — use the injection [script in the plugin repository](https://github.com/qawolf/fastlane-plugin-qawolf/tree/main/scripts).

<Warning>
  After injecting the instrumentation library, resign the IPA. Fastlane users can use the [Fastlane resign action](https://docs.fastlane.tools/actions/resign/); otherwise resign the IPA with whatever your pipeline already uses.
</Warning>

### Target allowlisted devices

Set `targetDevices` to `Allowlisted Device` in your workflow's target configuration so the run is scheduled on the devices you signed the app for. `deviceModel` and `iosVersion` depend on the devices QA Wolf allocated for your team.

```typescript theme={null}
{
  platform: "ios",
  schemaVersion: 1,
  meta: {
    deviceModel: "iPhone 15",
    iosVersion: "26",
    targetDevices: "Allowlisted Device",
  },
}
```

### Disable resigning

Because you signed the app yourself, disable QA Wolf's resigning when the app launches by setting the `qawolf:disableResigning` capability:

```typescript theme={null}
import { flow } from "@qawolf/flows/ios";

export default flow(
  "Test push notifications",
  {
    target: {
      platform: "ios",
      schemaVersion: 1,
      meta: {
        deviceModel: "iPhone 15",
        iosVersion: "26",
        targetDevices: "Allowlisted Device",
      },
    },
    launch: {
      app: { env: "IPA_BUILD_LOCATION" },
      capabilities: {
        "qawolf:disableResigning": true,
      },
    },
  },
  async ({ driver, test }) => {
    await test("notification is received", async () => {
      // your test steps
    });
  },
);
```

## Private devices

Set `targetDevices` to `Team Dedicated Device` in your workflow's target configuration so the run is scheduled on your team's devices. `deviceModel` and `iosVersion` depend on the devices QA Wolf allocated for your team.

```typescript theme={null}
{
  platform: "ios",
  schemaVersion: 1,
  meta: {
    deviceModel: "iPhone 15",
    iosVersion: "26",
    targetDevices: "Team Dedicated Device",
  },
}
```
