고급 사용법
'Test Solution' SDK의 기본 기능에 익숙해지셨다면, 몇 가지 고급 기능을 활용하여 Host 앱과의 연동을 더욱 깊이 있게 제어할 수 있습니다. 이 가이드에서는 customData를 이용한 데이터 전달 및 quit 함수를 이용한 테스트 강제 종료 방법, getSDKVersion 함수를 이용한 SDK 버전 조회 방법을 다룹니다.
Passthrough 데이터 활용하기 (customData)
customData는 Host 앱의 특정 데이터를 SDK에 전달한 후, 테스트가 종료될 때 onResult 콜백을 통해 그대로 다시 돌려받을 수 있는 매우 유용한 파라미터입니다. SDK는 이 데이터의 내용을 해석하거나 사용하지 않고 그대로 반환(Passthrough)합니다.
사용 사례
- 세션 ID 관리: Host 앱의 내부 사용자 세션 ID나 트랜잭션 ID를
customData에 담아 보낼 수 있습니다. 테스트 완료 후 결과를 수신했을 때, 어떤 세션에서 발생한 결과인지 즉시 매칭할 수 있습니다. - A/B 테스트: 특정 UI나 기능에 대한 A/B 테스트를 진행 중일 때, 사용자가 속한 그룹(
'group_a','group_b')을customData에 담아 보낼 수 있습니다. 결과 분석 시 이 값을 활용하여 그룹별 통계를 낼 수 있습니다. - 콜백 컨텍스트 유지: 비동기적으로 처리되는
onResult콜백에서 테스트 시작 시점의 특정 상태나 컨텍스트를 유지해야 할 때 유용합니다.
구현 방법
-
startTest호출 시customData전달startTest함수의customData파라미터에 원하는 데이터를Map(또는 Dictionary) 형태로 전달합니다.Android (Kotlin)
val customData = mapOf(
"userSessionId" to "sid_12345abc",
"abTestGroup" to "B",
"sourceView" to "main_banner"
)
val arguments = mapOf(
"goodsId" to "[GOODS_ID]",
"suid" to "[SUID]",
"language" to "[LANGUAGE]",
"customData" to customData // 커스텀 데이터 전달
)
channel.invokeMethod("startTest", arguments)iOS (Swift)
let customData: [String: Any] = [
"userSessionId": "sid_12345abc",
"abTestGroup": "B",
"sourceView": "main_banner"
]
let arguments = [
"goodsId": "[GOODS_ID]",
"suid": "[SUID]",
"language": "[LANGUAGE]",
"customData": customData // 커스텀 데이터 전달
]
channel.invokeMethod("startTest", arguments: arguments) -
onResult콜백에서customData수신 테스트가 완료되면onResult콜백이 호출되며, 전달받은 결과 데이터 객체 안에customData가 그대로 포함되어 있습니다.Android (Kotlin)
// onResult 콜백 핸들러
fun onResult(result: Map<String, Any?>) {
// ... 다른 결과 데이터 처리 ...
// customData 추출 및 활용
val receivedCustomData = result["customData"] as? Map<String, Any>
if (receivedCustomData != null) {
val sessionId = receivedCustomData["userSessionId"] as? String
Log.d("TestSolution", "Result received for session: $sessionId")
}
}iOS (Swift)
// onResult 콜백 핸들러
func onResult(result: [String: Any?]) {
// ... 다른 결과 데이터 처리 ...
// customData 추출 및 활용
if let receivedCustomData = result["customData"] as? [String: Any],
let sessionId = receivedCustomData["userSessionId"] as? String {
print("Result received for session: \(sessionId)")
}
}
테스트 강제 종료하기 (quit)
특정 시나리오에서는 사용자가 테스트를 완료하기 전에 SDK 화면을 닫아야 할 수 있습니다. quit 함수는 Host 앱에서 명시적으로 SDK를 종료시키고 싶을 때 사용합니다.
사용 사례
- 앱 내 다른 화면으로의 이동: 사용자가 테스트 진행 중 푸시 알림을 탭하여 앱의 다른 섹션으로 이동해야 할 때, 현재 진행 중인 테스트를 깔끔하게 종료할 수 있습니다.
- Host 앱의 타임아웃 로직: Host 앱 자체적으로 세션 타임아웃 기능이 있는 경우, 시간이 만료되면
quit를 호출하여 테스트를 중단시킬 수 있습니다.
quit 함수를 호출하면 강제 종료로 인해 콜백 수신이 불가능할 수 있습니다. onResult 콜백이 호출될 수는 있으나, 결과 데이터가 비어있거나 '중단됨'을 의미하는 특정 상태 값을 포함할 수 있습니다. 자세한 onResult 데이터 명세는 API 명세 > Callbacks 문서를 참고하세요.
구현 방법
Host 앱에서 MethodChannel을 통해 quit 메소드를 호출합니다.
Android (Kotlin)
fun closeTestForcefully() {
channel.invokeMethod("quit")
}
iOS (Swift)
@objc func closeButtonTapped() {
channel.invokeMethod("quit", arguments: nil)
}
SDK 버전 확인하기
getSDKVersion 은 Host 앱에서 현재 통합된 'Test Solution' SDK의 버전 정보를 확인할 수 있는 MethodChannel 호출입니다.
이 기능은 주로 다음과 같은 상황에서 유용하게 사용됩니다.
- 문제 해결 및 디버깅: 특정 버전의 SDK에서 문제가 발생하는지 확인할 때, SDK 버전을 함께 기록하여 원인 파악을 용이하게 할 수 있습니다.
- 버전별 기능 분기: SDK 업데이트에 따라 Host 앱의 동작을 다르게 처리해야 할 경우, 버전을 확인하여 코드를 분기할 수 있습니다.
getSDKVersion은 별도의 파라미터 없이 호출하며, 문자열(String) 형태의 버전 정보를 반환합니다. (예: "1.2.3+10203")
호출 예시
Android (Kotlin)
// MethodChannel을 통해 getSDKVersion 호출
methodChannel.invokeMethod("getSDKVersion", null, object : MethodChannel.Result {
override fun success(result: Any?) {
val sdkVersion = result as? Map<*, *>
Log.d("MyHostApp", "Test Solution SDK Version: ${sdkVersion.toString()}")
// sdkVersion 변수를 사용하여 필요한 로직 처리
}
override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
Log.e("MyHostApp", "Failed to get SDK version: $errorMessage")
}
override fun notImplemented() {
Log.e("MyHostApp", "getSDKVersion not implemented")
}
})
iOS (Swift)
// FlutterMethodChannel을 통해 getSDKVersion 호출
self.flutterChannel.invokeMethod("getSDKVersion", arguments: nil) { (result) in
if let sdkVersion = result as? [String: Any] {
print("Test Solution SDK Version: \(sdkVersion)")
// sdkVersion 변수를 사용하여 필요한 로직 처리
} else if let error = result as? FlutterError {
print("Failed to get SDK version: \(error.message ?? "Unknown error")")
}
}