iOS 和 OS X 的实验/修改系统
可用于
此 README 详细介绍了 Variants 的 Cocoa 实现。有关一般背景信息,请参阅 一般 README。
标志和变体定义可以定义在一个 JSON 文件中,可以被一个 ABRegistry
对象加载,该对象负责每个条件的健壮性和评估。
示例
{
"flag_defs": [
{
"flag": "ab_test",
"base_value": false
}
],
"variants": [
{
"id": "FeatureABTest",
"conditions": [
{
"type": "RANDOM",
"value": 0.5
}
],
"mods": [
{
"flag": "ab_test",
"value": true
}
]
}
]
}
在上面的示例中,定义了一个名为 "ab_test" 的标志,并且标志如何评估的相关行为由下面的变体定义定义。如果变体定义的条件得到满足,则相关的修改将被实现(标志 "ab_test" 将评估为真实)。该变体使用内置的 RANDOM 条件类型,它通过检查 0.0 到 1.0 之间的随机数是否小于或等于给定值(本例中的 0.5)来评估其结果。因此,在实际上,调用 [registry flagValueWithName:@"ab_test"]
将在 50% 的时间内返回一个具有 boolValue
为 YES
的 NSNumber
。
但是,如果您不想使用内置的条件类型...
另一个示例
{
"flag_defs": [
{
"flag": "enable_new_hotness_feature",
"base_value": false
}
],
"variants": [
{
"id": "EnableNewHotnessFeature",
"conditions": [
{
"type": "CUSTOM",
"values": [
"andybons",
"pupius",
"guitardave24"
]
}
],
"mods": [
{
"flag": "enable_new_hotness_feature",
"value": true
}
]
}
]
}
现在,没有名为 CUSTOM 的内置条件类型,因此当上述配置加载时,传递的 NSError
将被填充。我们需要在上述配置加载之前定义应该如何评估 CUSTOM 条件。
[self.registry registerConditionTypeWithID:@"CUSTOM"
specBlock:^ABConditionEvaluator(id<NSCopying> value) {
return ^BOOL(id<NSCopying> context) {
return [((NSDictionary *)context)[@"password"] isEqualToString:(NSString *)value];
};
} error:&error];
上面的代码通过检查传递的上下文对象的 "username" 键值是否存在于构造变体时传递的值中,来评估 CUSTOM 条件。以下是获取标志值的几个示例
NSNumber hasAccess = [[ABRegistry defaultRegistry] flagValueWithName:@"enable_new_hotness_feature"
context:@{@"username": @"andybons"}];
// hasAccess.boolValue == YES
NSNumber hasAccess = [[ABRegistry defaultRegistry] flagValueWithName:@"enable_new_hotness_feature"
context:@{@"username": @"tessr"}];
// hasAccess.boolValue == NO
查看单元测试以获取工作示例。
#import <Variants/Variants.h>
Variants最初由David Byttow为Medium创建。