Реалізація Session Replay (запис сесії користувача) для мобільного додатку
Session Replay на мобільних пристроях — технічно складніше, ніж у вебі. Браузер завжди рендерить DOM, який можна серіалізувати. Мобільний додаток рендерить нативний UI через UIKit, Jetpack Compose або Flutter engine, і «снімок» цього стану вимагає або скриншотів, або захоплення wireframe представлення View-ієрархії.
Погана реалізація Session Replay споживає 10–20% додаткового CPU та 100–200KB мережевого трафіку на хвилину. Хороша — невидима для користувача.
Два підходи до запису
Screenshot-based (UXCam, Smartlook, деякі режими Datadog): робить снімки екрана з заданим інтервалом (зазвичай 1–5 fps), маскує чутливі області, відправляє на сервер. Точно передає візуальний стан, включаючи кастомні View та WebView. Недолік: великий обсяг даних, складність маскування динамічного контенту.
Wire-frame / View-tree based (Sentry, деякі режими Datadog): серіалізує ієрархію View з позиціями, кольорами та текстом, відтворює UI на сервері через шаблони. Легше по трафіку та CPU, але WebView та кастомна графіка не відтворюються точно.
Реалізація через Sentry Session Replay
Sentry Session Replay для мобільних доступен з SDK 8.x. Використовує wireframe підхід:
// iOS
import Sentry
SentrySDK.start { options in
options.dsn = "https://[email protected]/project"
options.experimental.sessionReplay = SentryReplayOptions(
sessionSampleRate: 0.1, // 10% випадкових сесій
onErrorSampleRate: 1.0 // 100% сесій з крахом/помилкою
)
}
// Android
SentryAndroid.init(this) { options ->
options.dsn = "https://[email protected]/project"
options.experimental.sessionReplay.apply {
sessionSampleRate = 0.1
onErrorSampleRate = 1.0
}
}
onErrorSampleRate = 1.0 — ключовий параметр. Це значить: записувати replay для всіх сесій, де сталася помилка. SDK буферизує останні N секунд replay у пам'яті та відправляє їх разом з error report. Так ви бачите, що саме робив користувач до крахе.
Маскування чутливих даних
За замовчуванням Sentry маскує UITextField та поля з isSecureTextEntry = true. Цього недостатньо — потрібно також приховувати дані карток, персональні дані та OTP-поля.
// iOS — маркування View для маскування
class PaymentCardView: UIView {
override func didMoveToWindow() {
super.didMoveToWindow()
SentrySDK.replay.maskView(self)
}
}
// Android — маскування через тег
val cardNumberField = findViewById<EditText>(R.id.cardNumber)
cardNumberField.setTag(io.sentry.android.replay.Recorder.MASK_TAG, true)
Для SwiftUI та Jetpack Compose:
// SwiftUI
Text(userEmail)
.sentryReplayMask()
// Compose
Text(
text = cardNumber,
modifier = Modifier.sentryReplayMask()
)
Інтеграція з крах-репортами
Найцінніша функція Session Replay — link з крах-репорта на запис сесії. У Sentry це працює автоматично: якщо в момент помилки був активний replay-буфер, у Issue з'являється кнопка «Watch Session Replay».
Це змінює процес дебаггінгу: замість відтворення за кроками з описання користувача — дивишся запис та бачиш точно, що сталося.
Налаштування Datadog Session Replay
Datadog підтримує два режими: wireframe (за замовчуванням) та screenshot. Screenshot включається явно:
import DatadogSessionReplay
SessionReplay.enable(
with: SessionReplay.Configuration(
replaySampleRate: 20, // 20% сесій
defaultPrivacyLevel: .maskUserInput
)
)
Datadog Session Replay пов'язується з RUM View — у інтерфейсі можна відкрити конкретний View та подивитися replay саме цього екрана, з метриками (latency, FPS) на таймлайні.
Продуктивність та overhead
Тестування Sentry wireframe режиму на production пристроях показує:
| Показник | Overhead |
|---|---|
| CPU (background sampling) | < 1% |
| Memory (буфер 60 сек) | ~8–15 MB |
| Мережевий трафік (при відправці) | ~50–150 KB/хвилина |
| Серіалізація View-tree | < 2ms per frame |
Screenshot-based режими дороже: CPU 3–8%, трафік 200–500 KB/хвилина при 2 fps.
Що ми робимо
- Вибираємо інструмент та режим запису під вимоги безпеки та продуктивності
- Підключаємо SDK з
onErrorSampleRate = 1.0для запису сесій з помилками - Налаштовуємо маскування всіх екранів та елементів з персональними даними
- Верифікуємо маскування через Privacy Audit у Sentry/Datadog UI
- Налаштовуємо link replay → crash report для швидкої діагностики
Часові оцінки
Базова настройка з маскуванням: 2–3 дні. Повна інтеграція з аудитом приватності: 4–5 днів. Ціна розраховується індивідуально.







