FeatureFlags使通过JSON文件可以轻松地配置功能标志,A/B和MVT测试,该文件可能与您的应用程序捆绑或远程托管。对于远程托管配置文件,您可以在不发布App Store的情况下启用/禁用功能,在A/B测试组中更新用户的百分比,甚至在A/B测试下以前在A/B测试中推出功能,一旦您决定该功能准备好使用黄金时间。
要了解有关如何使用FeatureFlags更多信息,请查看主题演示文稿,查看博客文章或使用以下内容:
- 特征
- 安装
- 可可录
- 迦太基
- Swift软件包管理器
- 用法
- 功能标志
- A/B测试
- 功能A/B测试
- 多元(MVT)测试
- 开发旗
- 解锁标志
- 高级用法
- 测试偏见
- 标签
- 推出功能
- 质量检查
- 刷新配置
- Objective-C
- 作者
- 执照
- 附加软件
- 框架
- 工具
特征
- 功能标志
- A/B测试和MVT测试
- 功能A/B测试(其中启用了功能,而没有功能的对照组)
- 主持您的功能标志JSON配置远程允许您启用 /禁用功能而无需发布新版本的应用程序
- 使用现有的JSON文件或托管全新的配置
- 远程调整每个测试组中用户的百分比
- 一旦确定功能测试是否成功,将A/B测试转换为功能标志,即向100%用户推出功能
- 在您的应用程序的调试构建中使用FeatureFlags ViewController可视化标志的状态和测试
FeatureFlags 3.0.0中的新功能是什么?
请参阅ChangElog.md。
安装
可可录
CocoApods是一个依赖项管理器,将依赖项集成到您的Xcode工作区中。使用RubyGems运行安装它:
gem install cocoapods
要使用Cocoapods安装FeatureFlags ,只需将以下行添加到您的podfile:
pod \" FeatureFlags \"
然后运行命令:
pod install
有关更多信息,请参见此处。
迦太基
迦太基是一个依赖性经理,可生产二进制的手动集成到您的项目中。它可以使用命令通过Homebrew安装:
brew update brew install carthage
为了通过迦太基将FeatureFlags集成到您的项目中,请在您的项目的Cartfile中添加以下行:
github \"rwbutler/ FeatureFlags \"
从MacOS终端运行carthage update --platform iOS构建框架,然后将FeatureFlags .framework拖动到您的Xcode Project中。
有关更多信息,请参见此处。
Swift软件包管理器
Swift Package Manager是Swift模块的依赖性管理器,并且从SWIFT 3.0开始作为构建系统的一部分。它用于自动化依赖项的下载,汇编和链接。
要将FeatureFlags作为Swift软件包中的依赖关系,请将包装添加到Package.swift中的dependencies项条目中。Swift文件如下:
dependencies: [ . package ( url : \" https://g*it**hub.com/rwbutler/FeatureFlags.git \" , from : \" 2.0.0 \" ) ]
用法
将框架集成到您的项目中,下一步是使用JSON文件进行配置,该文件可以作为应用程序的一部分捆绑或远程托管。 JSON文件可能是新创建的,也可以是您已经使用的现有配置JSON文件。只需在文件映射的顶部添加一个称为features的键,如下所示:
{
\"features\" : []
}
数组的内容取决于要配置的要素标志和测试。
让FeatureFlags知道在哪里可以找到您的配置文件:
guard let featuresURL = Bundle . main . url ( forResource : \" features \" , withExtension : \" json \" ) else { return }
FeatureFlags . configurationURL = featuresURL
或者:
guard let featuresURL = URL ( string : \" https://www.e*xampledom**ain.com/features.json \" ) else { return }
FeatureFlags . configurationURL = featuresURL
如果您选择远程托管JSON文件,则可以提供捆绑的后备作为应用程序捆绑包的一部分:
guard let fallbackURL = Bundle . main . url ( forResource : \" features \" , withExtension : \" json \" ) else { return }
FeatureFlags . localFallbackConfigurationURL = fallbackURL
您的远程托管JSON文件将始终优先于捆绑的设置,并且远程定义的设置将被缓存,以便在最终的用户离线时,将应用网络检索到的最后一个设置。
功能标志
为了配置功能标志,将功能对象添加到JSON配置中的功能数组中。
{
\"features\" : [{
\"name\" : \" Example Feature Flag \" ,
\"enabled\" : false
}]
}
然后添加Feature.Name上的扩展名。名称以如下:在代码中导入您的功能标志:
FeatureFlags
extension Feature.Name {
static let exampleFeatureFlag = Feature.Name(rawValue: \”Example Feature Flag\”)
}\”>
import FeatureFlags extension Feature . Name { static let exampleFeatureFlag = Feature . Name ( rawValue : \" Example Feature Flag \" ) }
确保原始值与JSON文件中的字符串匹配。然后致电以下来检查是否启用了功能标志:
Feature . isEnabled ( . exampleFeatureFlag ) )
如果您的Feature.Name中指定的字符串。NAME扩展名与JSON文件中的值不匹配,则返回的默认值为false 。如果您需要检查该功能,则可以写下:
if let feature = Feature . named ( . exampleFeatureFlag ) { print ( \" Feature name -> \\( feature . name ) \" ) print ( \" Feature enabled -> \\( feature . isEnabled ( ) ) \" ) }
A/B测试
要配置A/B测试,请在JSON文件中的功能数组中添加以下功能对象:
{
\"name\" : \" Example A/B Test \" ,
\"enabled\" : true ,
\"test-variations\" : [ \" Group A \" , \" Group B \" ]
}
-
enabled指示是否启用了A/B测试。
功能标志和A/B测试之间的唯一区别涉及添加一系列测试变化。 FeatureFlags将假设您正在配置A/B测试,如果您在数组中添加了两个测试变化 – 添加更多,并且该测试将自动成为多元测试(MVT)。
将您的功能导入代码,并具有Feature.Name上的扩展名。名称:
extension Feature . Name { static let exampleABTest = Feature . Name ( rawValue : \" Example A/B Test \" ) }
然后使用以下来检查用户已分配给哪个组:
if let test = ABTest ( rawValue : . exampleABTest ) { print ( \" Is in group A? -> \\( test . isGroupA ( ) ) \" ) print ( \" Is in group B? -> \\( test . isGroupB ( ) ) \" ) }
另外,您可能更喜欢以下语法:
if let feature = Feature . named ( . exampleABTest ) { print ( \" Feature name -> \\( feature . name ) \" ) print ( \" Is group A? -> \\( feature . isTestVariation ( . groupA ) ) \" ) print ( \" Is group B? -> \\( feature . isTestVariation ( . groupB ) ) \" ) print ( \" Test variation -> \\( feature . testVariation ( ) ) \" ) }
功能A/B测试
功能A/B测试是A/B测试的(和亚型)的微妙变化。在通用A/B测试中,您可能需要检查用户是否已放置在蓝色背景或红色背景测试变化中。功能A/B测试专门测试新功能的引入是否是对没有功能的对照组的改进。因此,在功能A/B测试中 – 该功能要么关闭或打开。
配置功能A/B测试使用以下JSON:
{
\"name\" : \" Example Feature A/B Test \" ,
\"enabled\" : true ,
\"test-variations\" : [ \" Enabled \" , \" Disabled \" ]
}
-
enabled指示是否启用了A/B测试。
extension Feature . Name { static let exampleFeatureABTest = Feature . Name ( rawValue : \" Example Feature A/B Test \" ) }
通过命名Enabled和Disabled测试变体, FeatureFlags知道您的目的是设置功能A/B测试。
配置功能A/B测试比通用A/B测试具有优势,而不必编写:
if let feature = Feature . named ( . exampleFeatureABTest ) { print ( \" Feature name -> \\( feature . name ) \" ) print ( \" Is group A? -> \\( feature . isTestVariation ( . enabled ) ) \" ) print ( \" Is group B? -> \\( feature . isTestVariation ( . disabled ) ) \" ) print ( \" Test variation -> \\( feature . testVariation ( ) ) \" ) }
您可以简单地使用以下来确定用户已分配给的哪个测试组:
Feature . isEnabled ( . exampleFeatureABTest ) )
通常使用Feature.enabled()方法测试来查看是否启用了功能;在此特定实例中,如果用户属于接收新功能的组false并且如果用户属于控制组,则将返回true 。请注意,如果将enabled属性设置为JSON中的false ,则此方法还会返回false 。
多元(MVT)测试
多元测试的配置遵循与A/B测试的模式相同的模式。将以下功能对象添加到JSON文件中的功能数组:
{
\"name\" : \" Example MVT Test \" ,
\"enabled\" : true ,
\"test-variations\" : [ \" Group A \" , \" Group B \" , \" Group C \" ]
}
-
enabled指示是否启用了MVT测试。
FeatureFlags知道,如果您在数组中添加了两个以上的测试变体,则您正在配置MVT测试。同样,将您的功能带入代码中,并具有Feature.Name上的扩展名。名称:
extension Feature . Name { static let exampleMVTTest = Feature . Name ( rawValue : \" Example MVT Test \" ) }
使用以下内容检查该用户已分配给哪个组:
if let feature = Feature . named ( . exampleMVTTest ) { print ( \" Feature name -> \\( feature . name ) \" ) print ( \" Is group A? -> \\( feature . isTestVariation ( . groupA ) ) \" ) print ( \" Is group B? -> \\( feature . isTestVariation ( . groupB ) ) ”) print( \" Is group C ? - > \\( feature . isTestVariation ( . groupC ) ) ” ) print ( \" Test variation -> \\( feature . testVariation ( ) ) ”) }
无论您想要什么,您都可以自由命名您的测试变体:
{
\"name\" : \" Example MVT Test \" ,
\"enabled\" : true ,
\"test-variations\" : [ \" Red \" , \" Green \" , \" Blue \" ]
}
-
enabled指示是否启用了MVT测试。
只需在Test.Variation时创建扩展名。差异映射您的测试变化:
extension Test . Variation { static let red = Test . Variation ( rawValue : \" Red \" ) static let green = Test . Variation ( rawValue : \" Green \" ) static let blue = Test . Variation ( rawValue : \" Blue \" ) }
然后检查该用户已分配给哪个组:
if let feature = Feature . named ( . exampleMVTTest ) { print ( \" Feature name -> \\( feature . name ) \" ) print ( \" Is red? -> \\( feature . isTestVariation ( . red ) ) \" ) print ( \" Is green? -> \\( feature . isTestVariation ( . green ) ) \" ) print ( \" Is blue? -> \\( feature . isTestVariation ( . blue ) ) \" ) print ( \" Test variation -> \\( feature . testVariation ( ) ) \" ) }
开发旗
当开发人员谈论特征标志时,他们经常指出两件事之一:
- 远程标志:允许我们远程打开或关闭完成的功能,然后将其推出到特定的一组用户。
- 开发标志:允许我们隐藏开发中的功能,以使代码保持可发出。
使用开发标志,我们永远不希望正在开发的代码向用户发布。
考虑一下是否要使用远程功能标志来切换未完成的功能,从而使我们可以在不存在的功能的情况下发布我们的应用程序版本1。如果随后我们将作为应用程序版本2的一部分完成该功能并在功能上切换该功能,则版本的用户将经历部分完整的功能,因为启用了开发版本1代码。这种情况我们永远都不想出现,因此FeatureFlags符合开发标志以及远程标志。
要将功能标志标记为开发标志,首先将捆绑的JSON文件作为包含features密钥的应用程序的一部分。 JSON文件可以是现有文件或全新文件。接下来,将您的功能标志定义为该文件的一部分,请设置配置URL以引用此文件:
guard let featuresURL = Bundle . main . url ( forResource : \" features \" , withExtension : \" json \" ) else { return }
FeatureFlags . configurationURL = featuresURL
或者,如果您已经使用了远程配置URL,则应设置后备配置URL:
guard let fallbackURL = Bundle . main . url ( forResource : \" features \" , withExtension : \" json \" ) else { return }
FeatureFlags . localFallbackConfigurationURL = fallbackURL
像正常情况下一样,在JSON中设置您的功能标志,但将development属性设置为true :
{
\"features\" : [{
\"name\" : \" Example Feature Flag \" ,
\"development\" : true ,
\"enabled\" : true
}]
}
就是这样!从现在开始,此功能标志将被视为一个开发标志,即使设置了enabled ,其背后的代码也将永远不会发布给用户。
开发标志代码将在以下情况下显示:
- 如果设置了
#DEBUG预处理标志并enabled标志。 - 如果
FeatureFlags .isDevelopment设置为true(由开发人员将其设置为true时,当应用程序正在开发时 – 默认值为false),并且enabled标志。
如果您需要对正在开发的代码进行更多的颗粒状控制,则在检查是否启用功能时,您可以通过isDevelopment标志:EG:
if let feature = Feature . named ( . exampleFeatureFlag , isDevelopment : true ) { print ( \" Feature name -> \\( feature . name ) \" ) print ( \" Feature enabled -> \\( feature . isEnabled ( ) ) \" ) }
在此示例中,只有在启用了exampleFeatureFlag并且该应用程序正在开发时(即#DEBUG或FeatureFlags .isDevelopment ),才能执行print语句。
解锁标志
不管功能标志是在本地还是远程控制的,上面的标志类型在全球级别运行,即它们将为所有用户启用或禁用功能。但是,如果我们想在应用内购买后为单个用户解锁一项功能,或者是为了完成某些目标的奖励,那么我们需要一种解锁该功能的方法并保持解锁 – 我们使用Unlock Flags实现了这一目标。
要在您的配置中配置解锁标志JSON文件中添加以下内容:
{
\"features\": [{
\"name\": \"Example Unlock Flag\",
\"enabled\": true,
\"unlocked\": false
}]
}
unlocked属性表明FeatureFlags是一个解锁标志,其默认值为false IE IE该功能将锁定为首先。请注意,如果将enabled属性设置为false ,则无论该属性在全球级别运行时是否已为特定用户解锁该功能,该功能将被禁用所有用户。
可以查询是否解锁解锁标志,如下所示:
if let feature = Feature.named(.exampleUnlockFlag) {
print(\"Is unlocked? -> \\(feature.isUnlocked())\")
}
当您希望为用户解锁功能时,请致电feature.unlock() 。相反,如果您只想在一定时间段内解锁功能,例如允许用户试用功能,则可以稍后调用feature.lock()使该功能再次不可用。两种方法都返回Bool以指示该功能是否已解锁 /锁定。
if let feature = Feature.named(.exampleUnlockFlag) {
print(\"Is unlocked? -> \\(feature.unlock())\")
}
请注意,如果:
- 功能标志不是解锁标志,即
unlocked属性在JSON中未定义。 -
enabled属性设置为false。
高级用法
测试偏见
默认情况下,对于任何A/B或MVT测试,用户同样可能被分配给A/B测试的每个指定的测试变体,即有50%/50%的机会被分配了一个或另一组。对于具有四个变化的MVT测试,分配给每个变体的机会为25%。
可以配置测试偏置,从而使每个测试变化分配的可能性不相等。为此,只需将以下JSON添加到您的功能对象:
{
\"features\" : [{
\"name\" : \" Example A/B Test \" ,
\"enabled\" : true ,
\"test-biases\" : [ 80 , 20 ],
\"test-variations\" : [ \" Group A \" , \" Group B \" ]
}]
}
test-biases数组中指定的权重数必须等于测试变化的数量,并且必须为100,否则权重将被忽略并默认为相等的权重。
标签
如果您希望将分析(分析)分别发送给已分配的测试组,则可以将标签附加到测试变化。
为此,定义了与指定的测试变化数量相等长度的labels数组:
{
\"features\" : [{
\"name\" : \" Example A/B Test \" ,
\"enabled\" : true ,
\"test-biases\" : [ 50 , 50 ],
\"test-variations\" : [ \" Group A \" , \" Group B \" ],
\"labels\" : [ \" label1-for-analytics \" , \" label2-for-analytics \" ]
}]
}
然后,要在代码中检索标签,您将编写以下内容:
if let feature = Feature . named ( . exampleABTest ) { print ( \" Group A label -> \\( feature . label ( . groupA ) ) \" ) print ( \" Group B label -> \\( feature . label ( . groupB ) ) \" ) }
推出功能
FeatureFlags框架的最强大功能是能够调整远程JSON配置文件中的测试偏差,并自动将用户重新分配到新的测试组。例如,您可能决定在第一周使用10%/90%(10%的用户收到新功能)推出一项功能,第二周在20%/80%的情况下进行分配。
只需更新test-biases阵列中的权重,下一次框架检查您的JSON配置时,将重新分配组。
当您完成A/B或MVT测试一项功能时,您将收集足够的分析,以决定是否将功能推出到整个用户群中。此时,您可以决定通过将enabled标志设置为JSON文件中的false或在成功测试的情况下完全禁用该功能,您可以决定通过以下方式通过以下方式调整JSON文件中的功能对象,从:
{
\"features\" : [{
\"name\" : \" Example A/B Test \" ,
\"enabled\" : true ,
\"test-biases\" : [ 50 , 50 ],
\"test-variations\" : [ \" Group A \" , \" Group B \" ],
\"labels\" : [ \" label1-for-analytics \" , \" label2-for-analytics \" ]
}]
}
为所有用户全局启用功能标志,如下所示:
{
\"features\" : [{
\"name\" : \" Example A/B Test \" ,
\"enabled\" : true
}]
}
质量检查
为了测试您的新功能工作的两种变化,您可能需要在运行时调整功能标志 /测试的状态。到此为止, FeatureFlags提供了FeatureFlags ViewController ,它允许您在应用程序或周期A/B测试或MVT测试变化的调试构建中打开/关闭功能标志。
要显示视图控制器,请指定所需的导航偏好,然后通过提供UINavigationController controller来推动视图控制器:
FeatureFlagsViewControllerNavigationSettings(autoClose: true, closeButtonAlignment: .right, closeButton: .save, isNavigationBarHidden: false)
FeatureFlags .push FeatureFlags (delegate: self, navigationController: navigationController, navigationSettings: navigationSettings)\”>
let navigationSettings = FeatureFlags ViewControllerNavigationSettings ( autoClose : true , closeButtonAlignment : . right , closeButton : . save , isNavigationBarHidden : false ) FeatureFlags . push FeatureFlags ( delegate : self , navigationController : navigationController , navigationSettings : navigationSettings )
如果您需要有关每个功能标志 /测试状态的更多信息,则可以使用3D触摸来查看 / pop更多信息。
刷新配置
如果您需要在任何时候刷新配置,则可以调用FeatureFlags .refresh() ,它可以选择接受完成闭合以在刷新完成后通知您。
如果您选择将您的功能标志信息作为现有JSON文件的一部分,您的应用程序已经获取了该文件,则可能希望使用以下方法传递JSON文件数据以避免重复网络调用:
FeatureFlags . refreshWithData ( _ : completion : )
Objective-C
虽然FeatureFlags主要用于Swift Apps使用,但如果需要检查是否在Objective-C中启用了功能标志,则可以这样做:
static NSString * const kMyNewFeatureFlag = @\" My New Feature Flag \" ; if (FEATURE_IS_ENABLED( kMyNewFeatureFlag )) { ... }
作者
罗斯·巴特勒
执照
FeatureFlags可根据MIT许可证提供。有关更多信息,请参见许可证文件。
附加软件
控件
- AnimatedGradientView- iOS简单的功能渐变动画。
| AnimatedGradientView |
|---|
框架
- 作弊 – 现代iOS应用程序的复古作弊代码。
- 连接性 – 提高确定iOS应用程序中Internet连接性的可及性。
- FeatureFlags允许开发人员使用捆绑 /远程托管的JSON配置文件来配置功能标志,运行多个A / B或MVT测试。
- FlexiblerowHeightGridlayout- uicollectionView网格布局旨在通过允许每行的高度尺寸以适合内容来支持动态类型。
- 哈希 – 使用流行的哈希功能(包括MD5,SHA-1,SHA-256)生成消息摘要和HMAC的轻巧方法。
- Skylark-完全快速的BDD测试框架,用于使用小黄瓜语法编写黄瓜方案。
- TailorSwift-有用的Swift Core库 /基础框架扩展的集合。
- AdgemathingKit-具有动态类型支持的iOS上一致且可访问的视觉样式。
- 更新 – 自动检测应用程序更新,并轻轻提示用户更新。
| 作弊 | 连接性 | FeatureFlags | 云雀 | 排版kit | 更新 |
|---|---|---|---|---|---|
工具
- 清除派生的data-实用程序即可快速通过从终端键入
cdd来快速清除您的派生目录。 - 配置验证器 – 配置验证器验证并上传您的配置文件,缓存将您的CDN清除为CI过程的一部分。
- IPA Uploader-将应用程序上传到TestFlight&App Store。
- 调色板 – 使您的ExtraphingKit调色板在Xcode Interface Builder中可用。
| 配置验证器 | IPA上传器 | 调色板 |
|---|---|---|
