Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

使用 A/B 测试创建消息传递实验

当您接触用户或开始新的营销活动时,您需要确保做对了。 A/B 测试可以通过测试用户群的选定部分的消息变体来帮助您找到最佳的措辞和呈现方式。无论您的目标是更好地保留还是转换报价,A/B 测试都可以执行统计分析以确定消息变体是否优于您所选目标的基线。

要使用基线对功能变体进行 A/B 测试,请执行以下操作:

  1. 创建您的实验。
  2. 在测试设备上验证您的实验。
  3. 管理您的实验。

创建实验

使用通知编辑器的实验允许您评估单个通知消息的多个变体。

  1. 登录到Firebase 控制台并验证您的项目中是否启用了 Google Analytics,以便实验可以访问 Analytics 数据。

    如果您在创建项目时未启用 Google Analytics,则可以在集成选项卡上启用它,您可以使用Firebase 控制台中的 >项目设置访问该选项卡。

  2. Firebase 控制台导航栏的参与部分中,单击A/B 测试

  3. 单击创建试验,然后在系统提示您选择要试验的服务时选择通知

  4. 为您的实验输入名称和可选的描述,然后单击下一步

  5. 填写定位字段,首先选择使用您的实验的应用程序。您还可以通过选择包括以下内容的选项来定位一部分用户参与您的实验:

    • 版本:您应用的一个或多个版本
    • 用户受众:用于定位可能包含在实验中的用户的分析受众
    • 用户属性:一个或多个 Analytics 用户属性,用于选择可能包含在实验中的用户
    • 国家/地区:一个或多个国家或地区,用于选择可能包含在实验中的用户
    • 设备语言:一种或多种语言和区域设置,用于选择可能包含在实验中的用户
    • 首次打开:根据用户第一次打开您的应用来定位用户
    • 上次应用互动:根据用户上次与您的应用互动的时间来定位用户
  6. 设置目标用户百分比:选择您的应用程序用户群中与目标用户下设置的条件相匹配的百分比,您希望将其平均分配给实验中的基线和一个或多个变体。这可以是 0.01% 到 100% 之间的任何百分比。每个实验的百分比随机重新分配给用户,包括重复实验。

  7. Variants部分的Enter message 文本字段中键入要发送到基线组的消息。要不向基线组发送消息,请将此字段留空。

  8. (可选)要向您的实验添加多个变体,请点击添加变体。默认情况下,实验有一个基线和一个变体。

  9. (可选)为实验中的每个变体输入一个名称,以替换名称Variant AVariant B等。

  10. 为您的实验定义一个目标指标,以在评估实验变体时使用,以及下拉列表中的任何所需的其他指标。这些指标包括内置目标(参与度、购买量、收入、保留率等)、分析转化事件和其他分析事件。

  11. 为您的消息选择选项:

    • 交付日期:选择“立即发送”以在保存后立即启动您的实验,或选择“预定”以指定将来启动您的实验的时间。
    • 高级选项:要为实验中包含的所有通知选择高级选项,请展开高级选项,然后更改任何列出的消息选项。
  12. 单击查看以保存您的实验。

每个项目最多允许 300 个实验,其中最多可包含 24 个正在运行的实验,其余为草稿或已完成。

在测试设备上验证您的实验

对于每个 Firebase 安装,您都可以检索与其关联的 FCM 注册令牌。您可以使用此令牌在安装了您的应用程序的测试设备上测试特定的实验变体。要在测试设备上验证您的实验,请执行以下操作:

  1. 获取FCM注册令牌如下:

    迅速

    Messaging.messaging().token { token, error in
      if let error = error {
        print("Error fetching FCM registration token: \(error)")
      } else if let token = token {
        print("FCM registration token: \(token)")
        self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
      }
    }
    

    目标-C

    [[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
      if (error != nil) {
        NSLog(@"Error getting FCM registration token: %@", error);
      } else {
        NSLog(@"FCM registration token: %@", token);
        self.fcmRegTokenMessage.text = token;
      }
    }];
    

    Java

    FirebaseMessaging.getInstance().getToken()
        .addOnCompleteListener(new OnCompleteListener<String>() {
            @Override
            public void onComplete(@NonNull Task<String> task) {
              if (!task.isSuccessful()) {
                Log.w(TAG, "Fetching FCM registration token failed", task.getException());
                return;
              }
    
              // Get new FCM registration token
              String token = task.getResult();
    
              // Log and toast
              String msg = getString(R.string.msg_token_fmt, token);
              Log.d(TAG, msg);
              Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

    Kotlin+KTX

    FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
        if (!task.isSuccessful) {
            Log.w(TAG, "Fetching FCM registration token failed", task.exception)
            return@OnCompleteListener
        }
    
        // Get new FCM registration token
        val token = task.result
    
        // Log and toast
        val msg = getString(R.string.msg_token_fmt, token)
        Log.d(TAG, msg)
        Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
    })

    C++

    firebase::InitResult init_result;
    auto* installations_object = firebase::installations::Installations::GetInstance(
        firebase::App::GetInstance(), &init_result);
    installations_object->GetToken().OnCompletion(
        [](const firebase::Future& future) {
          if (future.status() == kFutureStatusComplete &&
              future.error() == firebase::installations::kErrorNone) {
            printf("Installations Auth Token %s\n", future.result()->c_str());
          }
        });
        

    Unity

    Firebase.Messaging.FirebaseMessaging.DefaultInstance.GetTokenAsync().ContinueWith(
      task => {
        if (!(task.IsCanceled || task.IsFaulted) && task.IsCompleted) {
          UnityEngine.Debug.Log(System.String.Format("FCM registration token {0}", task.Result));
        }
      });
    
  2. Firebase 控制台导航栏上,单击A/B 测试
  3. 点击Draft ,将鼠标悬停在您的实验上,点击上下文菜单 ( ),然后点击Manage test devices
  4. 输入测试设备的 FCM 令牌,然后选择要发送到该测试设备的实验变体。
  5. 运行应用程序并确认所选变体正在测试设备上接收。

管理您的实验

无论您是使用 Remote Config、Notifications composer 还是 Firebase In-App Messaging 创建实验,您都可以随后验证并开始实验,在实验运行时监控实验,并增加运行实验中包含的用户数量。

实验完成后,您可以记下获胜变体使用的设置,然后将这些设置推广给所有用户。或者,您可以运行另一个实验。

开始实验

  1. Firebase 控制台导航栏的参与部分中,单击A/B 测试
  2. 单击草稿,然后单击您的实验的标题。
  3. 要验证您的应用程序是否有将包含在您的实验中的用户,请展开草稿详细信息并检查定位和分布部分中大于0% 的数字(例如, 1% 的用户符合条件)。
  4. 要更改您的实验,请点击编辑
  5. 要开始您的实验,请点击Start Experiment 。每个项目一次最多可以运行 24 个实验。

监控实验

实验运行一段时间后,您可以检查其进度并查看到目前为止已参与实验的用户的结果。

  1. Firebase 控制台导航栏的参与部分中,单击A/B 测试
  2. 单击Running ,然后单击或搜索实验的标题。在此页面上,您可以查看有关正在运行的实验的各种观察和建模统计信息,包括以下内容:

    • 与基线的差异百分比:衡量给定变体的指标相对于基线的改进程度。通过比较变体的值范围与基线的值范围来计算。
    • 击败基线的概率:给定变体击败所选指标的基线的估计概率。
    • observed_metric per user :根据实验结果,这是指标值随时间落入的预测范围。
    • Total observed_metric :基线或变体的观察到的累积值。该值用于衡量每个实验变体的执行情况,并用于计算ImprovementValue rangeProbability to beat baselineProbability to be the best variant 。根据测量的指标,此列可能会标记为“每个用户的持续时间”、“每个用户的收入”、“保留率”或“转化率”。
  3. 在您的实验运行一段时间后(FCM 和应用内消息传递至少 7 天,远程配置至少 14 天),此页面上的数据表明哪个变体(如果有)是“领导者”。一些测量伴随着条形图,以可视化格式显示数据。

向所有用户推出实验

在实验运行足够长的时间以至于您有一个“领导者”或获胜变体作为您的目标指标后,您可以将实验推广到 100% 的用户。这允许您选择一个变体以发布给所有用户。即使您的实验没有产生明显的赢家,您仍然可以选择向所有用户推出一个变体。

  1. Firebase 控制台导航栏的参与部分中,单击A/B 测试
  2. 单击已完成正在运行,单击要向所有用户推出的实验,单击上下文菜单 ( ),然后单击推出变体
  3. 通过执行以下操作之一向所有用户推出您的实验:

    • 对于使用Notifications composer 的实验,使用Roll out message对话框将消息发送给未参与实验的其余目标用户。
    • 对于远程配置实验,选择一个变体以确定要更新的远程配置参数值。创建实验时定义的目标条件将作为新条件添加到您的模板中,以确保推出仅影响实验所针对的用户。单击Remote Config 中的 Review查看更改后,单击Publish changes完成部署。
    • 对于应用内消息实验,使用对话框确定需要将哪个变体作为独立的应用内消息活动推出。选择后,您将被重定向到 FIAM 撰写屏幕,以便在发布前进行任何更改(如果需要)。

展开实验

如果您发现实验没有为 A/B 测试带来足够的用户来宣布领导者,您可以增加实验的分布以覆盖更大比例的应用用户群。

  1. Firebase 控制台导航栏的参与部分中,单击A/B 测试
  2. 选择要编辑的正在运行的实验。
  3. Experiment overview中,单击上下文菜单 ( ),然后单击Edit running experiment
  4. Targeting对话框显示一个选项,用于增加当前正在运行的实验中的用户百分比。选择一个大于当前百分比的数字并单击Publish 。实验将被推送到您指定的用户百分比。

复制或停止实验

  1. Firebase 控制台导航栏的参与部分中,单击A/B 测试
  2. 单击已完成正在运行,将鼠标悬停在您的实验上,单击上下文菜单 ( ),然后单击复制实验停止实验

用户定位

您可以使用以下用户定位条件来定位要包含在您的实验中的用户。

定位条件操作员笔记
版本包含,
不含,
完全匹配,
包含正则表达式
为您要包含在实验中的一个或多个应用程序版本输入一个值。

当使用任何containsdoes not containmatches exactly operators 时,您可以提供以逗号分隔的值列表。

使用包含正则表达式运算符时,您可以创建RE2格式的正则表达式。您的正则表达式可以匹配全部或部分目标版本字符串。您还可以使用^$锚点来匹配目标字符串的开头、结尾或整个内容。

用户受众包括所有,
至少包括以下一项,
不包括所有,
至少不包括以下一项
选择一个或多个 Analytics 受众以定位可能包含在您的实验中的用户。一些针对 Google Analytics 受众的实验可能需要几天时间来积累数据,因为它们受 Analytics数据处理延迟的影响。对于新用户,您最有可能遇到这种延迟,他们通常在创建后 24-48 小时内注册到符合条件的受众群体中,或者对于最近创建的受众群体
用户属性对于文本:
包含,
不含,
完全匹配,
包含正则表达式

对于数字:
<、≤、=、≥、>
Analytics 用户属性用于选择可能包含在实验中的用户,并提供一系列用于选择用户属性值的选项。

在客户端上,您只能为用户属性设置字符串值。对于使用数字运算符的条件,远程配置服务会将相应用户属性的值转换为整数/浮点数。
使用包含正则表达式运算符时,您可以创建RE2格式的正则表达式。您的正则表达式可以匹配全部或部分目标版本字符串。您还可以使用^$锚点来匹配目标字符串的开头、结尾或整个内容。
国家/地区不适用一个或多个国家或地区用于选择可能包含在实验中的用户。
语言不适用一种或多种语言和区域设置用于选择可能包含在实验中的用户。
先开多于
少于
之间
根据用户第一次打开您的应用程序的时间来定位用户,以天为单位指定。
上次应用互动多于
少于
之间
根据用户上次与您的应用互动的时间(以天为单位指定)来定位用户。

A/B 测试指标

创建实验时,您可以选择一个主要指标或目标指标,用于确定获胜变体。您还应该跟踪其他指标,以帮助您更好地了解每个实验变体的性能,并跟踪可能因每个变体而异的重要趋势,例如用户保留率、应用稳定性和应用内购买收入。您最多可以在实验中跟踪五个非目标指标。

例如,假设您已将新的应用内购买添加到您的应用中,并且想要比较两种不同的“微调”消息的有效性。在这种情况下,您可能决定选择将购买收入设置为您的目标指标,因为您希望获胜变体代表导致最高应用内购买收入的通知。并且因为您还想跟踪哪个变体导致了更多的未来转化和留存用户,您可以在要跟踪的其他指标中添加以下内容:

  • 估计总收入,以查看您的应用内购买和广告收入的总和在两种变体之间有何不同
  • Retention (1 day) , Retention (2-3 days) , Retention (4-7 days)以跟踪您的每日/每周用户保留

下表提供了有关如何计算目标指标和其他指标的详细信息。

目标指标

公制描述
无崩溃用户在实验期间 Firebase Crashlytics SDK 检测到的未在您的应用中遇到错误的用户百分比。
预计广告收入预计广告收入。
预计总收入合并购买价值和估计的广告收入。
采购收入所有purchasein_app_purchase事件的总价值。
保留(1 天)每天返回您的应用的用户数量。
保留(2-3 天)在 2-3 天内返回您的应用的用户数量。
保留(4-7 天)在 4-7 天内返回您的应用的用户数量。
保留(8-14 天)在 8-14 天内返回您的应用的用户数量。
保留(15 天以上)在上次使用您的应用 15 天或更长时间后返回您的应用的用户数量。
首先打开当用户在安装或重新安装应用程序后首次打开应用程序时触发的 Analytics 事件。用作转化漏斗的一部分。

其他指标

公制描述
notification_dismiss 通知当通知编辑器发送的通知被取消时触发的 Analytics 事件(仅限 Android)。
通知接收当应用程序处于后台时收到通知编辑器发送的通知时触发的 Analytics 事件(仅限 Android)。
操作系统更新跟踪设备操作系统何时更新到新版本的 Analytics 事件。要了解更多信息,请参阅自动收集的事件
屏幕视图跟踪在您的应用程序中查看的屏幕的 Analytics 事件。要了解更多信息,请参阅跟踪屏幕浏览量
session_start统计应用中用户会话的 Analytics 事件。要了解更多信息,请参阅自动收集的事件

BigQuery 数据导出

您可以在BigQuery中访问与 A/B 测试相关的所有分析数据。 BigQuery 允许您使用 BigQuery SQL 分析数据,将其导出到另一个云提供商,或将数据用于您的自定义 ML 模型。有关详细信息,请参阅将 BigQuery 链接到 Firebase

为充分利用 BigQuery 数据导出,Firebase 项目应采用“Blaze”即用即付定价计划。 BigQuery 对存储数据、流​​式插入和查询数据收费。加载和导出数据是免费的。有关详细信息,请参阅BigQuery 定价BigQuery 沙盒

首先,请确保您的 Firebase 项目已链接到 BigQuery。从左侧导航栏中选择设置 > 项目设置,然后选择集成 > BigQuery > 链接。此页面显示用于为项目中的所有应用程序执行 BiqQuery 分析数据导出的选项。

要查询实验的分析数据:

  1. 从您的活动实验列表中,选择所需的实验以打开实验结果页面。
  2. 实验概览窗格的上下文菜单中,选择查询实验数据(此选项不适用于免费层上的项目)。

    这将打开 BigQuery 控制台的查询编辑器,其中包含预加载的实验数据的自动生成示例查询以供您查看。在此查询中,您的实验被编码为用户属性,键中包含实验名称,值中包含实验变体。

  3. 在查询编辑器中,选择运行查询。结果显示在下方窗格中。

请注意,由于 BigQuery 中的 Firebase 数据每天仅更新一次,因此实验页面中可用的数据可能比 BigQuery 控制台中可用的数据更新。