FeatureFlags

2025-12-11 0 521

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 \" )
}

通过命名EnabledDisabled测试变体, 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并且该应用程序正在开发时(即#DEBUGFeatureFlags .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上传器 调色板

下载源码

通过命令行克隆项目:

git clone https://github.com/rwbutler/FeatureFlags.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 FeatureFlags https://www.zuozi.net/34078.html

WaveIn
上一篇: WaveIn
PseudoGray
下一篇: PseudoGray
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务