获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

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

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

  7. 变体部分中,在输入消息文本字段中键入要发送到基线组的消息。要不向基准组发送消息,请将此字段留空。

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

  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)"
      }
    }
    

    Objective-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. 要更改您的实验,请点击Edit
  5. 要开始您的实验,请点击Start Experiment 。每个项目一次最多可以运行 24 个实验。

监控实验

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

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

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

向所有用户推出实验

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

  1. Firebase 控制台导航栏的参与部分,点击A/B 测试
  2. 单击CompletedRunning ,单击要向所有用户推出的实验,单击上下文菜单 ( ),然后单击Roll out variant
  3. 通过执行以下操作之一向所有用户推出您的实验:

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

展开实验

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

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

复制或停止实验

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

用户定位

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

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

当使用任何contains不包含完全匹配运算符时,您可以提供以逗号分隔的值列表。

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

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

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

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

A/B 测试指标

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

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

  • 估算总收入,以了解您的应用内购买和广告收入在两种变体之间的差异
  • 留存(1 天)留存(2-3 天)留存(4-7 天)以跟踪您的每日/每周用户留存

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

目标指标

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

其他指标

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

BigQuery 数据导出

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

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

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

要查询实验的分析数据:

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

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

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

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