atrixANALYTICS
SDKs

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 outbox

sessionId 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 an accessibilityIdentifier / React Native nativeID containing atrix-block) replaces a subtree with one placeholder. atrix-mask and atrix-unmask work the same way.
  • Block wins over everything; configured masked classes and identifiers beat an atrix-unmask marker.
  • 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.

On this page