如何在iOS中进行简单的AB测试
我希望将我的用户群分成10个组,展示10个不同的UI,看看他们对此有何感受 因此,每个用户组将始终具有单一类型的UI i、 假设我有10k用户,当我在用户安装时推出下一个版本时,我将显示1000个用户1 UI和其他1000个用户1 UI,就像所有10k用户一样 我知道这可以在AB测试框架的帮助下完成 基本上,我想在应用程序启动时调用一个API,它必须返回1到10之间的值,然后我可以将其存储在我的密钥链中,下次启动应用程序时,我将查看它是否已经存在于密钥链中,我不会调用API 因此,基本上API将知道有多少请求已经到来,它将划分并发送正确的值 因此,基于keychain中的值,我将展示不同的UI,这里AB测试框架的工作将给我API部分的值1到10 网上有很多AB测试框架,但我找不到任何适合我需要的框架如何在iOS中进行简单的AB测试,ios,mobile-application,ab-testing,abtest,Ios,Mobile Application,Ab Testing,Abtest,我希望将我的用户群分成10个组,展示10个不同的UI,看看他们对此有何感受 因此,每个用户组将始终具有单一类型的UI i、 假设我有10k用户,当我在用户安装时推出下一个版本时,我将显示1000个用户1 UI和其他1000个用户1 UI,就像所有10k用户一样 我知道这可以在AB测试框架的帮助下完成 基本上,我想在应用程序启动时调用一个API,它必须返回1到10之间的值,然后我可以将其存储在我的密钥链中,下次启动应用程序时,我将查看它是否已经存在于密钥链中,我不会调用API 因此,基本上API将
感谢您的帮助 想象一下,在不提交新版本的情况下更改iOS应用程序中的字体、颜色或某些值。使用远程配置非常简单。这将教会您A/B测试,但在A/B测试之前,我建议您查看一下远程配置 最好的方法是将用户分成数据库中的组,让登录API或其他API返回一些标志,以指示每个用户所属的组,并相应地显示UI 但如果不可能的话 然后,最简单的方法是生成一个介于1-10之间的随机数,并将其保存在keychain中,并为其显示一个特定的UI,以便下次启动应用程序时,您可以查看keychain中的值,如果没有,则可以创建一个新的随机值并将其存储在keychain中。这样,您将显示相同的UI对于该用户,始终 这种分割方法不是100%准确,但我认为它已经足够接近了 arc4random_均匀 如果你对这些随机数取样10000次,你可以看到每一个数都有900-1000次,这是9-10%,而且足够接近了
for(int i=0;i<10000;i++){
NSLog(@"random:%ld",[self randomNumberBetween:1 maxNumber:10]);
}
for(int i=0;i我想把这个答案归功于他指出的FireBase远程配置和A/B测试
正如提问者所问,我将解释实现它所涉及的步骤
服务器上的配置
- 访问并使用您的
谷歌账户
- 选择创建项目,然后单击iOS
- 输入应用程序id和昵称,然后单击注册应用程序
- 它将显示一个指向谷歌服务信息.plist下载的链接,然后将其拖放到项目中
- 选择下一步
它将显示运行应用程序以验证安装您可以选择跳过此步骤
从登录页选择远程配置
选择添加变量并输入您选择的变量名称,但我输入ABTestVariationType并将值留空,然后选择发布更改
从侧栏中选择A/B测试,然后单击创建实验,然后选择远程配置
在即将出现的弹出窗口中,输入您选择的名称,我作为A/B测试POC输入有关它的一些描述,这是可选的
在目标用户中选择你的应用程序id,在目标用户百分比中选择100%,然后单击下一步,它将显示变体部分
在变体部分,将有一个名为控制组的常规类别,默认情况下加载50%,变量框中填充50%,空框,您可以在其中输入任何名称,但我将输入变体2。现在单击添加参数8次,现在您可以看到每个变体有10%,并命名所有变体,我将d名称变体3、变体4至变体10
在同一变体部分中,单击从远程配置添加参数
现在,您可以在每个变体参数旁边看到a框。您可以输入唯一的值来标识每个味道。我将为第一个变体输入值1,为第二个变体输入值2,就像这样,我将为最后一个变体输入值10,然后单击“下一步”
然后出现目标部分,您可以选择其中一个,但我会选择保留(15天以上),然后单击回顾,然后单击开始实验,并在出现的提示中再次选择开始
在应用程序中集成
在项目中添加以下pod
pod 'Firebase/Core'
pod 'Firebase/RemoteConfig'
#import "RcValues.h"
@import Firebase;
@implementation RcValues
+(RcValues *)sharedInstance
{
static RcValues *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[RcValues alloc] init];
});
return sharedInstance;
}
-(id)init{
self=[super init];
if(self)
{
[self AcivateDebugMode];
[self LoadDefaultValues];
[self FetchCloudValues];
}
return self;
}
-(void)LoadDefaultValues
{
[FIRRemoteConfig.remoteConfigsetDefaults:
@{@"appPrimaryColor":@"#FBB03B"}];
}
-(void)FetchCloudValues
{
NSTimeInterval fetchInterval=0;
[FIRRemoteConfig.remoteConfigfetchWithExpirationDuration:
fetchInterval completionHandler:^(FIRRemoteConfigFetchStatus
status, NSError *_Nullable error)
{
NSLog(@"error:%@",error);
[FIRRemoteConfig.remoteConfig activateFetched];
}];
}
-(void)AcivateDebugMode{ //
FIRRemoteConfig.remoteConfig.configSettings=debugSettings;
FIRRemoteConfigSettings *config = [[FIRRemoteConfigSettings alloc] initWithDeveloperModeEnabled:YES];
FIRRemoteConfig.remoteConfig.configSettings=config;
}
@end
拖放在服务器配置期间下载的GoogleService Info.plist
使用以下锅炉板代码启动firebase
@import Firebase;
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions(NSDictionary *)launchOptions
{
[FIRApp configure];
return YES;
}
4.使用类RcValues,这是项目中的另一个锅炉板代码
pod 'Firebase/Core'
pod 'Firebase/RemoteConfig'
#import "RcValues.h"
@import Firebase;
@implementation RcValues
+(RcValues *)sharedInstance
{
static RcValues *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[RcValues alloc] init];
});
return sharedInstance;
}
-(id)init{
self=[super init];
if(self)
{
[self AcivateDebugMode];
[self LoadDefaultValues];
[self FetchCloudValues];
}
return self;
}
-(void)LoadDefaultValues
{
[FIRRemoteConfig.remoteConfigsetDefaults:
@{@"appPrimaryColor":@"#FBB03B"}];
}
-(void)FetchCloudValues
{
NSTimeInterval fetchInterval=0;
[FIRRemoteConfig.remoteConfigfetchWithExpirationDuration:
fetchInterval completionHandler:^(FIRRemoteConfigFetchStatus
status, NSError *_Nullable error)
{
NSLog(@"error:%@",error);
[FIRRemoteConfig.remoteConfig activateFetched];
}];
}
-(void)AcivateDebugMode{ //
FIRRemoteConfig.remoteConfig.configSettings=debugSettings;
FIRRemoteConfigSettings *config = [[FIRRemoteConfigSettings alloc] initWithDeveloperModeEnabled:YES];
FIRRemoteConfig.remoteConfig.configSettings=config;
}
@end
5.在appdelegate didFinishinglaunchoptions中调用类
RcValues *Obj=[RcValues sharedInstance];
这将下载密钥值以进行测试
6.使用以下代码将AB测试密钥从firebase获取到您的应用程序
self.flavourNumber.text=[FIRRemoteConfig.remoteConfig
configValueForKey:@"ABTestVariationType"].stringValue;
根据键值,您可以根据需要显示不同的UI
Firebase将负责发送正确的值,您不必担心自己将用户分成多个组
附笔
请按照下面的教程获取更详细的信息这只是一个摘要,我会尝试总结或添加更多的图片,当我有空闲时间,使它更容易理解如果可能的话,我会尝试在github中添加示例项目