C++ A/B Testing SDK 依赖于神策分析 SDK,在使用前请确保已经成功集成神策分析 SDK,并进行了 SDK 初始化,详情可参考 SDK 集成 (C++)。
版本依赖关系如下:
C++ A/B Testing SDK 从 v0.0.1 版本升级到 v0.0.2 及以上版本时,由于初始化接口 Init 发生了变化,会导致编译报错。此时,您需要传入一个文件路径用于缓存试验分流结果
集成 SDK
A/B Testing SDK 源文件可从 https://github.com/sensorsdata/abtesting-sdk-cpp/releases 获取。使用时可以将代码直接集成到目标项目中,或先编译为库再引入,SDK 源代码包括:
./include/sensors_abtesting_sdk.h
./include/sensors_json.hpp
./src/sensors_abtesting_sdk.cpp
初始化 SDK
在神策分析中创建 A/B Testing 后,会生成分流试验请求 URL,通过该 URL 初始化 A/B Testing SDK:
#include "sensors_analytics_sdk.h"
#include "sensors_json.hpp"
#include "sensors_abtesting_sdk.h"
// 需要先初始化 SA SDK
sensors_analytics::Sdk::Init(staging_file_path,
server_url,
distinct_id,
is_login_id,
max_staging_record_size);
// 初始化 A/B testing SDK(v0.0.2 及以上)
// server_url: 分流地址
// experiment_file_path: 保存试验的文件路径
sensors_abtesting::Sdk::Init(server_url, experiment_file_path);
// 初始化 A/B testing SDK(v0.0.1)
// server_url: 分流地址
sensors_abtesting::Sdk::Init(server_url);
A/B Testing SDK 会将请求到的试验结果进行缓存,也会将当前用户已触发试验的触发事件做标记进行缓存。当程序退出时会将相关内容暂时保存至本地文件中,当下次启动时会再次读取。
获取试验变量
初始化 SDK 之后,通过 API 获取具体试验的变量值,根据获取试验变量值的方式,可分为下面三种策略:
- FetchCacheABTest :读取本地缓存,缓存不存在时使用默认值
- AsyncFetchABTest :忽略本地缓存,从服务端获取数据
- FastFetchABTest :优先读取本地缓存,缓存不存在时从服务端获取数据
如何确定应该选择哪个 API 获取试验变量值?
1.一般情况下,我们推荐使用 FastFetchABTest 获取试验变量值。
2.如果您对性能有要求,可以使用 FetchCacheABTest,只从本地缓存中获取变量值,但可能导致用户无法及时命中最新的试验。
3.如果您进行时间片轮转试验,且对时效性有要求,可以使用 AsyncFetchABTest 获取试验变量值,但会存在一定的网络延迟。
1. 请确保对 A/B 分流返回的 result 结果 & 接口中使用的默认值,都做了正常的业务逻辑处理!
2. 请确保默认值 default_value 和当前试验值类型相同。比如参数对应试验值为 Int 类型,则传入的 default_value 也必须是 Int 类型,同时返回的试验结果 result 也是 Int 类型
以 FastFetchABTest 为例,可在相应的业务逻辑中添加如下代码:
// Number 类型试验(第二个参数 0,表示未命中试验时,会返回此默认值,请根据业务需要更改此处的值)
int main(int argc, const char * argv[]) {
// 初始化 A/B Testing SDK(v0.0.2 及以上)
sensors_abtesting::Sdk::Init("分流试验请求地址", "试验结果保存地址");
// 初始化 A/B Testing SDK(v0.0.1)
sensors_abtesting::Sdk::Init("分流试验请求地址");
sensors_abtesting::Sdk::FastFetchABTest("具体的试验参数", 0, [](const sensors_abtesting::json &value) {
int result = value.get<int>();
// TODO 请根据 result 进行自己的试验
});
return 0;
}
携带自定义属性获取试验变量
v0.0.2 及以上版本 SDK 支持自定义属性扩充受众筛选能力,可以在初始化 SDK 后,通过 API 添加自定义属性获取具体试验的变量值,根据获取试验变量值的方式,可分为下面 2 种策略:
- AsyncFetchABTest :忽略本地缓存,从服务端获取数据
- FastFetchABTest :优先读取本地缓存,缓存不存在时从服务端获取数据
以 FastFetchABTest 为例,可在相应的业务逻辑中添加如下代码:
// Number 类型试验(第二个参数 0,表示未命中试验时,会返回此默认值,请根据业务需要更改此处的值)
int main(int argc, const char * argv[]) {
// 初始化 A/B Testing SDK(v0.0.2 及以上)
sensors_abtesting::Sdk::Init("分流试验请求地址", "试验结果保存地址");
// 设置自定义属性
sensors_abtesting::ABTestPropertiesNode experiment_properties;
experiment_properties.SetBool("自定义属性对应 key", "自定义属性对应 value");
experiment_properties.SetString("自定义属性对应 key", "自定义属性对应 value");
experiment_properties.SetNumber("自定义属性对应 key", "自定义属性对应 value");
experiment_properties.SetDateTime(""自定义属性对应 key", "自定义属性对应 value");
experiment_properties.SetList("自定义属性对应 key", "自定义属性对应 value");
sensors_abtesting::Sdk::FastFetchABTest("具体的试验参数", 0, experiment_properties, [](const sensors_abtesting::json &value) {
int result = value.get<int>();
// TODO 请根据 result 进行自己的试验
});
return 0;
}
设置浮点数自定义属性时,整数部分和小数部分一共不能超过 15 位!
使用示例
void InitSDK() {
// 暂存文件路径,该文件用于进程退出时将内存中未发送的数据暂存在磁盘,下次发送时加载
const string staging_file_path = "./staging_file";
// 服务端数据接收地址
const string server_url = "神策分析数据接收地址";
// 随机生成 UUID 作为 distinct_id
// 注意:这里只是作为 demo 演示,随机生成一个 ID,如果正式使用,可以生成使用其他格式的设备 ID,并且自己保存下来,下次构造 SDK 时使用之前相同的 ID 以标识同一设备。
const string distinct_id = "ccc-cccc-cccc-cccccccc-cccc";
// 神策 ID 分为 “设备 ID” 和 “登录 ID” 两种,随机生成的是 “设备 ID”
const bool is_login_id = false;
// 本地最多暂存(未调用 Flush 发送)的数据条数,超过该数值时,将从队首淘汰旧的数据
const int max_staging_record_size = 200;
// 初始化 SA SDK
sensors_analytics::Sdk::Init(staging_file_path, server_url, distinct_id, is_login_id, max_staging_record_size);
// 初始化 A/B Testing SDK(v0.0.2 及以上)
sensors_abtesting::Sdk::Init("分流试验请求地址", "试验结果保存地址");
// 初始化 A/B Testing SDK(v0.0.1)
sensors_abtesting::Sdk::Init("分流试验请求地址");
// A/B Testing SDK 通过 FastFetchABTest 获取试验变量
sensors_abtesting::Sdk::FastFetchABTest("具体的试验参数", 0, [](const sensors_abtesting::json &value) {
int result = value.get<int>();
// TODO 请根据 result 进行自己的试验
});
// 设置自定义属性(v0.0.2 及以上)
sensors_abtesting::ABTestPropertiesNode experiment_properties;
experiment_properties.SetBool("自定义属性对应 key", "自定义属性对应 value");
experiment_properties.SetString("自定义属性对应 key", "自定义属性对应 value");
experiment_properties.SetNumber("自定义属性对应 key", "自定义属性对应 value");
experiment_properties.SetDateTime(""自定义属性对应 key", "自定义属性对应 value");
experiment_properties.SetList("自定义属性对应 key", "自定义属性对应 value");
// A/B Testing SDK 通过带自定义属性的 FastFetchABTest 获取试验变量(v0.0.2 及以上)
sensors_abtesting::Sdk::FastFetchABTest("具体的试验参数", 0, experiment_properties, [](const sensors_abtesting::json &value) {
int result = value.get<int>();
// TODO 请根据 result 进行自己的试验
});
}
调试试验
可以通过录入白名单的方式,把 C++ 用户加入白名单;加入白名单后,会强制命中当前试验指定的分组(白名单只在试验调试状态有效)。
集成神策分析 C++ SDK 后,在控制台中查看任意一条数据,可以获取当前用户的 distinct_id。
将此 distinct_id 对应的值复制录入试验白名单