iOS
AtrixReplay, native wireframe session replay for iOS 15+.
Replay only, for now
The iOS package today is the session-replay recorder, AtrixReplay. A native iOS events and flags SDK (Swift,
SPM) is in progress. Until it ships, native iOS apps send events through the capture API,
and React Native apps get both events and native replay from the
React Native SDK, which drives this recorder for you.
The recorder turns the view tree into masked wireframes: rrweb-compatible events that one player replays for web and mobile alike. Nothing is captured as pixels.
import AtrixReplay
var options = AtrixReplayOptions(apiKey: "atx_pk_eu_production_…")
options.sampleRate = 0.5 // per session, same hash as the server
options.blockedIdentifiers = ["payment-sheet"] // accessibilityIdentifier / RN testID / RN nativeID
AtrixReplay.start(options: options, sessionId: sessionId, distinctId: distinctId)
AtrixReplay.setScreen("/chat/[id]") // a route pattern, never real ids
AtrixReplay.setSession(newSessionId) // a new recording: sequence 0, fresh keyframe
AtrixReplay.optOut() // consent denied: stop and delete the outboxsessionId and distinctId are the UUIDv7 session id and the distinct id of the events you send, so
recordings line up with their events.
Masking
- Text is masked by default and never serialised: not its characters, not its length.
- Inputs are masked even with
maskAllText = false; secure entry is always masked. view.atrixReplayPrivacy = .block(or anaccessibilityIdentifier/ React NativenativeIDcontainingatrix-block) replaces a subtree with one placeholder.atrix-maskandatrix-unmaskwork the same way.- Block wins over everything; configured masked classes and identifiers beat an
atrix-unmaskmarker. - Accessibility labels are never recorded.
Delivery
Chunks of about 10 s or 256 KB go to an on-disk outbox in Application Support (bounded, 20 MB by default,
oldest dropped, survives app kills) and are uploaded gzipped to POST /r on a timer, when the app goes to the
background and on stop. A session is uploaded only once it spans minDurationMs, and recording stops four
hours after the session starts. The server's sampled_out, quota_limited and session_too_long answers
stop recording; 408, 429 and 5xx back off and honour Retry-After.