# C++
최신 버전:v2.0.0-beta.1
업데이트 시간:2023-10-08
다운로드:Source Code (opens new window)
# 1. SDK 구현
- 소스 코드를 컴파일하여,
libthinkingdata.a
파일을 가져옵니다.- TE SDK는 rapidjson (opens new window)해석 라이브러리에 의존하고 있으므로, 로컬에 rapidjson 라이브러리를 다운로드할 필요가 있습니다.
- C++ SDK의 소스코드를 다운로드하고, SDK 내의
CMakeLists.txt
파일을 변경하여 필요한 데이터 컨슈머를 선택하여 패키지화합니다(자세한 내용은 SDK의 소스코드 내의CMakeLists.txt
파일을 참조하십시오). 여기에서는 가장 일반적인logconsumer
를 예로 듭니다:
cmake_minimum_required(VERSION 3.12)
project(ThinkingData)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 11)
message(STATUS "[${PROJECT_NAME}] current cmake version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
message(STATUS "[${PROJECT_NAME}] CMAKE_HOST_SYSTEM: ${CMAKE_HOST_SYSTEM} ")
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE release CACHE STRING "Build Type" FORCE)
endif()
message(STATUS "[${PROJECT_NAME}] Build type:${CMAKE_BUILD_TYPE}")
message(STATUS "[${PROJECT_NAME}] Debug configuration:${CMAKE_CXX_FLAGS_DEBUG}")
message(STATUS "[${PROJECT_NAME}] release configuration:${CMAKE_CXX_FLAGS_RELEASE}")
message(STATUS "[${PROJECT_NAME}] release configuration with debug info:${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
message(STATUS "[${PROJECT_NAME}] minimal release configuration:${CMAKE_CXX_FLAGS_MINSIZEREL}")
include_directories(include)
#
# log consumer. Recommended for production environments
#
set(TE_LIB_NAME thinkingdata)
add_library(${TE_LIB_NAME} src/ThinkingAnalyticsAPI.cpp src/TAUtils.cpp src/TALoggerConsumer.cpp src/TDConsumer.cpp)
if(UNIX)
find_package(Threads REQUIRED)
target_link_libraries(${TE_LIB_NAME} Threads::Threads)
endif()
rapidjson 라이브러리는 순수한 .h 라이브러리이며, 따라서 프로젝트에 헤더 파일로서 수입됩니다.
- 만약 당신의 프로젝트가 rapidjson 라이브러리를 수입하고 있지 않다면, 다음 헤더 파일을 수입하십시오:
- 만약 당신의 프로젝트가 rapidjson 라이브러리를 수입하고 있지 않다면, 다음 헤더 파일을 수입하십시오:
rapidjson 라이브러리가 이미 프로젝트에 도입되어 있다면, TE SDK의 헤더 파일만을 수입하십시오. 다음으로, TDJsonParse.h 파일의 내용을 변경하여 rapidjson 라이브러리의 경로가 정확한지 확인하십시오.
Logbus 설치
TE 시스템을 통해 빠르고 정확한 데이터 전송을 위해, SDK와 LogBus를 함께 사용하여 서버 데이터의 데이터 리포트를 권장합니다.
# 2. 초기 설정
다음은 SDK의 초기 설정 포맷 코드입니다:
#include "../include/TDAnalytics.h"
#include "../include/TDLoggerConsumer.h"
#include "../include/TDDebugConsumer.h"
#include "../include/TDBatchConsumer.h"
using namespace thinkingDataAnalytics;
SDK의 초기화 예시입니다:
TDLoggerConsumer::Config config = TDLoggerConsumer::Config("LOG_DIRECTORY", 20, 500, TDLoggerConsumer::HOURLY);
config.fileNamePrefix = "te";
config.rotateMode = TDLoggerConsumer::HOURLY;
TDConsumer *consumer = new TDLoggerConsumer(config);
TDAnalytics te(*consumer, false);
LOG_DIRECTORY
는 로컬 액세스 파일의 주소가 됩니다. LogBus의 모니터링 폴더 주소를 여기에 설정하기만 하면, LogBus를 사용하여 데이터를 모니터링하고 업로드할 수 있습니다.
# 3. 주요 기능
게스트 ID와 계정 ID를 정확하게 연동하기 위해, 게임 내에서 게스트 ID와 계정 ID를 모두 사용하는 경우, 이들 ID를 동시에 업로드하는 것을 권장합니다. 동시에 업로드하지 않을 경우, 유저가 중복으로 계산될 수 있습니다.
# 3.1 이벤트 전송
track
을 사용하여 이벤트 전송을 합니다. 사전에 데이터 트래킹 정책을 준비한 후, 전송해 주세요. 다음은 모델 코드입니다.
TDPropertiesNode event_properties;
event_properties.SetString("name1", "XZ_debug");
event_properties.SetString("name2", "logbugs");
event_properties.SetString("name3", "name3");
event_properties.SetString("#uuid", "1234567890");
event_properties.SetNumber("test_number_int", 3);
event_properties.SetNumber("test_number_double", 3.14);
event_properties.SetBool("test_bool", true);
std::string test_string = "test_string";
event_properties.SetString("test_stl_string1", test_string);
event_properties.SetDateTime("test_time1", time(nullptr), 0);
timeb t = {};
ftime(&t);
event_properties.SetDateTime("#time", t.time, t.millitm);
std::vector<std::string> test_list;
test_list.push_back("item11");
test_list.push_back("item21");
event_properties.SetList("test_list1", test_list);
// track event
te.track(accountId, distincId, eventName, event_properties);
- 이벤트 이름은 string 타입으로, 영문자와 숫자, "_"를 포함하며 최대 50자입니다.
- Key는 해당 속성의 이름으로 string 타입이며, 영문자와 숫자, "_"를 포함하여 최대 50자입니다. TE 시스템은 일괄적으로 소문자로 통일됩니다.
- Value는 해당 속성의 값으로, String, Number, Bloon, Time, object, array, list object를 지원합니다.
유저 속성은 이벤트 속성과 일치해야 합니다.
# 3.2 유저 속성 설정
일반적인 유저 속성에 대해서는 userSet
을 사용하여 설정할 수 있으며, UserSet은 기존의 값을 덮어씁니다. 원래 해당 속성에 값이 없는 경우, 속성이 새로 생성됩니다. 다음은 코드 예시입니다.
// user_set
TDPropertiesNode userSet_properties;
userSet_properties.SetString("userName", "test");
//유저 속성 업로드
te.user_set(accountId, distincId, userSet_properties);
# 4. 코드 예시 (Example Code)
아래의 코드 예시에 모든 작업이 포함되어 있으며, 아래 순서대로 사용하는 것을 권장합니다:
// Import header files (the path varies for each platform and IDE, please adjust accordingly)
#include "../include/TDAnalytics.h"
#include "../include/TDLoggerConsumer.h"
using namespace thinkingDataAnalytics;
TDLoggerConsumer::Config config = TDLoggerConsumer::Config("LOG_DIRECTORY", 20, 500, TDLoggerConsumer::HOURLY);
config.fileNamePrefix = "te";
config.rotateMode = TDLoggerConsumer::HOURLY;
TDConsumer *consumer = new TDLoggerConsumer(config);
TDAnalytics te(*consumer, false);
//Upload event
TDPropertiesNode event_properties;
event_properties.SetString("name1", "XZ_debug");;
event_properties.SetNumber("test_number_int", 3);
event_properties.SetBool("test_bool", true);
te.track(accountId, distincId, eventName, event_properties);
//Upload user properties
TDPropertiesNode userSet_properties;
userSet_properties.SetString("userName", "test");
te.user_set(accountId, distincId, userSet_properties);
// Calling the flush interface will immediately write data to the file. In a production environment, be careful to avoid frequent calls to flush that may cause IO or network overhead issues.
// In general, there is no need to call manually.
te.flush();