メインコンテンツまでスキップ

C++

最終更新 2026/10/07
ヒント

接続する前に、まず接続前の準備をお読みください。

c++のバージョン要件はc++ 11です。g++ 5.1.0以上のバージョンが必要です。

最新バージョン:v2.0.0

更新日:2023-11-30

リソースのダウンロード:ソースコード

注意

このドキュメントはv2.0.0以降のバージョンに適用されます。以前のバージョンについては、C++ SDK接続ガイド(V1)を参照してください

1. SDKの統合​

Ⅰ. ソースコードをコンパイルしてlibthinkingdata.aファイルを取得​
  1. AE SDKはrapidjson 解析ライブラリに依存しているため、rapidjsonライブラリをローカルにダウンロードする必要があります。
  2. 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()
  1. rapidjsonライブラリは.hのみで構成されるライブラリのため、ヘッダーファイルとしてプロジェクトに取り込みます。
    1. プロジェクトにrapidjsonライブラリを取り込んでいない場合は、次のヘッダーファイルをインポートしてください:
include
├── rapidjson
├── TDAnalytics.h
├── TDBatchConsumer.h
├── TDConsumer.h
├── TDDebugConsumer.h
├── TDJsonParse.h
├── TDLoggerConsumer.h
├── TDNetwork.h
└── TDUtils.h
  1. プロジェクトにすでに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();
このページは役に立ちましたか?