C++ A/B Testing SDK 依赖于神策分析 SDK,在使用前请确保已经成功集成神策分析 SDK,并进行了 SDK 初始化,详情可参考 SDK 集成 (C++)

版本依赖关系如下:

C++ A/B Testing SDK 版本依赖的 C++ SDK 最低版本
v0.0.2 及以上v1.0.3
v0.0.1v1.0.0

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
CODE

初始化 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);
CODE

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;
} 
CODE

携带自定义属性获取试验变量

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;
} 
CODE

设置浮点数自定义属性时,整数部分和小数部分一共不能超过 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 进行自己的试验
    });   
}   
CODE

 调试试验

可以通过录入白名单的方式,把 C++ 用户加入白名单;加入白名单后,会强制命中当前试验指定的分组(白名单只在试验调试状态有效)。

集成神策分析 C++ SDK 后,在控制台中查看任意一条数据,可以获取当前用户的 distinct_id。


将此 distinct_id 对应的值复制录入试验白名单