Интеграция UXCam для записи сессий мобильного приложения
UXCam специализируется именно на мобильных UX-исследованиях — в отличие от Sentry или Datadog, здесь сессии записываются с акцентом на понимание поведения пользователя, а не диагностику ошибок. Тепловые карты жестов, фокусные зоны на экране, раздел Screen Flow — это инструменты для UX-команды и продакт-менеджера, а не инженера по надёжности.
Установка
iOS (Swift Package Manager):
// Package.swift
.package(url: "https://github.com/uxcam/ios-sdk", from: "3.6.0")
import UXCam
// AppDelegate
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let config = UXCamConfiguration(appKey: "YOUR_APP_KEY")
config.enableAdvancedGestureRecognizers = true
UXCam.startWithConfiguration(config)
return true
}
Android:
// build.gradle
implementation("com.uxcam:uxcam:3.+")
// Application.onCreate()
val config = UXCamConfiguration.Builder("YOUR_APP_KEY")
.enableAdvancedGestureRecognizers(true)
.build()
UXCam.startWithConfiguration(config)
Маскировка приватных данных
UXCam по умолчанию маскирует поля с isSecureTextEntry (iOS) и поля типа password (Android). Для кастомных View с чувствительным содержимым:
// iOS — маскировать конкретный UIView
UXCam.occlude(view: cardNumberView, hideGestures: true)
// Маскировать весь экран
UXCam.occlude(view: self.view, hideGestures: false)
// Android — маскировать View
UXCam.occludeSensitiveView(binding.cardNumberField)
// Маскировать через XML
android:tag="uxcam_unmask" // исключить из маскировки
android:tag="uxcam_mask" // принудительно маскировать
Для экранов оплаты рекомендую скрывать весь экран через UXCam.tagScreenName("Payment", isOccluded: true) — это проще, чем маскировать каждый элемент по отдельности.
Тегирование экранов
UXCam автоматически определяет имена экранов по имени класса ViewController/Activity. На практике имена классов вроде VC_3_Step2Fragment нечитаемы в дашборде. Добавляем явные теги:
// iOS — тег экрана
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UXCam.tagScreenName("Product Detail")
}
// Android — в Fragment.onResume()
override fun onResume() {
super.onResume()
UXCam.tagScreenName("Product Detail")
}
Кастомные события и свойства пользователя
// Событие
UXCam.logEvent("add_to_cart", withProperties: [
"product_id": product.id,
"category": product.category,
"price": product.price
])
// Свойства пользователя (для сегментации в дашборде)
UXCam.setUserProperty("plan", value: "premium")
UXCam.setUserProperty("registration_cohort", value: "2024-Q1")
Свойства пользователя позволяют в UXCam дашборде фильтровать записи по сегменту: смотреть сессии только premium-пользователей или только новых.
Семплинг и управление записью
// Записывать только 30% сессий
let config = UXCamConfiguration(appKey: "YOUR_APP_KEY")
config.userAppKey = "YOUR_APP_KEY"
// Старт/стоп вручную
UXCam.stopSessionAndUploadData() // завершить и отправить текущую сессию
// Не записывать сессии в debug-сборке
if !isDebugBuild {
UXCam.startWithConfiguration(config)
}
Для приложений с высокой DAU стоит подумать о семплировании: записывать 100% сессий дорого по storage в UXCam. Хорошая стратегия — 10% случайных + 100% сессий с ошибками или конкретными событиями:
// Принудительно записать сессию при критическом событии
UXCam.allowShortBreakForAnotherApp(true) // не завершать сессию при переключении
Analytics.shared.onCriticalError { error in
UXCam.logEvent("critical_error", withProperties: ["error": error.localizedDescription])
// Сессия будет помечена и доступна в дашборде
}
Что делаем
- Подключаем SDK через SPM (iOS) или Gradle (Android)
- Настраиваем маскировку чувствительных экранов и View
- Расставляем
tagScreenNameдля читаемых имён в дашборде - Добавляем ключевые события и свойства пользователя для сегментации
- Настраиваем семплинг под объём трафика
Сроки
Базовое подключение с маскировкой и тегированием: 1–2 дня. Стоимость рассчитывается индивидуально.







