# Run IOS

> Build, launch, and drive the notes app natively on the iOS simulator (React Native hosted in .NET MAUI). Use when running or building the iOS app, or driving/screenshotting its UI.

- Skill: `vortiago/run-ios` (Agent Skill)
- Install (CLI): `npx skillmds@latest add vortiago/run-ios`
- Raw SKILL.md: https://api.skillmd.com/api/skills/vortiago/run-ios/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: Vortiago (https://skillmd.com/u/vortiago)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/vortiago/run-ios

---


# Run on iOS

Native React Native (no WebView) hosted in .NET MAUI, talking to the in-process backend over
`127.0.0.1:5001`. Prereqs: Xcode + a booted simulator, CocoaPods, and the AXe CLI
(`brew install cameroncooke/axe/axe`) for driving the UI.

## Build and run

Run in order from the repo root:

1. `./src/Client.MAUI/Scripts/build-rn-frameworks.sh --simulator-only` (runs `pod install` on first use). Done when `src/Client.MAUI/Frameworks/` holds the xcframeworks + a simulator static-lib build.
2. `./src/Client.MAUI/Scripts/generate-rn-linker-flags.sh`.
3. `./src/Client.MAUI/Scripts/bundle-js.sh`. Done when `src/Client.MAUI/Resources/Raw/main.jsbundle` exists.
4. `./src/Client.MAUI/Scripts/e2e-ios.sh` (add `--udid <UDID>` for a specific simulator). This builds the app, installs it, launches, and proves the round-trip. Done when it prints `iOS end-to-end test PASSED`.

Steps 1-3 produce the gitignored artifacts the build consumes; the csproj fails loudly if they are missing.

## Drive or screenshot the running UI

RN `testID` becomes the accessibility identifier (`AXUniqueId`) for the input and button; plain Text is
matched by its visible label.

- Inspect: `axe describe-ui --udid <UDID>`.
- Add a note: `axe tap --id notes.text.input --udid <UDID>`, `axe type 'Buy groceries' --udid <UDID>`, `axe tap --id notes.add.button --udid <UDID>`.
- Screenshot: `xcrun simctl io <UDID> screenshot shot.png` (dismiss the debug LogBox banner first if it is showing).

