Mobile
The mobile recorders send the same visits as the browser SDK, so a recorded app plays in the same player. Live Assist, voice, and co-browsing do not exist on mobile. A call can still be explained from its connection stats when you turn that on; the picture and the sound of the call are never recorded.
Install
Section titled “Install”iOS, Swift Package Manager, iOS 15 or later:
.package(url: "https://github.com/backstory/backstory", from: "0.1.0")import BackstoryKit
let url = URL(string: "https://ingest.backstory.io/v1/ingest")!Backstory.start(BackstoryConfig(projectKey: "pk_live_…", ingestURL: url))Android, minSdk 24. The library publishes as com.backstory:android:
dependencies { implementation("com.backstory:android:0.1.0") }Backstory.start(application, BackstoryConfig(projectKey = "pk_live_…", ingestUrl = "https://ingest.backstory.io/v1/ingest"))React Native 0.73 or later:
npm install @backstory/react-nativeimport { Backstory } from "@backstory/react-native";
Backstory.init({ projectKey: "pk_live_…", ingestUrl: "https://ingest.backstory.io/v1/ingest" });The iOS app also needs the pod BackstoryReactNative. The Android app picks
the module up from the package. Expo Go has no native module, so it records
with the JavaScript fallback, which keeps navigation, errors, and identity and
does not capture the native view tree.
Flutter 3.22 or later:
dependencies: backstory: path: path/to/backstoryawait Backstory.init(BackstoryOptions(projectKey: "pk_live_…", ingestUrl: "https://ingest.backstory.io/v1/ingest"));Privacy
Section titled “Privacy”Masking happens on the device. Privacy mode is on (strict) by default and
masks all text and field values. Turn it off with permissive to show them.
Mobile apps use the mode passed at startup; the dashboard project setting does
not reach them yet.
Passwords, card fields, card numbers, and one-time codes are hidden in both modes.
Mark one control by hand:
| Platform | Mask this control | Remove it, keep the box |
|---|---|---|
| iOS | accessibilityIdentifier = "backstory-mask" | "backstory-block" |
| Android | view.tag = "backstory-mask" | "backstory-block" |
| Flutter | BackstoryMask | BackstoryBlock |
"backstory-unmask" keeps one control visible inside a masked parent.
Identity
Section titled “Identity”identify attaches your id for the person and the name the dashboard shows.
Call it again when the person changes. Both values are stored as you send them.
Backstory.identify("user_123", name: "Avery Chen")Offline
Section titled “Offline”A visit keeps recording with no network. Unsent chunks are written to disk and uploaded on the next launch, oldest first. When the disk quota fills, older visits are dropped before the current one, and low-priority events before crashes. A crash is written to disk immediately and uploaded the next time the app starts.
A long time offline thins what is kept: scrolling and movement first, then screenshots, and a crash is kept either way. The replay shows a gap for the part that was dropped.
What mobile does not do
Section titled “What mobile does not do”There is no Live Assist on iOS, Android, React Native, or Flutter. Nothing in these SDKs starts a call, shares the screen with a teammate, or draws on the visitor’s device. Recording a visit and watching it later is the whole of it.