Skip to content
You are reading the docs for Backstory 0.2 (private beta). Behavior may change before general availability; the changelog lists every change.

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.

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:

Terminal window
npm install @backstory/react-native
import { 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/backstory
await Backstory.init(BackstoryOptions(projectKey: "pk_live_…", ingestUrl: "https://ingest.backstory.io/v1/ingest"));

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:

PlatformMask this controlRemove it, keep the box
iOSaccessibilityIdentifier = "backstory-mask""backstory-block"
Androidview.tag = "backstory-mask""backstory-block"
FlutterBackstoryMaskBackstoryBlock

"backstory-unmask" keeps one control visible inside a masked parent.

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")

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.

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.