Flutter 세션 리플레이¶
전제 조건¶
- Flutter RUM 설정 및 초기화가 완료되어 있어야 하며, View 모니터링 수집이 활성화되어 있어야 합니다.
- Flutter 세션 리플레이는
ft_mobile_agent_flutter와ft_session_replay_flutter를 모두 설치해야 합니다. ft_mobile_agent_flutter0.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.5와FTMobileSDK/FTSessionReplay 1.6.5를 사용합니다. - iOS 프로젝트의 Deployment Target은
12.0이상이어야 합니다. - RUM 초기화를 먼저 완료한 후 Session Replay를 초기화하여
app_id,session_id,view_id등의 컨텍스트가 먼저 설정되도록 권장합니다.
설치¶
프로젝트 경로에서 다음을 실행합니다.
그러면 패키지의 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
그런 다음 다음을 실행합니다.
iOS 추가 설정¶
앱의 ios/Podfile에서 최소 버전이 12.0 이상인지 확인합니다.
CocoaPods 의존성을 업데이트합니다.
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';
권장 초기화 순서:
WidgetsFlutterBinding.ensureInitialized()FTMobileFlutter.sdkConfig(...)FTRUMManager().setConfig(...)FTSessionReplayManager().setConfig(...)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(...)를 수동으로 호출하세요.
기본 SDK 또는 RUM이 초기화되지 않은 경우 Session Replay 초기화로 인해 앱이 충돌하지는 않지만, 업로드 가능한 리플레이 데이터는 생성되지 않습니다.
프라이버시 오버라이드¶
SessionReplayPrivacy를 사용하여 로컬 Flutter 뷰 트리에 프라이버시 오버라이드를 설정할 수 있습니다. 프라이버시 오버라이드는 하위 뷰에 적용되며, 여러 계층의 오버라이드가 있는 경우 하위 뷰는 가장 가까운 상위 프라이버시 구성을 사용합니다.
SessionReplayPrivacy(
textAndInputPrivacyLevel: FTTextAndInputPrivacyLevel.maskAll,
imagePrivacyLevel: FTImagePrivacyLevel.maskAll,
touchPrivacyLevel: FTTouchPrivacyLevel.hide,
child: child,
);
세션 리플레이 보기¶
모바일에서의 세션 리플레이는 웹과 동일한 방식으로 확인할 수 있습니다. 자세한 내용은 웹 세션 리플레이 접근 방법을 참조하세요.