如何在 iOS 中进行简单的 AB 测试
How to do simple AB testing in iOS
我希望将我的用户群分成 10 个组,并展示 10 个不同的 UI,看看他们对此有何看法。
因此每个用户组将始终只有一种类型 UI。
即假设我有 10k 用户,当我在用户安装时推出我的下一个版本时,我将显示 1000 个用户 1 UI 和另外 1000 个用户 1 UI 就像所有 10K用户。
我知道这可以在 AB 测试框架的帮助下完成。
基本上我想在应用程序启动时调用一个 API,它的 return 值必须在 1 到 10 之间,然后我可以将它存储在我的钥匙串中,下次应用程序启动时我会看看它是否已经存在于钥匙串中,我不会调用 API.
所以基本上 API 会知道有多少请求,它会划分并发回正确的值
因此,根据钥匙串中的价值,我将展示不同的、不同的 UI,这里 AB 测试框架的工作是在 API 部分为我提供 1 到 10 的价值。
AB 测试框架太多了online.But我找不到适合我需要的框架。
感谢任何帮助!
想象一下,在不提交新版本的情况下更改 iOS 应用中的字体、颜色或某些值。使用远程配置非常简单。此 tutorial 将教您 A/B 测试,但在 A/B 测试之前,我建议您查看远程配置。
最好的方法是将用户分成数据库中的组,让登录 API 或其他一些 API return 一些标志来指示每个用户属于哪个组,并且您可以相应地显示 UI。
但如果那不可能
那么最简单的方法就是生成一个介于 1-10 之间的随机数并将其保存在钥匙串中并为其显示一个特定的 UI 以便下次启动该应用程序时您可以留意Keychain 中的值,如果它不存在,那么您可以创建一个新的随机值并以 keychain.This 的方式存储它,您将始终为该用户显示相同的 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 保存在钥匙串中,对于 7-12,你可以将值 2 保存在钥匙串中等等。54-60你可以在钥匙串中保留值 10。
其他
你可以考虑根据地理或国家或时区来划分用户,这样做也有自己的陷阱。
像这样你可以设计自己的策略来拆分用户
但如果上述 none 的建议符合您的标准,那么最好的方法是寻找第三方 AB 测试框架,但如果要在企业规模实施,他们可能会为此收取一些费用.
如果我遇到任何此类单独提供此特定功能的框架,我会在此处进行更新。
我想把这个答案的功劳归功于这个 正如他指出的 FireBase Remote Config 和 A/B 测试.
正如提问者所问,我将解释实现它所涉及的步骤。
服务器上的配置
访问 https://console.firebase.google.com/ 并使用您的
google 账号.
选择创建项目并点击iOS
输入app id和昵称点击注册应用
它将显示 link 到 GoogleService-Info.plist 下载然后将其拖放到项目中
选择下一步
它会向您显示运行您的应用程序以验证安装您可以选择跳过此步骤
从登陆页面选择远程配置
选择添加变量并输入您选择的变量名称,但我输入 ABTestVariationType 并将值留空并选择 Publish changes
从边栏选择A/B测试,然后点击创建实验 然后选择 远程配置
在即将出现的弹出窗口中输入您选择的名称我输入为A/B测试POC输入一些关于它的描述,无论如何这是可选的
在目标用户中选择你的app id并在目标百分比中users 选择 100% 然后点击 Next 然后它会显示 variants 部分
在变体部分将有一个名为 控制组 的常规类别,默认加载 50%,还有一个变体框,其中 50% 已填充且为空框,您可以在其中输入任何名称,但我会输入变体 2.Now 单击添加参数 8 次,现在您可以看到每个变体都有 10% 并命名所有变体,我会将变体 3、变体 4 命名为变体10.
在相同的变体部分单击 从 远程配置
添加参数
现在您可以看到每个变体旁边出现一个框 parameter.You 可以输入唯一值来标识每个 flavour.I 将为第一个变体输入值 1,为第二个变体输入 2,这样我将以值结束10 为最后一个变体,然后单击 Next
然后出现目标部分,您可以选择其中之一,但我会选择 Retention(15+) days 并单击 Review 然后单击 开始实验 并在出现的提示中再次选择 开始
在应用程序中集成
在您的项目中添加以下内容pods
pod 'Firebase/Core'
pod 'Firebase/RemoteConfig'
拖放在服务器配置期间下载的 GoogleService-Info.plist
使用以下样板代码启动 firebase
@import Firebase;
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions(NSDictionary *)launchOptions
{
[FIRApp configure];
return YES;
}
4.Have class 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
5.Invoke appdelegate 中的 class didFinishinglaunchoptions
RcValues *Obj=[RcValues sharedInstance];
这将下载 ABtesting 的键值
6.Use 下面的代码将 AB 测试密钥从 firebase 获取到您的应用程序
self.flavourNumber.text=[FIRRemoteConfig.remoteConfig
configValueForKey:@"ABTestVariationType"].stringValue;
根据键值,您可以根据需要显示不同的 UI。
Firebase 会负责发送正确的值,您不必担心自己将用户分组。
P.S
请按照下面的教程了解更多详细信息这只是一个总结,我会在有空的时候尝试总结或添加更多图片以使其更容易理解如果可能的话我会尝试在中添加示例项目github 和 link 在这里
我希望将我的用户群分成 10 个组,并展示 10 个不同的 UI,看看他们对此有何看法。
因此每个用户组将始终只有一种类型 UI。
即假设我有 10k 用户,当我在用户安装时推出我的下一个版本时,我将显示 1000 个用户 1 UI 和另外 1000 个用户 1 UI 就像所有 10K用户。
我知道这可以在 AB 测试框架的帮助下完成。
基本上我想在应用程序启动时调用一个 API,它的 return 值必须在 1 到 10 之间,然后我可以将它存储在我的钥匙串中,下次应用程序启动时我会看看它是否已经存在于钥匙串中,我不会调用 API.
所以基本上 API 会知道有多少请求,它会划分并发回正确的值
因此,根据钥匙串中的价值,我将展示不同的、不同的 UI,这里 AB 测试框架的工作是在 API 部分为我提供 1 到 10 的价值。
AB 测试框架太多了online.But我找不到适合我需要的框架。
感谢任何帮助!
想象一下,在不提交新版本的情况下更改 iOS 应用中的字体、颜色或某些值。使用远程配置非常简单。此 tutorial 将教您 A/B 测试,但在 A/B 测试之前,我建议您查看远程配置。
最好的方法是将用户分成数据库中的组,让登录 API 或其他一些 API return 一些标志来指示每个用户属于哪个组,并且您可以相应地显示 UI。
但如果那不可能
那么最简单的方法就是生成一个介于 1-10 之间的随机数并将其保存在钥匙串中并为其显示一个特定的 UI 以便下次启动该应用程序时您可以留意Keychain 中的值,如果它不存在,那么您可以创建一个新的随机值并以 keychain.This 的方式存储它,您将始终为该用户显示相同的 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 保存在钥匙串中,对于 7-12,你可以将值 2 保存在钥匙串中等等。54-60你可以在钥匙串中保留值 10。
其他
你可以考虑根据地理或国家或时区来划分用户,这样做也有自己的陷阱。
像这样你可以设计自己的策略来拆分用户
但如果上述 none 的建议符合您的标准,那么最好的方法是寻找第三方 AB 测试框架,但如果要在企业规模实施,他们可能会为此收取一些费用.
如果我遇到任何此类单独提供此特定功能的框架,我会在此处进行更新。
我想把这个答案的功劳归功于这个
正如提问者所问,我将解释实现它所涉及的步骤。
服务器上的配置
访问 https://console.firebase.google.com/ 并使用您的 google 账号.
选择创建项目并点击iOS
输入app id和昵称点击注册应用
它将显示 link 到 GoogleService-Info.plist 下载然后将其拖放到项目中
选择下一步
它会向您显示运行您的应用程序以验证安装您可以选择跳过此步骤
从登陆页面选择远程配置
选择添加变量并输入您选择的变量名称,但我输入 ABTestVariationType 并将值留空并选择 Publish changes
从边栏选择A/B测试,然后点击创建实验 然后选择 远程配置
在即将出现的弹出窗口中输入您选择的名称我输入为A/B测试POC输入一些关于它的描述,无论如何这是可选的
在目标用户中选择你的app id并在目标百分比中users 选择 100% 然后点击 Next 然后它会显示 variants 部分
在变体部分将有一个名为 控制组 的常规类别,默认加载 50%,还有一个变体框,其中 50% 已填充且为空框,您可以在其中输入任何名称,但我会输入变体 2.Now 单击添加参数 8 次,现在您可以看到每个变体都有 10% 并命名所有变体,我会将变体 3、变体 4 命名为变体10.
在相同的变体部分单击 从 远程配置
添加参数 现在您可以看到每个变体旁边出现一个框 parameter.You 可以输入唯一值来标识每个 flavour.I 将为第一个变体输入值 1,为第二个变体输入 2,这样我将以值结束10 为最后一个变体,然后单击 Next然后出现目标部分,您可以选择其中之一,但我会选择 Retention(15+) days 并单击 Review 然后单击 开始实验 并在出现的提示中再次选择 开始
在应用程序中集成
在您的项目中添加以下内容pods
pod 'Firebase/Core' pod 'Firebase/RemoteConfig'
拖放在服务器配置期间下载的 GoogleService-Info.plist
使用以下样板代码启动 firebase
@import Firebase; -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions(NSDictionary *)launchOptions { [FIRApp configure]; return YES; }
4.Have class 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
5.Invoke appdelegate 中的 class didFinishinglaunchoptions
RcValues *Obj=[RcValues sharedInstance];
这将下载 ABtesting 的键值
6.Use 下面的代码将 AB 测试密钥从 firebase 获取到您的应用程序
self.flavourNumber.text=[FIRRemoteConfig.remoteConfig
configValueForKey:@"ABTestVariationType"].stringValue;
根据键值,您可以根据需要显示不同的 UI。
Firebase 会负责发送正确的值,您不必担心自己将用户分组。
P.S
请按照下面的教程了解更多详细信息这只是一个总结,我会在有空的时候尝试总结或添加更多图片以使其更容易理解如果可能的话我会尝试在中添加示例项目github 和 link 在这里