为 iOS 提供的远程配置和 A/B 测试框架。 在线文档 可用.
制作 iOS 应用时的一大挑战是发布应用更新需要很长时间。有时候我们希望尽快将某个应用中的某个功能远程更改。
const BOOL isThisFeatureEnabled = [activeConfig[@"AppFeatures"] boolForKey:@"SomeFeatureEnabled"];
使用这个简短的命令,MSActiveConfig
会告诉我们特定的功能是否已被启用,但我们还可以实时响应配置的变化
[activeConfig registerListener:self
forSectionName:@"AppFeatures"];
- (void)activeConfig:(MSActiveConfig *)activeConfig
didReceiveConfigSection:(MSActiveConfigSection *)configSection
forSectionName:(NSString *)sectionName
{
[self changeFeatureEnabledStatus:configSection[@"SomeFeatureEnabled"]];
}
当前的 A/B 测试框架将大部分责任归结于应用:它们假设应用将知道你将被要求测试特定功能的所有可能值。这是非常限制性的,因为这将迫使你更新应用来尝试新值。Active Config 鼓励你把知识留在后端,为你提供更多的控制。
例如,如果你要对你应用中某个部分的某些文本进行 A/B 测试,传统 A/B 测试框架会告诉应用选择选项 A 或选项 B。这样,应用必须在事先知道那些字符串。使用 Active Config,你会把字符串放在配置中,这样你可以在任何时刻更改它们。
当然,A/B 测试还有很多更多的事情要做,但 MSActiveConfig
为你在应用中选择大量灵活性来实现它提供了基础。未来版本中将出现更多针对 A/B 测试的特定工具。
git submodule add [email protected]:mindsnacks/MSActiveConfig.git <path/to/your/submodule>
有两种方式可以将 MSActiveConfig
整合到您的项目中
如果您已经有工作区或不想创建一个
MSActiveConfig.xcodeproj
文件添加到您的项目中。MSActiveConfig
。libMSActiveConfig.a
。MSActiveConfig/Classes
中的源文件添加到您的项目中,并与其他源代码一起编译。首先导入 MSActiveConfig.h
。典型的应用程序将有一个创建如下所示的 MSActiveConfig
对象:
id<MSActiveConfigDownloader> configDownloader = ...
id<MSActiveConfigStore> configStore = ...
MSActiveConfig *activeConfig = [[MSActiveConfig alloc] initWithConfigDownloader:configDownloader
configStore:configStore];
有关如何实例化 MSActiveConfig
对象的完整代码片段,请参阅维基页面。
MSActiveConfigDownloader
一个类必须遵循此协议,以便允许 MSActiveConfig
从网络检索更新。需要实现的给定类必须实现此方法。
- (NSDictionary *)requestActiveConfigForUserWithID:(NSString *)userID
error:(NSError **)error;
对于大多数应用程序,提供的 MSJSONURLRequestActiveConfigDownloader
类足以,它允许您创建如下所示的下载器对象:
downloader = [[MSJSONURLRequestActiveConfigDownloader alloc] initWithCreateRequestBlock:^NSURLRequest *(NSString *userID) {
return [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://myserver.com/activeconfig/user/%@", userID]]];
}];
注意:MSActiveConfig
从不会自行启动下载,您必须使用公共方法 -downloadNewConfig
来告诉它下载。
MSActiveConfigStore
此协议定义了一系列方法,允许 MSActiveConfig
将下载的配置持久化,以便在应用程序后续启动时检索它,以始终使用最新的配置。
- (MSActiveConfigConfigurationState *)lastKnownActiveConfigurationForUserID:(NSString *)userID;
- (void)persistConfiguration:(MSActiveConfigConfigurationState *)configuration forUserID:(NSString *)userID;
MSActiveConfig
提供了一个实现此协议的实现,它使用 NSUserDefault
作为其后备存储:MSUserDefaultsActiveConfigStore
。此类还允许您提供初始的或 引导 配置,直到应用程序成功从服务器下载更旧的配置。
- (id)initWithInitialSharedConfiguration:(MSActiveConfigConfigurationState *)initialSharedConfiguration;
MSActiveConfigConfigurationState
此类代表 Active Config 可以用于提供设置值的特定配置集。它可以从 NSDictionary
实例化,例如,通过解析应用程序包中的 JSON 文件来为 MSUserDefaultsActiveConfigStore
创建初始配置。
MSActiveConfigSection
这是您在请求 MSActiveConfig
配置时得到的对象类型。它围绕指定的 ConfigSection(以下配置交换格式)中的所有设置键和值进行包装(请参阅以下配置交换格式)。它具有获取特定类型值的方法,并在设置键不存在或具有不同类型时返回 nil。
MSActiveConfig
设计得非常灵活。您需要遵循的唯一规则是由 MSActiveConfig
理解的配置交换格式所强加的。配置表示为一个字典对象,它必须看起来像这样
{
"meta":
{
"format_version_string": "1.0",
"creation_time": "2012-08-20T19:36Z",
"other_meta_key": "arbitrary objects with other relevant information"
},
"config_sections":
{
"ConfigSection1":
{
"settings":
{
"SettingKey1":
{
"value": "This can be a a string, number, boolean, array or object"
}
}
},
}
}
当你要求 MSActiveConfig
下载配置更新时,它将期待以下格式的字典。如果提供的字典无法解析,则问题将记录到控制台,并将忽略配置。
配置的元数据部分必须包含格式版本(供未来使用)和创建时间(用于调试目的)。其他所有添加的值都是可选的,但可以用来为配置提供上下文。
例如,如果您正在使用 MSActiveConfig
进行某种 A/B 测试,您可以将一些信息添加到元数据字典中,以便稍后在向您的分析服务发送事件时识别该用户属于哪个测试组。您可以通过两种方式访问元数据字典:
MSActiveConfig
会发布一个包含元数据字典的 NSNotification
(MSActiveConfigDownloadUpdateFinishedNotification
),该字典位于 userInfo
中的一个键中(MSActiveConfigDownloadUpdateFinishedNotificationMetaKey
)。MSActiveConfig
调用 -currentConfigurationMetaDictionary
方法。这是设置的最高级别组。一个部分将一组与您的应用程序的特定组件相关的设置分组。当使用 -registerListener:forSectionName:
API 时,您可以收到通知,当任何部分的设置更改时。它们由 MSActiveConfigSection
类表示。
这是部分中包含的特定设置。这些是您将要求 MSActiveConfigSection
的。
MSActiveConfig
提供了 API,允许您为您的应用程序中的不同用户提供不同的配置。这是为允许您使用不同用户注销和登录的应用程序设计的。如果您的情况不是这样,所有这些 API 允许您简单地使用 nil
作为用户 ID。
在 Xcode 项目中运行目标 MSActiveConfig-SampleApp
,以获取在应用程序中对 MSActiveConfig
的示例实现。此示例应用程序使用 [此后端](https://github.com/JaviSoto/ActiveConfig-SampleNodeBackend) 获取其配置。
MSActiveConfig
是一个坚实的框架,已经在一些具有数百万用户的苹果应用程序中发放了超过 6 个月。未来的工作在 [问题页面](https://github.com/mindsnacks/MSActiveConfig/issues) 中总结。
MSActiveConfig
需要 iOS6 或更高版本,但如果您确实需要为您的项目支持 iOS5,可以很容易地进行支持。
MSActiveConfig
在 MIT 许可下提供。有关更多信息,请参阅 LICENSE 文件。