Skip to main content
A crash report holds addresses. Apsio turns them into function names, files and lines with the dSYMs of the build that crashed. See Symbols and dSYMs for how that works.

Before you start

  • Install the apsio CLI and store your project’s upload token with apsio login --with-token, or set APSIO_TOKEN.
  • Make sure the build produces dSYMs: in the target’s Build Settings, Debug Information Format is “DWARF with dSYM File” (dwarf-with-dsym). New Xcode projects use it for Release.

Upload

Point the CLI at an archive, a dSYM bundle or a folder:
The CLI:
  1. finds every dSYM under the paths you give: in an .xcarchive it reads the dSYMs folder, and folders are searched recursively;
  2. reads each one and keeps the Mach-O files that carry debug information;
  3. splits a file with several architectures into one upload per architecture, since each has its own UUID, the one crash reports carry;
  4. asks Apsio which UUIDs it already has, and uploads only the others, compressed.
It prints one line per file and a summary:
Uploading the same dSYMs again is cheap: files Apsio already has are skipped. --force uploads them anyway.

Check without uploading

--dry-run finds and validates the dSYMs and lists their UUID, architecture, name and path, without a token and without uploading.

Output for scripts

--json prints one JSON document on standard output and nothing else there:
found is filled by --dry-run. skipped lists files that are not usable dSYMs, with the reason. failed lists uploads that failed, with the error. See exit codes.

Upload tokens

Uploads authenticate with an upload token, which uploads symbols for one project and reads nothing. It starts with apsio_ut_v0. and is separate from the read API’s project tokens: an upload token cannot read, and a project token cannot upload. Until the console issues them, ask Apsio for one per project.
  • Lifetime: 90 days by default, a year at most. Store it as a CI secret (APSIO_TOKEN) and replace it before it expires; an expired token is refused (exit code 3).
  • Scope: the project it names. Every upload made with it belongs to that project.
  • Revocation: a token that leaks is revoked by its id, and the next upload with it is refused.
When you run the Apsio service locally from its repository, pnpm --filter @apsio/api token:upload --org <uuid> --project <uuid> mints an upload token with the local SYMBOL_TOKEN_SECRET (.env.example).

Where to find dSYMs

Upload the dSYMs of every build you ship: the App Store, TestFlight and ad hoc builds.