变种 1.0.4

变种 1.0.4

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

Andrew Bonventre维护。



变种 1.0.4

  • 作者:
  • Andrew Bonventre

iOS 和 OS X 的实验/修改系统

可用于

  • A/B 测试
  • 实验功能
  • 可信测试者组
  • 逐步功能推广

此 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% 的时间内返回一个具有 boolValueYESNSNumber

但是,如果您不想使用内置的条件类型...

另一个示例

{
  "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

查看单元测试以获取工作示例。

使用 Variants

导入

#import <Variants/Variants.h>

作者

Andrew Bonventre

Variants最初由David ByttowMedium创建。