测试已测试 | ✓ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布最新发布 | 2017年2月 |
由 Michael England 和 Rob Siwek 维护。
Objective C 的功能切换/切换/翻转库。
一个用于生成 Features.plist
& FTSFlipTheSwitch+Features.{h,m}
类别的 gem 命令行工具,以便于处理相应的 Pod。
我们有一个正在开发的新功能 AmazingFeature
,我们在分支内部构建了它。现在是我们最终合并的时间。然后我们花了整整一天的时间,因为 MyApp.xcodeproj/project.pbxproj
文件有很多冲突的改变,在我们错误地得到正确的结果之前,我们犯了许多错误。由于多个人在此分支上工作,所以我们无法经常 rebase,因此我们还需要定期合并来自团队其他部分的全部更改,不断失去我们的目标。我们终于全部合并了,然后……所有的东西都崩溃了!
为了避免所有这些不断的合并/重新建立/上下文切换,我们始终把我们的代码放在 master
分支,但我们不想在下一发布周期中影响其他团队发布 QuickerFeature
时影响整个团队。
我们如何在构建 AmazingFeature
时不担心破坏其他功能的同时,还能获得在 master
分支工作的好处呢?
使用 'FTSFlipTheSwitch',我们可以在运行时选择不同的代码路径
self.newFeatureButton.hidden = [[FTSFlipTheSwitch sharedInstance] isFeatureEnabled:@"new_feature"];
功能可以在运行时启用/禁用
[[FTSFlipTheSwitch sharedInstance] enableFeature:@"new_feature"];
[[FTSFlipTheSwitch sharedInstance] disableFeature:@"new_feature"];
[[FTSFlipTheSwitch sharedInstance] setFeature:@"new_feature" enabled:YES];
所有启用的功能都通过 NSUserDefaults
在应用程序加载之间持续存在。
功能可以通过 plist 文件 Features.plist
默认启用/禁用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>disabled_feature</key>
<dict>
<key>description</key>
<string>is disabled description</string>
<key>enabled</key>
<false/>
</dict>
<key>enabled_feature</key>
<dict>
<key>enabled</key>
<true/>
</dict>
</dict>
</plist>
可以将子功能递归地添加到功能中。结果可能是一个 plist 文件,例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>description</key>
<string>is disabled description</string>
<key>enabled</key>
<false/>
<key>subfeature</key>
<dict>
<key>enabled</key>
<true/>
</dict>
</dict>
</plist>
当功能状态改变时,您可以监听名为 FTSFeatureStatusChangedNotification
的通知,它包含
FTSFeatureStatusChangedNotificationFeatureKey
- 正在被启用或禁用的功能的键FTSFeatureStatusChangedNotificationEnabledKey
- 功能启用或禁用的 NSNumber
如果您安装了 gem,您将能够使用命令行界面。
CLI 包含 3 个命令
plist
- 创建一个 Features.plist
文件,其中包括启用/禁用功能和它们的描述(可选),如下所述。settings
- 创建一个由 OS 设置使用的 Settings.bundle
。这些可以在运行时启用/禁用功能。category
- 创建为功能创建 FTSFlipTheSwitch+Features.{h,m}
文件,从而在添加/删除新功能时进行编译时检查。例如/* AUTO-GENERATED. DO NOT ALTER */
#import <FlipTheSwitch/FTSFlipTheSwitch.h>
@interface FTSFlipTheSwitch (Features)
+ (BOOL)isAwesomeFeatureEnabled;
+ (void)enableAwesomeFeature;
+ (void)disableAwesomeFeature;
+ (void)setAwesomeFeatureEnabled:(BOOL)enabled;
+ (void)resetAwesomeFeatureController;
+ (NSString *)awesomeFeatureControllerKey;
@end
功能和子功能及其默认启用/禁用状态从 features.json
文件中读取。例如:
{
"default": {
"awesome_feature": {
"enabled": true,
"description": "Makes this project awesome",
"sub_feature": {
"enabled": true,
"description": "Makes this project even more awesome"
}
}
},
"beta": {
"inherits_from": "default",
"awesome_feature": {
"enabled": false
}
}
}
为了避免每次都输入相同的选择,您可以为默认选项创建一个 .flip.yml
文件,例如:
input: features
environment: development
category_output: Classes/Extensions
有关更多信息,请运行 flip-the-switch help
将 pod 'FlipTheSwitch'
添加到您的 Podfile
将 gem 'flip_the_switch'
添加到您的 Gemfile
FlipTheSwitch 在 MIT 许可下提供。有关更多信息,请参阅 LICENSE 文件。