C++
接続する前に、まず接続前の準備をお読みください。
c++のバージョン要件はc++ 11です。g++ 5.1.0以上のバージョンが必要です。
最新バージョン:v2.0.0
更新日:2023-11-30
リソースのダウンロード:ソースコード
このドキュメントはv2.0.0以降のバージョンに適用されます。以前のバージョンについては、C++ SDK接続ガイド(V1)を参照してください
1. SDKの統合
Ⅰ. ソースコードをコンパイルしてlibthinkingdata.aファイルを取得
- AE SDKはrapidjson 解析ライブラリに依存しているため、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/TDAnalytics.cpp src/TDUtils.cpp src/TDLoggerConsumer.cpp src/TDConsumer.cpp)
if(UNIX)
find_package(Threads REQUIRED)
target_link_libraries(${TE_LIB_NAME} Threads::Threads)
endif()
- rapidjsonライブラリは
.hのみで構成されるライブラリのため、ヘッダーファイルとしてプロジェクトに取り込みます。- プロジェクトにrapidjsonライブラリを取り込んでいない場合は、次のヘッダーファイルをインポートしてください:
include
├── rapidjson
├── TDAnalytics.h
├── TDBatchConsumer.h
├── TDConsumer.h
├── TDDebugConsumer.h
├── TDJsonParse.h
├── TDLoggerConsumer.h
├── TDNetwork.h
└── TDUtils.h
- プロジェクトにすでにrapidjsonライブラリを取り込んでいる場合は、AE SDKのヘッダーファイルのみをインポートしてください。そのうえで、
TDJsonParse.hファイルの内容を変更・確認し、ファイル内のrapidjsonライブラリのインクルードパスが正しいかどうかを確認します:
#ifndef CPP_TD_JSON_PARSE_H
#define CPP_TD_JSON_PARSE_H
#include "rapidjson/document.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/writer.h"
#endif // !CPP_TD_JSON_PARSE_H
Ⅱ. LogBusのインストール
SDK+LogBusの形式でサーバー側のデータの収集と送信を行うことをお勧めします。次のドキュメントを参考に、LogBusをインストールしてください:LogBus使用ガイド
2. 初期化
ヘッダーファイルをインポートします:
#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の両方を使用する場合は、この2つの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.emplace_back("item11");
test_list.emplace_back("item21");
event_properties.SetList("test_list1", test_list);
// track event
te.track("accountId", "distinctId", "eventName", event_properties);
- イベント名は文字列型で、英字で始まり、数字、英字、アンダースコア"_"を含めることができます。最大長は50文字です。
- Keyはそのプロパティの名前で、文字列型です。英字で始まり、数字、英字、アンダースコア "_" を含めることができます。最大長は50文字で、英字の大文字と小文字は区別されません。AEはすべて小文字に変換します
- Valueはプロパティの値で、文字列、数値、ブール値、時間、オブジェクト、オブジェクトグループ、配列に対応しています
ユーザープロパティの要件は、イベントプロパティと同じです
3.2 ユーザープロパティの設定
一般的なユーザープロパティは、user_setを呼び出して設定できます。このインターフェースで送信したプロパティは、既存のプロパティ値を上書きします。そのユーザープロパティが以前に存在しない場合は新しく作成され、タイプは渡されたプロパティのタイプと同じになります。ここでは、ユーザー名の設定を例にします:
// user_set
TDPropertiesNode userSet_properties;
userSet_properties.SetString("userName", "test");
// ユーザープロパティを送信
te.user_set("accountId", "distinctId", userSet_properties);
3.3 データの送信
TDLoggerConsumerを使用する場合、収集したイベントはまずjson文字列に変換され、キャッシュ配列に追加されます。配列の要素数が設定した容量を超えた時点で、データがディスクに書き込まれます。デフォルトの容量上限は20件です。
業務シナリオによっては、データをすぐにAEサーバーへ送信したい場合があります。その場合はflush()インターフェースを呼び出します。なお、flush()を頻繁に呼び出すと、サービスのパフォーマンスが低下します。
te.flush();
3.4 SDKの終了
te.close();
SDKを終了します。キャッシュ内のデータが失われないよう、サーバーをシャットダウンする前にこのインターフェースを呼び出してください
4. ベストプラクティス
次のサンプルコードには、上記のすべての操作が含まれています。次の手順で使用することをお勧めします:
// ヘッダーファイルをインポート(パスはプラットフォームやIDEによって異なるため、適宜調整してください)
#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);
//イベントを送信
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", "distinctId", "eventName", event_properties);
//ユーザープロパティを送信
TDPropertiesNode userSet_properties;
userSet_properties.SetString("userName", "test");
te.user_set("accountId", "distinctId", userSet_properties);
// flushインターフェースを呼び出すと、データはすぐにファイルに書き込まれます。本番環境では、flushを頻繁に呼び出してIOやネットワークのオーバーヘッドが発生しないよう注意してください
// 通常は手動で呼び出す必要はありません
te.flush();

