콘텐츠로 이동

Flutter 세션 리플레이

전제 조건

  • Flutter RUM 설정 및 초기화가 완료되어 있어야 하며, View 모니터링 수집이 활성화되어 있어야 합니다.
  • Flutter 세션 리플레이는 ft_mobile_agent_flutterft_session_replay_flutter를 모두 설치해야 합니다.
  • ft_mobile_agent_flutter 0.5.7부터는 Session Replay 기능이 내장되어 있지 않으며, Session Replay API는 ft_session_replay_flutter에서 가져와야 합니다.
  • Android는 ft-sdk:1.7.3, ft-native:1.1.3, ft-session-replay:0.1.6-beta01을 사용하고, iOS는 FTMobileSDK 1.6.5FTMobileSDK/FTSessionReplay 1.6.5를 사용합니다.
  • iOS 프로젝트의 Deployment Target은 12.0 이상이어야 합니다.
  • RUM 초기화를 먼저 완료한 후 Session Replay를 초기화하여 app_id, session_id, view_id 등의 컨텍스트가 먼저 설정되도록 권장합니다.

설치

프로젝트 경로에서 다음을 실행합니다.

flutter pub add ft_mobile_agent_flutter
flutter pub add ft_session_replay_flutter

그러면 패키지의 pubspec.yaml에 다음과 같이 의존성이 추가됩니다.

dependencies:
  ft_mobile_agent_flutter: [latest_version]
  ft_session_replay_flutter: [session_replay_version]

아직 릴리스되지 않은 버전을 로컬에서 디버깅할 때는 path 의존성을 사용할 수 있습니다.

dependencies:
  ft_mobile_agent_flutter:
    path: /path/to/ft-sdk-flutter
  ft_session_replay_flutter:
    path: /path/to/ft-sdk-flutter/packages/ft_session_replay_flutter

그런 다음 다음을 실행합니다.

flutter pub get

iOS 추가 설정

앱의 ios/Podfile에서 최소 버전이 12.0 이상인지 확인합니다.

platform :ios, '12.0'

CocoaPods 의존성을 업데이트합니다.

cd ios
pod install

CocoaPods에서 FTMobileSDK 버전 또는 Deployment Target 충돌이 발생하는 경우, 프로젝트에 더 낮은 버전의 FTMobileSDK 또는 iOS 배포 버전을 고정하는 다른 의존성이 없는지 확인하세요.

코드 호출

Dart 코드에서 메인 패키지와 Session Replay 패키지를 함께 가져옵니다.

import 'package:ft_mobile_agent_flutter/ft_mobile_agent_flutter.dart';
import 'package:ft_session_replay_flutter/ft_session_replay_flutter.dart';

권장 초기화 순서:

  1. WidgetsFlutterBinding.ensureInitialized()
  2. FTMobileFlutter.sdkConfig(...)
  3. FTRUMManager().setConfig(...)
  4. FTSessionReplayManager().setConfig(...)
  5. SessionReplayCapture를 사용하여 녹화할 Flutter 뷰 트리를 감쌉니다.
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await FTMobileFlutter.sdkConfig(
    datawayUrl: datawayUrl,
    cliToken: cliToken,
    serviceName: serviceName,
    debug: true,
  );

  await FTRUMManager().setConfig(
    androidAppId: androidAppId,
    iOSAppId: iOSAppId,
    sampleRate: 1.0,
    enableUserResource: true,
    enableNativeAppUIBlock: true,
    enableTrackNativeCrash: true,
  );

  await FTSessionReplayManager().setConfig(
    FTSessionReplayConfig(
      sampleRate: 1.0,
      sessionReplayOnErrorSampleRate: 0.0,
      touchPrivacy: FTTouchPrivacyLevel.show,
      textAndInputPrivacy: FTTextAndInputPrivacyLevel.maskSensitiveInputs,
      imagePrivacy: FTImagePrivacyLevel.maskAll,
      enableSwiftUI: false,
    ),
  );

  runApp(
    SessionReplayCapture(
      key: const ValueKey('session-replay-root'),
      child: const MyApp(),
    ),
  );
}

앱이 MaterialApp.builder를 사용하여 페이지를 일괄적으로 감싸는 경우, builder에서 SessionReplayCapture를 사용할 수도 있습니다.

MaterialApp(
  builder: (BuildContext context, Widget? child) {
    return SessionReplayCapture(
      key: const ValueKey('session-replay-root'),
      child: child ?? const SizedBox.shrink(),
    );
  },
);
속성 유형 필수 설명
sampleRate double 아니오 샘플링 비율, 범위 [0,1], 0은 수집 안 함, 1은 전체 수집, 기본값 1. 이 샘플링 비율은 RUM 샘플링을 기반으로 한 추가 샘플링입니다.
sessionReplayOnErrorSampleRate double 아니오 오류 시나리오에서의 Session Replay 샘플링 비율, 범위 [0,1], 0은 수집 안 함, 1은 전체 수집, 기본값 0.
touchPrivacy FTTouchPrivacyLevel 아니오 터치 동작의 프라이버시 수준을 설정합니다. FTTouchPrivacyLevel.show는 터치 동작을 표시하고, FTTouchPrivacyLevel.hide는 터치 동작을 숨깁니다. 기본값 FTTouchPrivacyLevel.hide.
textAndInputPrivacy FTTextAndInputPrivacyLevel 아니오 텍스트 및 입력 내용의 프라이버시 수준을 설정합니다. maskSensitiveInputs는 민감한 입력만 마스킹하고, maskAllInputs는 모든 입력 내용을 마스킹하며, maskAll은 모든 텍스트 및 입력 내용을 마스킹합니다. 기본값 maskAll.
imagePrivacy FTImagePrivacyLevel 아니오 이미지 콘텐츠의 프라이버시 수준을 설정합니다. maskNone은 이미지를 마스킹하지 않고, maskLargeOnly는 네이티브 SDK의 일부 이미지 마스킹 전략을 사용하며, maskAll은 모든 이미지를 마스킹합니다. 기본값 maskAll.
enableLinkRUMKeys List 아니오 설정된 키를 기반으로 RUM 컨텍스트의 해당 필드를 세션 리플레이 데이터에 연결하여 세션 리플레이 데이터 분산에 사용할 수 있습니다.
enableSwiftUI bool 아니오 iOS: 네이티브 SwiftUI 세션 리플레이 녹화를 활성화할지 여부, 기본값 false. Flutter Widget 녹화는 여전히 SessionReplayCapture를 사용하여 뷰 트리를 감싸야 합니다.

RUM View 연결

Session Replay 데이터는 RUM View 컨텍스트에 연결되어야 합니다. FTRouteObserver를 사용하여 페이지 전환을 자동으로 수집하거나, 사용자 정의 페이지 수명 주기에서 FTRUMManager().starView(...)FTRUMManager().stopView(...)를 수동으로 호출하세요.

MaterialApp(
  navigatorObservers: [
    FTRouteObserver(),
  ],
);

기본 SDK 또는 RUM이 초기화되지 않은 경우 Session Replay 초기화로 인해 앱이 충돌하지는 않지만, 업로드 가능한 리플레이 데이터는 생성되지 않습니다.

프라이버시 오버라이드

SessionReplayPrivacy를 사용하여 로컬 Flutter 뷰 트리에 프라이버시 오버라이드를 설정할 수 있습니다. 프라이버시 오버라이드는 하위 뷰에 적용되며, 여러 계층의 오버라이드가 있는 경우 하위 뷰는 가장 가까운 상위 프라이버시 구성을 사용합니다.

SessionReplayPrivacy(
  textAndInputPrivacyLevel: FTTextAndInputPrivacyLevel.maskAll,
  imagePrivacyLevel: FTImagePrivacyLevel.maskAll,
  touchPrivacyLevel: FTTouchPrivacyLevel.hide,
  child: child,
);

세션 리플레이 보기

모바일에서의 세션 리플레이는 웹과 동일한 방식으로 확인할 수 있습니다. 자세한 내용은 웹 세션 리플레이 접근 방법을 참조하세요.

문서 평가

이 페이지가 도움이 되었나요?