# IOS Audio E2e

> Build and run device-backed iOS end-to-end checks for react-native-nitro-sound recording, playback, listeners, pause/resume, seek, speed, interruption, audio-session behavior, and rapid switching. Use for iOS audio regressions, Swift changes, or claims that require more than an Xcode compile.

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

---


# iOS Audio E2E

Separate build evidence from live microphone and speaker evidence. Never report
an iOS runtime pass from a simulator compile alone.

## Safety And Scope

- Obtain explicit approval in the current run before starting live microphone
  capture. State that the example app `sound.example` will record a short clip.
- Use a test device and non-sensitive audio. Do not retain, upload, transcribe,
  or inspect recorded content beyond what is needed to prove the flow.
- Preserve the user's signing, simulator, device, and audio-session settings.
- Treat calls, Bluetooth routing, backgrounding, and other-app interruptions as
  separate opt-in rows; they alter device state and are not implied by a basic
  E2E request.

## Preflight

1. Read `AGENTS.md`, `.github/workflows/ci-ios.yml`, the changed Swift/spec/TS
   files, and the relevant example screen.
2. Record `git status --short --branch`; do not discard existing changes.
3. Run `xcodebuild -version` and `xcrun devicectl list devices`; select a
   physical iPhone. Use `$simulator-audio-e2e` for virtual-device coverage.
4. Confirm `example/ios/SoundExample/Info.plist` contains a microphone usage
   description and identify the selected destination.
5. Run `yarn install --immutable`, `yarn prepare`, and
   `./scripts/fix-nitrogen-swift.sh` when generated Swift is involved.

## Build Lane

Mirror `.github/workflows/ci-ios.yml`:

```bash
cd example
bundle install
bundle exec pod install --project-directory=ios
cd ..
xcodebuild \
  -workspace example/ios/SoundExample.xcworkspace \
  -scheme SoundExample \
  -configuration Debug \
  -sdk iphonesimulator \
  -destination 'generic/platform=iOS Simulator' \
  CODE_SIGNING_ALLOWED=NO \
  SKIP_BUNDLING=YES \
  build
```

Report this as `BUILD PASS` or `BUILD FAIL`, never as runtime E2E.

## Device Runtime Lane

After microphone approval, run the smallest matrix covering the change:

1. Install and launch the example on the selected physical iPhone. Never report
   device-backed runtime evidence from this skill using a Simulator.
2. Grant microphone permission through the system prompt.
3. Start recording; require a resolved URI, `isRecording`, and increasing
   millisecond callbacks.
4. Pause and resume; require callback time to stop and then advance without a
   second recorder instance.
5. Stop; require a terminal state, listener cleanup, and a playable file.
6. Play the recorded clip; require increasing playback position and duration.
7. Exercise seek, volume, and playback speed when affected.
8. Require exactly one playback-end transition and successful stop/cleanup.
9. Run the Rapid Switch screen for concurrency or promise-settlement changes.

For interruption, route change, or background work, capture the before/after
audio-session state and verify recovery on a physical device. A manual gesture
without matching app state and logs is insufficient.

## Evidence And Cleanup

Capture the device identifier, iOS/Xcode versions, build configuration, tested
screen/API, permission state, callback progression, returned path, and relevant
redacted logs. Remove only recordings and temporary artifacts created by the
current run. Report `RUNTIME PASS`, `RUNTIME FAIL`, or `BLOCKED` separately from
the build result and list every untested row.

