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
- Read
AGENTS.md, .github/workflows/ci-ios.yml, the changed Swift/spec/TS
files, and the relevant example screen.
- Record
git status --short --branch; do not discard existing changes.
- Run
xcodebuild -version and xcrun devicectl list devices; select a
physical iPhone. Use $simulator-audio-e2e for virtual-device coverage.
- Confirm
example/ios/SoundExample/Info.plist contains a microphone usage
description and identify the selected destination.
- 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:
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:
- Install and launch the example on the selected physical iPhone. Never report
device-backed runtime evidence from this skill using a Simulator.
- Grant microphone permission through the system prompt.
- Start recording; require a resolved URI,
isRecording, and increasing
millisecond callbacks.
- Pause and resume; require callback time to stop and then advance without a
second recorder instance.
- Stop; require a terminal state, listener cleanup, and a playable file.
- Play the recorded clip; require increasing playback position and duration.
- Exercise seek, volume, and playback speed when affected.
- Require exactly one playback-end transition and successful stop/cleanup.
- 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.
1---2name: ios-audio-e2e3description: 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.4---56# iOS Audio E2E78Separate build evidence from live microphone and speaker evidence. Never report9an iOS runtime pass from a simulator compile alone.1011## Safety And Scope1213- Obtain explicit approval in the current run before starting live microphone14 capture. State that the example app `sound.example` will record a short clip.15- Use a test device and non-sensitive audio. Do not retain, upload, transcribe,16 or inspect recorded content beyond what is needed to prove the flow.17- Preserve the user's signing, simulator, device, and audio-session settings.18- Treat calls, Bluetooth routing, backgrounding, and other-app interruptions as19 separate opt-in rows; they alter device state and are not implied by a basic20 E2E request.2122## Preflight23241. Read `AGENTS.md`, `.github/workflows/ci-ios.yml`, the changed Swift/spec/TS25 files, and the relevant example screen.262. Record `git status --short --branch`; do not discard existing changes.273. Run `xcodebuild -version` and `xcrun devicectl list devices`; select a28 physical iPhone. Use `$simulator-audio-e2e` for virtual-device coverage.294. Confirm `example/ios/SoundExample/Info.plist` contains a microphone usage30 description and identify the selected destination.315. Run `yarn install --immutable`, `yarn prepare`, and32 `./scripts/fix-nitrogen-swift.sh` when generated Swift is involved.3334## Build Lane3536Mirror `.github/workflows/ci-ios.yml`:3738```bash39cd example40bundle install41bundle exec pod install --project-directory=ios42cd ..43xcodebuild \44 -workspace example/ios/SoundExample.xcworkspace \45 -scheme SoundExample \46 -configuration Debug \47 -sdk iphonesimulator \48 -destination 'generic/platform=iOS Simulator' \49 CODE_SIGNING_ALLOWED=NO \50 SKIP_BUNDLING=YES \51 build52```5354Report this as `BUILD PASS` or `BUILD FAIL`, never as runtime E2E.5556## Device Runtime Lane5758After microphone approval, run the smallest matrix covering the change:59601. Install and launch the example on the selected physical iPhone. Never report61 device-backed runtime evidence from this skill using a Simulator.622. Grant microphone permission through the system prompt.633. Start recording; require a resolved URI, `isRecording`, and increasing64 millisecond callbacks.654. Pause and resume; require callback time to stop and then advance without a66 second recorder instance.675. Stop; require a terminal state, listener cleanup, and a playable file.686. Play the recorded clip; require increasing playback position and duration.697. Exercise seek, volume, and playback speed when affected.708. Require exactly one playback-end transition and successful stop/cleanup.719. Run the Rapid Switch screen for concurrency or promise-settlement changes.7273For interruption, route change, or background work, capture the before/after74audio-session state and verify recovery on a physical device. A manual gesture75without matching app state and logs is insufficient.7677## Evidence And Cleanup7879Capture the device identifier, iOS/Xcode versions, build configuration, tested80screen/API, permission state, callback progression, returned path, and relevant81redacted logs. Remove only recordings and temporary artifacts created by the82current run. Report `RUNTIME PASS`, `RUNTIME FAIL`, or `BLOCKED` separately from83the build result and list every untested row.