如何在iOS中进行简单的AB测试

11
我想把我的用户基础分成10组,并展示10种不同的UI,看看他们的感受如何。
因此,每个用户组始终只有单一类型的UI。
例如,我有10k个用户,在发布下一个版本时,当用户安装时,我将为1000个用户展示1种UI,并为另外1000个用户展示另一种UI,以此类推。
我知道这可以通过AB测试框架来实现。
基本上,我想在应用启动时调用一个API,并返回1到10之间的值,然后我可以将其存储在我的钥匙链中,下次启动应用程序时,如果它已经存在于钥匙链中,我就不会调用该API。
因此,API将知道有多少请求已经发出,并且将分配并发送正确的值。
根据钥匙链中的值,我将显示不同的UI。AB测试框架的工作是提供API部分的值1到10。
有很多在线AB测试框架可用。但是我找不到适合我需求的框架。
非常感谢您的帮助!

7
听起来你正在寻找一个 ABCDEFGHIJ 测试框架。 - GetSwifty
哈哈,你说得对 :) - Dan Ram
3
这里只是一个侧记- AB测试真的非常难以正确地执行,往往会误导您做出错误的决策。根据经验,它也非常耗时。如果这是您第一次尝试AB测试,请确保先研究如何正确进行。否则我的建议是专注于开发您的应用程序,跳过A/B,然后只需询问您的用户他们想要什么即可。数字有时无法传达观点。 - Oscar Apeland
3个回答

7
最好的方法是将用户分组并在数据库中标记每个用户所属的组,然后让登录API或其他API返回一些标志以指示每个用户属于哪个组,从而可以相应地显示UI。
但如果这不可能的话,
那么最简单的方法是生成1-10之间的随机数并将其保存在keychain中,并为其显示特定的UI,这样下次启动应用程序时,您可以查找Keychain中的值,如果不存在,则可以创建一个新的随机值并将其存储在keychain中。 这样,您将始终为该用户显示相同的UI。
这种分组方法不是100%准确,但我认为足够接近。
arc4random_uniform
- (NSInteger)randomNumberBetween:(NSInteger)min maxNumber:(NSInteger)max
{
    return min + arc4random_uniform((uint32_t)(max - min + 1));
}

如果你随机取样这些数字10000次,你会看到每个数字出现900-1000次,约占9-10%,这已经足够接近。

 for(int i=0;i<10000;i++){
      NSLog(@"random:%ld",[self randomNumberBetween:1 maxNumber:10]);
    }

当前时间的秒数

您可以获取当前日期和时间的秒数,如果秒数在1-6之间,则可以将值1保存在keychain中;如果在7-12之间,则可以将值2保存在keychain中,等等,如果是54-60,则可以将值10保存在keychain中。

其他事项

您可以考虑根据地理位置、国家或时区划分用户,但这样做也有其弊端。

像这样,您可以制定自己的策略来分割用户。

但如果以上没有建议符合您的标准,那么最好的方法是寻找第三方AB测试框架,但如果要在企业规模中实施,他们可能会收取一些费用。

如果我遇到任何提供此功能的特定框架,我会在此处进行更新。


这些解决方案看起来足够好,但对我来说,将用户按照确切的百分比分成组是首要任务。 - Dan Ram
我可以在数据库中分组用户,并使API返回一些标识来表示用户属于哪个变量,但不幸的是我无法做到这一点。 - Dan Ram

6
我想将这个答案的功劳归因于这个 帖子,因为他指出了 FireBase 远程配置A/B 测试

由于提问者的要求,我将解释实现它所涉及的步骤。

服务器上的配置

  • 访问https://console.firebase.google.com/并使用您的Google账户登录。

  • 选择创建项目并点击iOS

  • 输入应用程序ID昵称,然后点击注册应用程序

  • 它将显示一个链接到GoogleService-Info.plist下载,然后将其拖放到项目中

  • 选择下一步

  • 它将向您显示运行您的应用程序以验证安装,您可以选择跳过此步骤

  • 从首页选择远程配置

  • 选择添加变量并输入您选择的变量名称,但我输入ABTestVariationType并留下值为空,然后选择发布更改

  • 侧边栏选择A/B测试,然后单击创建实验,然后选择远程配置

  • 在即将出现的弹出窗口中,输入您选择的名称,我输入为A/B测试POC,输入一些描述(可选)

  • 目标用户中选择您的应用程序ID,在目标用户百分比中选择100%,然后单击下一步,然后它将显示变体部分

  • 在变体部分中,将有一个名为控制组的常规类别,默认加载50%,以及一个填充了50%和空框的变体框,您可以在其中输入任何名称,但我会输入变体2。现在点击添加参数8次,现在您可以看到每个变体都有10%,并命名所有变体,我会将变体3、变体4命名为变体10。

  • 在相同的变体部分中,从远程配置中单击添加参数
    现在,您可以看到每个变体参数旁边出现一个框。您可以输入唯一值以识别每种口味。我会为第一个变体输入值1,为第二个变体输入值2,依此类推,最后一个变体为值10,然后单击下一步

  • 然后目标部分出现,您可以选择其中之一,但我会选择保留(15+)天,然后单击审核,再单击开始实验,在出现的提示中再次选择开始

在应用中集成
  1. Add the following pods in your project

    pod 'Firebase/Core'
    
    pod 'Firebase/RemoteConfig'
    
  2. Drag and drop the GoogleService-Info.plist that was downloaded during the server configuration

  3. Initiate the firebase with following boiler-plate code

      @import Firebase;
    
      -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions(NSDictionary *)launchOptions 
     {
    
       [FIRApp configure];
    
       return YES;
    
     }
    
4. 在您的项目中,有一个名为RcValues的类,它是另一个样板代码。
     #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

在AppDelegate的didFinishLaunchingWithOptions方法中调用该类。
    RcValues *Obj=[RcValues sharedInstance]; 

这将下载 ABtesting 的 keyvalue。
6. 使用下面的代码从 Firebase 获取 AB 测试密钥到您的应用程序中。
    self.flavourNumber.text=[FIRRemoteConfig.remoteConfig
    configValueForKey:@"ABTestVariationType"].stringValue;

基于关键值,您可以按照您的意愿显示不同的用户界面。
Firebase会负责发送正确的值,您无需自己将用户分组。

P.S

请按以下教程获取更详细的信息,这只是一个摘要。我将在有空时尝试总结或添加更多图片以便于理解。如果可能的话,我会尝试在GitHub上添加示例项目,并在此处链接。 Firebase iOS AB测试教程 Firebase远程配置iOS教程

2
感谢提供详细的步骤。 - Dan Ram

5

想象一下,在不提交新构建的情况下更改iOS应用程序中的字体,颜色或某些值。使用远程配置非常容易。在进行A / B测试之前,请查看远程配置。这个教程将教您如何进行A / B测试,但我建议您先了解一下远程配置。


谢谢。但如果您能向我解释如何通过服务器配置、SDK集成和代码片段来满足我的需求,那就太好了。 - Dan Ram
2
@DanRam - 感谢Vaibhav指出了Firebase A/B测试远程配置,我已经解释了如何操作。请在这里找到答案。 - Durai Amuthan.H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接