Skip to main content
An app key ships inside your app, so anyone can copy it. With App Attest on, Pool’s service only answers cloud assist requests that your own app signed on a genuine iPhone or iPad. A copied key gets nothing.

Turn it on

  1. In Xcode, add the App Attest capability to your app target. It adds com.apple.developer.devicecheck.appattest-environment to the entitlements: development for debug builds, production for TestFlight and the App Store.
  2. In the dashboard, enter your Apple team ID (10 letters and digits, in your Apple Developer account under Membership).
  3. Choose a mode:
Nothing changes in your code. PoolKit attests a key the first time it needs cloud assist, then signs each request.

What it covers

  • Cloud assist: naming things, answers (also streamed), profiles and rules. These are the calls that cost units.
  • Registering an install and downloading models are not signed. They hold nothing about a person and cost nothing.
  • Everything on the device keeps working whatever the mode, including when a request is refused.

Test keys and the Simulator

The Simulator has no App Attest, so test keys only ever report, even under Enforce. A live key accepts only keys from App Attest’s production environment, so a debug build signed for development needs a test key.

How a request is checked

  1. PoolKit makes a key in the Secure Enclave and asks Pool for a one-time challenge.
  2. Apple attests the key over that challenge. Pool checks the certificate chain up to Apple’s App Attestation root, that the key is the one named, and that it was made for your team and bundle ID, then keeps its public key.
  3. Each cloud assist request carries X-Pool-Attest-Key and X-Pool-Assertion: a signature over the exact request body. Pool checks it against the stored key, and checks that the signature’s counter was not used before, so a request cannot be replayed.
When a key is refused, PoolKit attests again once and retries; if that fails, the call throws PoolError.service(status: 401). See Service API for the wire format.

Privacy

App Attest identifies a key, not a person or a device: Apple does not tell Pool who the user is. Pool stores the key’s public half and a counter for each install, and deletes them when the install attests a new key.