You need to enable JavaScript to run this app.
导航
编程实验-客户端本地分流
最近更新时间:2024.06.12 11:33:34首次发布时间:2024.01.25 11:40:52

客户端本地分流实验也属于客户端实验的一种,当前仅编程实验支持,主要适用于例如应用的新用户开屏实验场景,通常来不及生成设备id(did)且通常处于非登录状态,此时可在编程实验中,选择实验类型为“客户端-本地分流”来建一个空实验,通过在客户端内部实现分流并调用客户端SDK,实现曝光事件上报和后续的实验报告计算。本文为您介绍客户端本地分流实验的使用操作。

前提条件:数据接入

开始创建实验前,需先根据实验设计,先完成实验所需数据埋点接入,您根据实验类型通过客户端SDK进行数据接入,本地分流实验的接入操作与通用客户端SDK的接入操作类似,在引入初始化时有少量变动,本地分流实验的区别点详见下文,其他SDK接入的详细操作详情可参见:数据接入概述

Android

依赖接入

  • AppLog接入

    注意

    • 由于本地分流实验需要依赖 AppLog 主 SDK,可以参考Android SDK集成
    • 本地分流插件需要配合 6.16.1 及以上 AppLog 版本,请确保 AppLog 版本填写正确。
    依赖仓库补全:
    // 火山组件需要
    maven{
        url 'https://artifact.bytedance.com/repository/Volcengine/'
    }
    
    AppLog 依赖
    // 添加 6.16.1 及以后版本依赖
    implementation 'com.bytedance.applog:RangersAppLog-Lite-cn:6.16.7'
    
  • 本地分流SDK接入:

    // 添加依赖
    implementation 'com.bytedance.applog:RangersAppLog-Local-AbTest:1.0.1'
    

SDK初始化

  • AppLog初始化

    注意

    由于本地分流依赖 AppLog,请先初始化 AppLog。

    AppLog 初始化
    InitConfig config = new InitConfig(appId, "test");
    // AB 开关一定要打开
    config.setAbEnable(true);
    // SDK 日志,会控制 AppLog + 本地分流 SDK 内部日志打印
    config.setLogEnable(true);
    // 添加数据回调,里面有 vid 变化 + 服务端 ab 配置
    AppLog.addDataObserver(this);
    // 初始化
    AppLog.init(this, config);
    
  • AB本地分流插件初始化

    // 创建 AbClientExperiment 实例
    AbClientExperiment abClientExperiment = AbClientExperiment.newInstance();
    // 绑定 AppLogInstance 实例
    // 此处绑定的是全局默认实例,如果使用多实例请绑定正确实例
    // bindAppLog 前请确保 AppLog 已正常初始化
    abClientExperiment.bindAppLog(this, AppLog.getInstance());
    
    // AppLog 多实例绑定演示
    IAppLogInstance appLogInstance = AppLog.newInstance();
    appLogInstance.init(this, new InitConfig("appId", "channel"));
    abClientExperiment.bindAppLog(this, appLogInstance);
    
    // 如果找不到对应 AbClientExperiment 也支持通过 AppLog 实例查找
    AbClientExperiment abClientExperiment = AbClientExperiment.findAbClientExperiment(appLogInstance);
    

IOS

依赖接入

CocoaPod 引入 ClientABTest

说明

文件方式集成需要引入对应的库文件。

pod 'RangersAppLog', 'SDK-VERSION', 
    :subspecs => [
        'ClientABTest',
    ]

头文件引用

//相关的功能设置引入头文件
//modular方式集成 @import RangersAppLog;
#import <RangersAppLog/BDAutoTrackClientABTest.h>

创建本地分流实验

在实验列表页点击“+创建实验”,选择编程实验,进入实验创建流程,参考以下步骤配置实验的详细信息。

step1 输入基本信息

实验基本信息相关参数主要用于标识实验、明确实验类型等,配置详情如下。
图片

参数

配置说明

实验类型

选择客户端-本地分流实验。

实验时长

注意

由于本地分流实验生效由客户端技术人员自行控制,这里的实验时长仅做记录使用,并不生效。

指实验开启的时长,一般为了避免不同时间段(工作日与周末)的用户行为差异,建议至少观察 2 个完整的实验周期。
例如,考虑工作日与周末影响时,实验周期至少需要一周,那实验开启时长建议为14天。

step2 设置生效策略

本地分流实验无需流量设置,客户端自主控制生效策略,您直接单击下一步即可。

step3 配置实验版本

注意

本地分流实验配置保留实验版本的配置,仅用于实验创建完成后获取实验版本VID信息,由于配置参数生效仅依赖于客户端技术人员控制,这里的配置信息仅做信息参考。

step4 实验指标

配置详情与普通编程实验一致,详情请参见编程实验

获取实验VID

实验创建完成后,在实验详情页面获取各实验版本的VID信息。
图片

在本地客户端创建实验-Android

创建实验

说明

目前支持手动代码创建本地实验,需要指定实验 key、layer、实验分组信息等等。
目前支持通过 SettingKey 来创建默认值不为 null 的实验,支持 ExperimentKey 来创建默认值的 null 的实验。

// 设置默认值不为 null 的实验
ExperimentKey<Integer> ALIVE_IS_MONITOR_ENABLE = new SettingKey<>("alive_is_monitor_enable", 5555)
        // 设置实验层
        .layer("default_layer")
        // 实验分组,指定流量 20%,vid 为 111,实验结果为 1
        .clientGroup(0.2, "111", 1)
         // 实验分组,指定流量 20%,vid 为 1111,实验结果为 11
        .clientGroup(0.2, "1111", 11);
        
// 设置默认值为 null 的实验
ExperimentKey<String> OTHER = new ExperimentKey<String>("other", String.class, null)
        // 设置实验层
        .layer("other_layer")
        // 实验分组,指定流量 20%,vid 为 111,实验结果为 1
        .clientGroup(0.2, "111", "yes")
        // 实验分组,指定流量 20%,vid 为 1111,实验结果为 11
        .clientGroup(0.2, "1111", "no");        

获取实验结果

说明

如果存在实验 key 冲突,即比如服务端和本地都有相同实验 key,那么实验获取存在优先级,遵循以下流程:
服务端分流实验值->客户端分流值->默认值。

// 通过实验.getValue(abClientExperiment) 的方式获取实验结果
// 需要传入 abClientExperiment 对应实例
Integer value = ALIVE_IS_MONITOR_ENABLE.getValue(abClientExperiment);

清除本层实验结果

说明

本地任何实验配置修改或者重新触发本地实验分流结果,请调用该 API。

String layer = "default_layer";
// 调用 abClientExperiment 的 clearLayerAssign 进行本层实验重置
abClientExperiment.clearLayerAssign(layer);

自定义本地实验随机策略

说明

客户端分流默认按随机数进行本地实验随机,该方式会导致卸载重装之后,用户分组不稳定,可以自定义按照GAID、DID等进行随机。

// 内置两种策略 IRandomStrategy:
RandomIntStrategy:使用 Random().nextInt(1000) 生成
RandomHashStrategy:使用 AndroidId Hash 值结合试验 key 生成

// 默认随机策略 
abClientExperiment.updateRandomStrategy(RandomIntStrategy.INSTANCE);

// key 结合 Android Id 的随机方式
abClientExperiment.updateRandomStrategy(RandomHashStrategy.INSTANCE);

// 自定义随机策略
abClientExperiment.updateRandomStrategy(new IRandomStrategy() {
    @Override
    public void initStrategy(@NonNull Context context) {
        
    }

    @Override
    public int getNextRandom(@NonNull String s) {
        return 0;
    }
});

清除本地实验Vid

说明

无论是服务端实验,还是本地实验,都在事件曝光后记录曝光 vid,也就是对应 AppLog 中的 ab_sdk_version,但由于本地实验是客户端自行添加的,可能在实验代码删除结束后,vid 依然缓存在 ab_sdk_version 内从而失效导致 vid 累加,所以提供了手动清除 vid 的接口。

目前支持两种 vid 传入方式
// 直接传入 List
List<String> vidList = new ArrayList<>();
vidList.add("vid1");
vidList.add("vid2");
vidList.add("vid3");
abClientExperiment.clearClientVid(vidList);

// 通过 , 分割传入字符串
abClientExperiment.clearClientVid("vid1,vid2,vid3");

设置调试回调

说明

我们通过回调,知道本次来自本地分流实验插件触发的曝光以下信息:

  • 实验 key
  • 实验结果
  • 实验结果来自哪里
  • 实验结果对应 vid
  • 实验组
// 设置调试回调
abClientExperiment.setDebugInfoCallback((key, value, from, vid, clientVidList) -> Log.d(
        "[AbClientExperiment]",
        "debugCallback " + key + ",vid:" + vid + ",value:" + value + ",from:" + from + ",clientVidList:" + clientVidList
));

// 日志结果输出如下:
debugCallback alive_is_monitor_enable,vid:111,value:1,from:client,clientVidList:[Pair{111 0.2}, Pair{1111 0.2}]

在本地客户端创建实验-IOS

配置本地实验

  • layerName:指定实验层,实验层下的实验是互斥的,分流后,最多只有一个实验组命中
  • key:实验的标识,获取实验值时,将通过该标识查找命中的实验组
  • rate:实验组占当前实验层的流量比例,取值范围 0~1,0 代表 0%,1 代表 100%,精度 0.01%
  • vid:ABTest 的本地实验页面上生成的 vid,唯一标记每个实验组,用于统计实验曝光
  • value:实验组所属实验的实验值,获取实验值时,如果当前实验组命中,则返回该值
BDAutoTrackExperiment *experiment1 = [[BDAutoTrackExperiment alloc] initWithKey:@"pageType" groups:@[
    [[BDAutoTrackExperimentGroup alloc] initWithRate:0.4 vid:@"1002" value:@(1)],
    [[BDAutoTrackExperimentGroup alloc] initWithRate:0.4 vid:@"1003" value:@(2)],
]];
[BDAutoTrack.sharedTrack addABClientExperiment:experiment1 layerName:@"layer1"];

获取实验结果

说明

获取实验结果时,优先从服务端实验中获取,如果没有才从本地实验中获取,遵循以下规则:
服务端分流实验值->客户端分流值->默认值

NSNumber *value = [BDAutoTrack.sharedTrack ABTestConfigValueForKey:@"pageType" defaultValue:@(3)];

移除本地实验已曝光的Vids

本地实验已曝光的 vid 会缓存在本地,在实验结束后,缓存的 vid 依然会上报,可以通过该接口移除.

[BDAutoTrack.sharedTrack clearABClientExposedVids];

完整示例

本地实验的完整示例如下:

BDAutoTrackExperiment *experiment1 = [[BDAutoTrackExperiment alloc] initWithKey:@"pageType" groups:@[
    [[BDAutoTrackExperimentGroup alloc] initWithRate:0.4 vid:@"1002" value:@(1)],
    [[BDAutoTrackExperimentGroup alloc] initWithRate:0.4 vid:@"1003" value:@(2)],
]];
[BDAutoTrack.sharedTrack addABClientExperiment:experiment1 layerName:@"layer1"];

NSNumber *value = [BDAutoTrack.sharedTrack ABTestConfigValueForKey:@"pageType" defaultValue:@(3)];
NSString *vids = [BDAutoTrack.sharedTrack abExposedVids];
NSLog(@"pageType >>> value: %@, vids: %@", value, vids);

调试实验

实验创建完成后,您可以在A/B测试>实验列表中查看已创建的实验。
图片
调试中:新创建完成的实验,实验状态为调试中,本地分流实验无需手动开启,创建完成状态为调试中即可。

查看实验报告

实验生效后,您也可以在实验列表中,通过实验操作入口点击进入实验报告页面,查看实验报告,详情请参见实验报告概述

说明

本地分流实验,调试中也可以查看实验报告,根据客户端技术同学需要考虑通过控制数据上报控制实验报告中数据计算的时间。