mobster asc reads App Store Connect with your own API key: your builds and their TestFlight state, and the screenshots, comments and crash logs your testers send from TestFlight. mobster testflight lists those builds and installs one on your iPhone by driving the TestFlight app, so mobster test --device can check the build your testers have, and its report names the build.
It only reads. Mobster sends App Store Connect GET requests and nothing else, and submits nothing to Apple: no build, metadata, screenshot, review or tester change. App Store screenshots makes your store screenshots on your Mac, and uploading them stays your call.
Add your key
In App Store Connect, open Users and Access › Integrations › App Store Connect API, and make a key with the Developer role (App Manager also works). Download its.p8 file once, then:
- The key goes to your login Keychain, readable only by Mobster’s own programs.
mobster asc key showsays which key is there, andmobster asc key removedeletes it. - An individual key has no Issuer ID: leave
--issuer-idout. - Each request carries a token Mobster signs on your Mac (ES256) and that lasts 20 minutes. The key itself never leaves the Mac, and Mobster never prints it.
- A CI job without a Keychain sets
MOBSTER_ASC_KEY_ID,MOBSTER_ASC_ISSUER_IDandMOBSTER_ASC_KEY_PATH(orMOBSTER_ASC_KEY, the file’s text) instead.
Your builds
--limit N shows more, and --json prints every field: version, build, upload time, processing state, and the internal and external TestFlight states.
Feedback and crashes from TestFlight
--crashes or --screenshots shows one kind. --save DIR downloads each crash log (<id>.crash) and each screenshot a tester sent.
A key for each project
mobster asc key add keeps one key for every project. To give a project its own key, run this inside the project:
mobster testflight command looks for the project’s key first, then the shared one, and then MOBSTER_ASC_*. --shared keeps the key for every project instead. mobster testflight key show says which key a folder uses and never prints it, and mobster testflight key remove deletes it.
A TestFlight build on your iPhone
- Mobster looks the app up in App Store Connect and picks the newest build a tester can install.
--build 45(and--version 1.2) picks one. It refuses a build that expired, is still processing, or sits in no tester group, and says why. - It opens the app’s page in the TestFlight app on the iPhone (
itms-beta://), taps Install or Update, and waits until TestFlight shows Open. - When TestFlight asks you to accept its terms for the app, Mobster stops and says so: you tap Accept once yourself.
mobster testflight install only watches: it finishes when TestFlight shows Open, and it asks you to tap if TestFlight still shows Install.
The iPhone’s Apple ID has to be a tester of the app. TestFlight runs only on an iPhone, not a simulator.
The build on the report
The install writes the version and build number in.mobster/runs/testflight/, which git ignores. When you then run mobster test --testflight on that app, the build goes in results.json (testflight), in the JUnit properties and in the HTML report’s footer. An install whose outcome is unknown names no build. In CI, the runner’s owner lists the app in MOBSTER_RUNNER_TESTFLIGHT (CI).
Mobster for Mac reads the same builds through the local API: GET /api/tests/testflight/builds, POST /api/tests/testflight/install (409 outcome_unknown when a tap’s result is unknown) and GET, POST or DELETE /api/tests/testflight/key, which never returns the .p8.
Mobster confirms the version and build shown on the TestFlight page before tapping or recording a build. If it cannot read them, it stops. A corrupt install record also stops the next install; an unknown earlier build must be reconciled before requesting a different one.
The report names the last TestFlight build Mobster confirmed on the selected iPhone. A later manual install can make that record stale.