客户端本地分流实验也属于客户端实验的一种,当前仅编程实验支持,主要适用于例如应用的新用户开屏实验场景,通常来不及生成设备id(did)且通常处于非登录状态,此时可在编程实验中,选择实验类型为“客户端-本地分流”来建一个空实验,通过在客户端内部实现分流并调用客户端SDK,实现曝光事件上报和后续的实验报告计算。本文为您介绍客户端本地分流实验的使用操作。
开始创建实验前,需先根据实验设计,先完成实验所需数据埋点接入,您根据实验类型通过客户端SDK进行数据接入,本地分流实验的接入操作与通用客户端SDK的接入操作类似,在引入初始化时有少量变动,本地分流实验的区别点详见下文,其他SDK接入的详细操作详情可参见:数据接入概述。
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'
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);
CocoaPod 引入 ClientABTest
。
说明
文件方式集成需要引入对应的库文件。
pod 'RangersAppLog', 'SDK-VERSION', :subspecs => [ 'ClientABTest', ]
头文件引用
//相关的功能设置引入头文件 //modular方式集成 @import RangersAppLog; #import <RangersAppLog/BDAutoTrackClientABTest.h>
在实验列表页点击“+创建实验”,选择编程实验,进入实验创建流程,参考以下步骤配置实验的详细信息。
实验基本信息相关参数主要用于标识实验、明确实验类型等,配置详情如下。
参数 | 配置说明 |
---|---|
实验类型 | 选择客户端-本地分流实验。 |
实验时长 | 注意 由于本地分流实验生效由客户端技术人员自行控制,这里的实验时长仅做记录使用,并不生效。 指实验开启的时长,一般为了避免不同时间段(工作日与周末)的用户行为差异,建议至少观察 2 个完整的实验周期。 |
本地分流实验无需流量设置,客户端自主控制生效策略,您直接单击下一步即可。
注意
本地分流实验配置保留实验版本的配置,仅用于实验创建完成后获取实验版本VID信息,由于配置参数生效仅依赖于客户端技术人员控制,这里的配置信息仅做信息参考。
配置详情与普通编程实验一致,详情请参见编程实验。
实验创建完成后,在实验详情页面获取各实验版本的VID信息。
说明
目前支持手动代码创建本地实验,需要指定实验 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");
说明
我们通过回调,知道本次来自本地分流实验插件触发的曝光以下信息:
// 设置调试回调 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}]
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)];
本地实验已曝光的 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测试>实验列表中查看已创建的实验。
调试中:新创建完成的实验,实验状态为调试中,本地分流实验无需手动开启,创建完成状态为调试中即可。
实验生效后,您也可以在实验列表中,通过实验操作入口点击进入实验报告页面,查看实验报告,详情请参见实验报告概述。
说明
本地分流实验,调试中也可以查看实验报告,根据客户端技术同学需要考虑通过控制数据上报控制实验报告中数据计算的时间。