세션 리플레이 iOS 플러그인
이 문서에서는 iOS 플러그인을 사용하여 세션 리플레이를 설치하는 방법을 설명합니다. 앱에서 이미 Amplitude iOS Swift SDK 또는 기존 Amplitude iOS SDK를 사용하는 경우 이 옵션을 사용하십시오.
Analytics-Swift SDK 및 Amplitude(액션) 목적지를 통해 세그먼트를 사용하는 경우 세그먼트 플러그인을 선택하십시오.
제품 내 분석을 위해 Amplitude 이외의 공급자를 사용하는 경우, 독립형 구현을 선택하십시오.
Unified SDK
다른 Amplitude 제품(분석, 실험)과 함께 세션 리플레이를 이용하려면 Swift용 Unified SDK를 설치하십시오. 통합 SDK는 모든 Amplitude 기능을 위한 단일 진입점을 제공하며 모든 구성 요소의 초기화 및 구성을 처리함으로써 통합을 단순화합니다.
세션 리플레이 및 성능
Amplitude는 다음을 통해 설치된 iOS 앱의 성능에 미치는 영향을 최소화하기 위해 세션 리플레이 기능을 구축했습니다.
- 주 사용자 인터페이스 스레드를 차단하지 않도록 비동기적으로 리플레이 데이터를 처리합니다. 메인 스레드는 뷰 계층과 상호 작용하는 데 사용되어야 하지만 모든 처리는 백그라운드 큐에서 수행됩니다.
- 배치 및 경량 압축을 사용하여 네트워크 연결 수와 대역폭을 줄입니다.
- 뷰 계층 구조 처리 최적화. 계층 구조 처리에 문제가 있는 경우 Amplitude에 문의하십시오.
세션 리플레이는 기본 뷰와 모든 하위 뷰를 포함하여 앱의 뷰 트리에 대한 변경 사항을 재귀적으로 캡처합니다. 그런 다음 세션 리플레이는 이러한 변경 사항을 재생하여 비디오와 유사한 재생을 구성합니다. 세션이 시작될 때 세션 리플레이는 앱의 뷰 트리의 전체 스냅샷을 캡처합니다. 사용자가 앱과 상호작용할 때 세션 리플레이는 각 뷰 변경을 차이로 캡처합니다. 세션의 재생을 시청할 때 세션 리플레이는 각 차이를 순차적으로 원본 뷰 트리에 다시 적용하여 재생을 구성합니다. 세션 리플레이에는 최대 길이가 없습니다.
문제 리포트
iOS용 세션 리플레이와 관련된 문제를 리포트하려면 AmplitudeSessionReplay-ios GitHub 저장소로 이동하십시오.
시작하기 전에
사용하는 방법은 사용하는 Amplitude iOS SDK의 버전에 따라 다릅니다.
세션 리플레이 iOS 플러그인을 사용하려면 다음이 필요합니다.
- 애플리케이션은 iOS 또는 iPadOS에서 실행됩니다.
- iOS Swift SDK 이상을
1.9.0사용하고 있습니다.
지원되는 iOS 버전
세션 리플레이는 iOS 13 이상을 지원합니다.
빠른 시작
최신 버전의 플러그인을 프로젝트 종속성에 추가합니다.
Swift 패키지 관리자
세션 리플레이를 Package.swift 파일이나 Xcode의 패키지 목록에 의존성으로 추가하십시오.
dependencies: [
.package(url: "https://github.com/amplitude/AmplitudeSessionReplay-iOS", from: "0.17.0")
]
Amplitude-Swift와의 통합을 위해 AmplitudeSwiftSessionReplayPlugin 타겟을 사용하십시오.
.product(name: "AmplitudeSwiftSessionReplayPlugin", package: "AmplitudeSessionReplay")
CocoaPods
코어 라이브러리와 플러그인을 사용자의 Podfile에 추가하십시오.
pod 'AmplitudeSessionReplay', :git => 'https://github.com/amplitude/AmplitudeSessionReplay-iOS.git', :tag => 'v0.17.0'
pod 'AmplitudeSwiftSessionReplayPlugin', :git => 'https://github.com/amplitude/AmplitudeSessionReplay-iOS.git', :tag => 'v0.17.0'
애플리케이션 코드 구성
import AmplitudeSwift
import AmplitudeSwiftSessionReplayPlugin
// Initialize Amplitude Analytics SDK instance
let amplitude = Amplitude(configuration: Configuration(apiKey: API_KEY))
// Create and Install Session Replay Plugin
// Recording will be handled automatically
amplitude.add(plugin: AmplitudeSwiftSessionReplayPlugin(sampleRate: 1.0))
구성
세션 리플레이 플러그인을 초기화할 때 다음 옵션을 전달하십시오.
| 이름 | 유형 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
sampleRate | Float | 아니요 | 0 | Amplitude가 재생 수집을 위해 선택하는 세션 수를 제어합니다. 값은 0과 1 사이의 소수이며(예: 0.4), Amplitude가 세션 리플레이 수집을 위해 무작위로 선택하는 세션의 비율을 나타냅니다. 많은 수의 세션 중에서 0.4는 해당 세션의 40%을 선택합니다. |
enableRemoteConfig | Bool | 아니요 | true | 이 세션 리플레이 인스턴스에 대한 원격 구성을 활성화하거나 비활성화합니다. |
autoStart | Bool | 아니요 | true | 세션 리플레이가 초기화될 때 자동으로 캡처를 시작할지 여부를 제어합니다. |
maskLevel | MaskLevel | 아니요 | .medium | 세션 리플레이가 화면상의 콘텐츠를 얼마나 많이 마스킹할지 설정합니다. .light, .medium 또는 .conservative을 사용하십시오. 자세한 내용은 마스크 수준을 참조하십시오. |
captureWebViews | Bool | 아니요 | false | 웹 보기 콘텐츠를 캡처할 수 있습니다. 기본적으로 세션 리플레이는 웹 뷰를 차단합니다. |
webviewMappings | [String: String] | 아니요 | [:] | 캡처된 웹 뷰 콘텐츠의 하위 문자열을 대체 값에 매핑합니다. captureWebViews을 활성화하면 세션 리플레이는 업로드하기 전에 웹 뷰 기록 데이터에 각 항목을 대소문자를 구분하지 않는 검색 및 바꾸기로 적용합니다. 이것은 고급옵션입니다. 대부분의 앱은 비워 둡니다. |
recordLogOptions.logCountThreshold | Int | 아니요 | 1000 | 세션당 최대 로그 수를 설정합니다. |
recordLogOptions.maxMessageLength | Int | 아니요 | 2000 | 로그 메시지의 최대 길이를 설정합니다. |
quality | QualityProfile | 아니요 | .high | 캡처 및 인코딩 품질(예: 프레임 속도 및 이미지 해상도)을 제어합니다. .low, .medium 또는 .high을 사용하여 재생 충실도와 성능 및 저장 용량의 균형을 맞출 수 있습니다. SDK가 장치에 따라 프로파일을 선택하도록 하려면 QualityProfile.automatic를 사용합니다. |
uploadConfig | UploadConfig | 아니요 | UploadConfig() | 세션 리플레이가 데이터를 업로드하는 시점을 제어합니다. 종량제 네트워크(예: 셀룰러)에서 업로드를 일시 중지하려면 UploadConfig(disableMeteredUploads: true)를 사용하십시오. |
사용자 지정 세션 ID
iOS 버전 0.11.2 이상용 세션 리플레이는 customSessionId속성을 통해 문자열 세션 ID(예: UUID)를 지원합니다. 프로젝트에서 Amplitude 대신 사용자 정의 이벤트 속성을 사용하여 세션을 정의하는 경우 사용자 정의 세션 ID를 사용하십시오session_id.
customSessionId를 설정하면 이 값이 플러그인이 Amplitude SDK에서 데이터 동기화하는 세션 ID보다 우선합니다. Amplitude 세션 ID를 사용하여 재개하도록 속성을 nil로 설정하십시오.
// Keep a reference to the plugin to set the custom session ID
let sessionReplayPlugin = AmplitudeSwiftSessionReplayPlugin(sampleRate: 1.0)
sessionReplayPlugin.customSessionId = "ef197fc7-a46f-4e6c-a77f-8d90c17065c0"
amplitude.add(plugin: sessionReplayPlugin)
// Whenever your custom session changes
sessionReplayPlugin.customSessionId = NEW_CUSTOM_SESSION_ID
세션 리플레이가 사용자 정의 세션을 안정적으로 일치시키려면 사용자 정의 세션 ID가 다음 제약 조건을 따라야 합니다.
- 이 값은
/을 포함할 수 없습니다. 세션 리플레이는/을 세션 리플레이 ID의 구분 기호로 사용하며, 형식은<deviceId>/<sessionId>입니다. - 값에는
a-z A-Z 0-9 _ - . | @ : =문자만 포함할 수 있습니다. - 이 값은 이벤트에 대해 Amplitude로 전송하는 세션 정의 속성과 일치해야 합니다. 자세한 내용은 세션 일치를 참조하십시오.
런타임 시 마스킹 변경
앱이 실행되는 동안 자동 마스킹 수준이 변경되도록 플러그인에 privacyConfig을 설정합니다. 플러그인을 Amplitude에 추가하기 전이나 후에 설정하십시오.
sessionReplayPlugin.privacyConfig = PrivacyConfig(maskLevel: .conservative)
원격 구성에서 마스킹 수준을 제공하는 경우 해당 수준이 우선합니다. 플러그인은 로컬 privacyConfig 값을 유지하며 원격 구성에서 마스킹 수준을 제공하지 않거나 원격 구성을 비활성화할 때 이 값을 적용합니다.
원격 구성
Amplitude에서 샘플링 비율과 마스크 수준을 설정할 수 있도록 원격 구성을 활성화합니다.
원격 구성 및 테스트
enableRemoteConfig를 true로 설정하면 Amplitude에서 정의한 설정이 SDK에서 로컬로 정의한 설정보다 우선합니다. 이러한 이유로 애플리케이션을 테스트하는 동안 원격 구성을 비활성화하여 sampleRate를 1로 설정하고 테스트 세션을 캡처할 수 있도록 해야 합니다.
화면상의 데이터 차단
세션 리플레이는 화면에 표시되는 민감한 데이터를 차단하는 세 가지 방법을 지원합니다. WebView에 대한 마스킹 설정은 웹 뷰 지원 섹션에서 확인하실 수 있습니다.
마스크 수준
iOS용 세션 리플레이는 maskLevel 옵션을 사용하여 구성할 수 있는 세 가지 수준의 마스킹을 지원합니다.
이 옵션은 세션 리플레이 설정에서 사용하십시오.
| 마스크 수준 | 설명 |
|---|---|
light | 모든 암호, 이메일 주소, 신용카드 번호 및 전화번호를 숨깁니다. |
medium | 편집 가능한 모든 텍스트 뷰를 마스크합니다. |
conservative | 모든 텍스트 뷰를 마스크합니다. |
UIKit의 개인정보 보호 방법
세션 리플레이는 UIView에서 개인정보 보호 기능을 관리하기 위한 확장 기능을 제공합니다. 사용하려면 세션 리플레이 라이브러리를 가져오십시오.
import AmplitudeSessionReplay
| 변수 | 설명 |
|---|---|
amp_isBlocked | 세션 리플레이에서 뷰와 그 하위 뷰를 위치 표시자로 대체하려면 view.amp_isBlocked를 설정하세요. UITextViews 및 UITextFields는 자동으로 차단됩니다. 기본적으로 마스크된 뷰의 차단을 해제하려면 이 값을 false로 설정하십시오 |
SwiftUI의 개인정보 보호 수정자
세션 리플레이는 개인정보 보호를 관리하기 위한 View 확장 기능을 제공합니다. 세션 리플레이 라이브러리를 가져와서 액세스 하세요.
import AmplitudeSessionReplay
| 수정자 | 설명 |
|---|---|
amp_setBlocked(_ blocked: Bool) | 세션 리플레이에서 특정 뷰와 그 하위 뷰를 플레이스홀더로 대체하려면 View에 amp_setBlocked() 수정자를 추가하세요. 기본적으로 마스크된 뷰의 차단을 해제하려면 이 값을 false로 설정하십시오 |
사용자 옵트아웃
세션 리플레이 플러그인은 Amplitude-Swift SDK의 optOut설정을 따르며, 사용자 옵트아웃을 자체적으로 지원하지 않습니다.
// Set optOut on the Amplitude SDK
let amplitude = Amplitude(configuration: Configuration(apiKey: API_KEY,
optOut: true,
/* other configuration */))
amplitude.add(plugin: AmplitudeSwiftSessionReplayPlugin(/* session replay options */))
EU 데이터 레지던시
세션 리플레이는 EU 데이터 센터를 사용하는 Amplitude 고객이 이용할 수 있습니다. 초기화할 때 serverZone 구성 옵션을 EU로 설정하십시오. 예를 들어:
// Set serverZone on the Amplitude SDK
let amplitude = Amplitude(configuration: Configuration(apiKey: API_KEY,
serverZone: .EU,
/* other configuration */))
amplitude.add(plugin: AmplitudeSwiftSessionReplayPlugin(/* session replay options */))
샘플링 비율
기본적으로 세션 리플레이는 세션의 0%를 수집하도록 설정되어 있습니다. SDK의 sampleRate 구성 옵션을 사용하여 캡처할 세션의 비율을 설정합니다.
수동 및 동적 샘플링, 할당량 계획 및 할당량 계산에 대한 자세한 내용은 세션 리플레이 샘플링 구성을 참조하세요.
// This configuration samples 1% of all sessions
amplitude.add(plugin: AmplitudeSwiftSessionReplayPlugin(sampleRate: 0.01))
레코딩 품질
재생 충실도와 성능 및 저장 공간의 균형을 맞추기 위해 품질 프로파일을 선택하십시오. 프로파일이 낮을수록 캡처 프레임 속도가 낮고 이미지 해상도가 낮습니다. 프로파일이 높을수록 프레임 속도가 높고 해상도가 높아집니다. SDK가 장치에 따라 프로파일을 선택하도록 허용하는 데 사용합니다(예: 최신 장치에서는 높음, 이전 장치에서는 낮음)QualityProfile.automatic.
// Use automatic profile selection based on device
amplitude.add(plugin: AmplitudeSwiftSessionReplayPlugin(
sampleRate: 0.1,
quality: .automatic
))
// Or set a fixed profile (low, medium, or high)
amplitude.add(plugin: AmplitudeSwiftSessionReplayPlugin(
sampleRate: 0.1,
quality: .medium
))
사용량이 부과되는 네트워크에서 업로드 비활성화
장치가 요금제 기반 네트워크에 있는 동안 세션 리플레이 업로드를 일시 중지하여 사용자의 휴대폰 데이터 사용을 방지하십시오. 세션 리플레이는 여전히 데이터를 로컬로 기록합니다. 기기가 Wi-Fi 또는 다른 종량제 제한이 없는 연결에 다시 연결되면 업로드가 재개됩니다.
// Set uploadConfig through the plugin's Config initializer
let config = AmplitudeSwiftSessionReplayPlugin.Config(
sampleRate: 0.1,
uploadConfig: UploadConfig(disableMeteredUploads: true)
)
amplitude.add(plugin: AmplitudeSwiftSessionReplayPlugin(config: config))
리플레이 수집 비활성화
세션 리플레이를 활성화한 후에는 다음 중 하나가 될 때까지 앱에서 실행됩니다.
- 사용자가 앱을 떠납니다.
sessionReplayPlugin.stop()을(를) 호출하십시오.amplitude.remove(plugin: sessionReplayPlugin)를 사용하여 SDK에서 플러그인을 제거합니다.
사용자가 앱의 제한된 영역으로 이동하기 전에 호출하여 사용자가 해당 영역에 있는 동안 재생 수집을 비활성화하십시오sessionReplayPlugin.stop().
참조 유지
이렇게 하려면 SessionReplayPlugin 인스턴스에 대한 참조를 유지해야 합니다 let sessionReplayPlugin = AmplitudeSwiftSessionReplayPlugin(/* session replay options */).
사용자가 앱의 제한되지 않은 영역으로 돌아왔을 때 재생 수집을 다시 활성화하려면 sessionReplayPlugin.start()를 호출하십시오.
특정 화면만 캡처하려면 플러그인이 시작될 때 시작되지 않도록 autoStart: false를 사용하여 초기화한 다음, 사용자가 해당 화면에 들어오거나 나갈 때 start() 및 stop()를 호출하십시오.
// Add the plugin once, without starting capture
let sessionReplayPlugin = AmplitudeSwiftSessionReplayPlugin(sampleRate: 1.0, autoStart: false)
amplitude.add(plugin: sessionReplayPlugin)
// Start capture when the user enters a screen you want to record
sessionReplayPlugin.start()
// Stop capture when the user leaves that screen
sessionReplayPlugin.stop()
또한 Amplitude 실험과 같은 기능 플래그 제품을 사용하여 위치와 같은 기준에 따라 재생 수집을 활성화하거나 비활성화하는 로직을 생성할 수도 있습니다. 예를 들어, 특정 사용자 그룹을 대상으로 하는 기능 플래그를 생성하고 이를 초기화 논리에 추가할 수 있습니다.
import AmplitudeSwift
import AmplitudeSwiftSessionReplayPlugin
// Your existing initialization logic with Amplitude-Swift SDK
let amplitude = Amplitude(configuration: Configuration(apiKey: API_KEY,
/* other configuration */))
if (nonEUCountryFlagEnabled) {
// Create and Install Session Replay Plugin
let sessionReplayPlugin = AmplitudeSwiftSessionReplayPlugin(sampleRate: 0.1)
amplitude.add(plugin: sessionReplayPlugin)
}
Web view 지원 (베타)
기본적으로 세션 리플레이는 캡처에서 웹 뷰를 차단합니다. 모든 WebView 구성 요소의 캡처를 활성화하려면 세션 리플레이 구성에서 captureWebViews를 true로 설정하십시오.
특정 WebView 구성 요소를 마스크하려면 화면 데이터 차단에 설명된 개인정보 보호 방법을 사용하십시오.
// UIKit
webView.amp_isBlocked = false
지도 보기 지원 (알파)
세션 리플레이는 iOS 애플리케이션에서 지도 보기 캡처를 지원합니다. 지도 보기 캡처를 활성화하려면 구현에서 지도 보기의 마스킹을 해제하십시오.
// UIKit
mapView.amp_isBlocked = false
// SwiftUI
Map().amp_setBlocked(false)
로그 기록
이용 가능 여부
AmplitudeSessionReplay0.8.0 이상은 로그 기록을 지원합니다.세션 리플레이는 iOS 애플리케이션에서 로그 기록을 지원합니다. 연동 초기화 시 recordLogOptions를 사용하여 제한을 설정한 다음 recordLog(level:message:date:)를 통해 로그 메시지를 전송하십시오.
import AmplitudeSessionReplay
let sessionReplay = SessionReplay(
apiKey: API_KEY,
recordLogOptions: .init(logCountThreshold: 2000, maxMessageLength: 4000)
)
sessionReplay.recordLog(level: .error, message: "This is an error log")
로그 시스템을 구현한 경우 한 곳만 수정하여 로그 기록 기능을 통합할 수 있습니다. 자세한 내용은 다음 예제를 참조하십시오.
CocoaLumberjack
CocoaLumberjack을 사용하는 경우 사용자 지정 로거 공급자와 통합할 수 있습니다.
class AmplitudeLogRecordLogger: DDAbstractLogger {
private weak var plugin: SessionReplayPlugin?
init(_ plugin: SessionReplayPlugin) {
self.plugin = plugin
}
override func log(message logMessage: DDLogMessage) {
let recordLevel: RecordLogLevel
switch logMessage.flag {
case .error:
recordLevel = .error
case .warning:
recordLevel = .warn
case .info:
recordLevel = .log
default:
return
}
plugin?.recordLog(level: recordLevel,
message: logMessage.message,
date: logMessage.timestamp)
}
}
let sessionReplayPlugin = AmplitudeSwiftSessionReplayPlugin()
amplitude.add(plugin: sessionReplayPlugin)
DDLog.add(AmplitudeLogRecordLogger(sessionReplayPlugin))
React Native
console 로그나 react-native-logs를 consoleTransport와 함께 사용한다면 이를 RCTAddLogFunction과 통합할 수 있습니다.
RCTAddLogFunction { level, source, fileName, lineNumber, message in
let recordLevel: RecordLogLevel
switch level {
case .error:
recordLevel = .error
case .warning:
recordLevel = .warn
case .info:
recordLevel = .log
case .fatal:
recordLevel = .error
case .trace:
recordLevel = .init("trace")
default:
return
}
self.sessionReplayPlugin.recordLog(level: recordLevel, message: message)
}
데이터 리텐션, 삭제 및 개인정보 보호
캡처를 구현할 때 동의 지침을 검토하십시오.
보관 기간
네이티브 및 Flutter SDK 보관 지침과 변경 시점에 대해서는 세션 리플레이 데이터 생애주기 분석 참조를 참조하세요.
DSAR API
DSAR API에서 반환된 리플레이 메타데이터에 대한 자세한 내용은 세션 리플레이 DSAR 메타데이터를 참조하세요.
데이터 삭제
사용자 및 프로젝트 삭제 동작에 대해서는 세션 리플레이 데이터 삭제를 참조하세요.
봇 필터
봇 필터링 및 속성 필터 제한에 대해서는 세션 리플레이 봇 필터링을 참조하세요.
세션 리플레이 저장 공간
사용자가 앱에서 추적을 거부하는 경우 optOut 구성 옵션을 사용하여 해당 사용자에 대한 리플레이 수집을 비활성화하십시오.
세션 리플레이 기능은 리플레이 데이터를 업로드하기 전에 파일 시스템에 임시로 저장합니다. 모든 초기화 시, 가장 오래된 리플레이 항목들을 트리밍하여 총 디스크 사용량을 최대 크기 이하로 줄입니다.
알려진 제한 사항
세션 리플레이 구현 시 다음 제한 사항을 염두에 두십시오.
세션 리플레이는 여러 프로젝트에 걸쳐 있는 동일 사용자의 리플레이를 하나로 연결하여 재생하지 않습니다. 예를 들어:
- 여러 앱을 별도의 Amplitude 프로젝트로 계측할 수 있으며 각 프로젝트에서 세션 리플레이 기능이 활성화되어 있습니다.
- 식별된 사용자는 한 앱에서 시작한 다음 다른 앱으로 전환합니다.
- Amplitude는 두 세션을 모두 캡처합니다.
- 각 세션의 리플레이는 해당 호스트 프로젝트에서 볼 수 있습니다.
조직에서 사용자 세션 정의를 사용하는 경우 사용자 세션 차트에는 세션 리플레이가 표시되지 않습니다.
세션 리플레이 기능은 다음과 같은 iOS 뷰를 캡처할 수 없습니다.
- SFSafariViewController와 같은 별도 프로세스에서 실행되는 iOS 뷰
- AVPlayerLayer 기반 뷰
이 내용이 도움이 되었나요?
For AI agents: a documentation index is available at /docs/llms.txt. Append .md to any page URL for markdown, or send Accept: text/markdown.