| name | ios-audio-e2e |
| description | 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. |
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.