[object Object]

← back to Nineoh Guide

docs(mobile): EAS ad-hoc build recipe — press 'a' to select all devices, avoid nameless-iPhone skip + integrity error

96bb1e7f09fb01f6cbfee43f5b0450e41d66f5b7 · 2026-07-27 11:47:52 -0700 · Steve Abrams

Files touched

Diff

commit 96bb1e7f09fb01f6cbfee43f5b0450e41d66f5b7
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Jul 27 11:47:52 2026 -0700

    docs(mobile): EAS ad-hoc build recipe — press 'a' to select all devices, avoid nameless-iPhone skip + integrity error
---
 apps/mobile/EAS-BUILD-NOTES.md | 52 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/apps/mobile/EAS-BUILD-NOTES.md b/apps/mobile/EAS-BUILD-NOTES.md
new file mode 100644
index 0000000..a3ed6d5
--- /dev/null
+++ b/apps/mobile/EAS-BUILD-NOTES.md
@@ -0,0 +1,52 @@
+# EAS internal (ad-hoc) build notes
+
+App: **Unofficial 90210 Guide** · bundle `com.abrams.nineohguide` · EAS project `d1c16075-337b-4f74-b818-582a9bac7f67` · Apple team `3VAV3KMNZK` (Steven Abrams, Individual)
+
+## Getting an internal build onto a physical device — the one-shot recipe
+
+Internal distribution = ad-hoc `.ipa`, installable only on devices whose UDID is
+**embedded in the provisioning profile at build time**. Registering a device is
+NOT enough — it has to be *selected into the profile* when the build runs.
+
+1. **Register each device** (once per device):
+   ```
+   npx eas-cli device:create
+   ```
+   - iPhone/iPad → choose **Website** → open the printed URL in **Safari on the device** → install the profile.
+   - This Apple-silicon Mac → choose **Current Machine**.
+   - ⚠️ Devices often register **nameless** (Name = None). In the build's device
+     checklist they show as just the raw UDID and are easy to skip.
+
+2. **Build, and SELECT ALL DEVICES:**
+   ```
+   npx eas-cli build --profile preview --platform ios
+   ```
+   - Run it in a **real terminal** (interactive Apple login / 2FA needed).
+   - reuse distribution certificate → **yes**
+   - At the device checklist: **press `a` (select ALL), then Enter.**
+     `a` toggles every registered device at once, so the nameless iPhone can't be missed.
+
+3. **Verify** the finished `.ipa` actually carries both UDIDs:
+   ```
+   curl -sL -o app.ipa "<applicationArchiveUrl>"
+   unzip -o -q app.ipa -d app_ipa
+   security cms -D -i "$(find app_ipa -name embedded.mobileprovision)" > prof.plist
+   /usr/libexec/PlistBuddy -c "Print :ProvisionedDevices" prof.plist
+   ```
+
+4. **Install:** open the build page in Safari on the phone (or scan its QR) → Install
+   → first launch, trust the dev under Settings › General › VPN & Device Management.
+   Mac: `npx eas-cli build:run -p ios`.
+
+## Gotchas that cost us a morning (2026-07-27)
+
+- **"integrity could not be verified"** on install = the device's UDID is **not** in
+  that `.ipa`'s embedded profile. Fix by rebuilding with the device selected.
+- **`--refresh-ad-hoc-provisioning-profile` is NON-INTERACTIVE-ONLY** and requires an
+  **App Store Connect API key** (issuer id + key id + `.p8`). It errors instantly in
+  interactive mode, so it can't rescue an interactive build. If a key gets set up,
+  `eas build … --non-interactive --refresh-ad-hoc-provisioning-profile` pulls in every
+  registered device with no checkbox — the ideal headless path.
+- Interactive EAS commands need a real TTY — they fail under the Claude `!` prefix and
+  under the Bash tool ("stdin is not readable"). Run them in a plain terminal tab.
+- Registered devices: Mac `00006032-000C692614DA401C`, iPhone `00008150-001039662E3B401C`.

← ebc361f chore: quality gate — log+500 on api/cast+news error paths,  ·  back to Nineoh Guide  ·  feat(mobile): fix scroll (flex ScrollView reveals full cast 746a4e4 →