基于Firebase平台开发(七) —— iOS的A/B Test(一)

版本记录

版本号 时间
V1.0 2021.04.03 星期六

前言

Firebase是一家实时后端数据库创业公司,它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月Google收购Firebase以来,用户可以在更方便地使用Firebase的同时,结合Google的云服务。Firebase能让你的App从零到一。也就是说它可以帮助手机以及网页应用的开发者轻松构建App。通过Firebase背后负载的框架就可以简单地开发一个App,无需服务器以及基础设施。接下来几篇我们就一起看一下基于Firebase平台的开发。感兴趣的看下面几篇文章。
1. 基于Firebase平台开发(一) —— 基于ML Kit的iOS图片中文字的识别(一)
2. 基于Firebase平台开发(二) —— 基于ML Kit的iOS图片中文字的识别(二)
3. 基于Firebase平台开发(三) —— Firebase基本使用简介(一)
4. 基于Firebase平台开发(四) —— Firebase基本使用简介(二)
5. 基于Firebase平台开发(五) —— Firebase基本使用简介(三)
6. 基于Firebase平台开发(六) —— 基于Firebase Analytics的App使用率的跟踪(一)

开始

首先我们看下写作内容:

iOS A / B测试是测试iOS应用中用户体验的有效方法。 了解Firebase如何使运行实验和查看结果变得容易。内容来自翻译

接着看下写作环境:

Swift 5, iOS 14, Xcode 12

下面就是正文啦。

我们都听说过有关某个开发人员如何更改按钮标签或欢迎屏幕流程的故事,突然发现他们的保留率或应用程序内购买率猛增了一些。

也许您的待办事项清单包含“experiment with my purchase button”项仍在等待检查中,因为您发现正确运行这些实验是一项繁重的工作。

Firebase Remote Config Tutorial for iOS教程向您展示了如何使用远程配置即时更新应用程序的某些部分,以及如何向特定国家/地区的用户提供自定义内容。

本后续教程将通过试验不同的值并查看结果以找出哪个值更有效,来探索如何使用Firebase Remote Config进行A / B测试。

先决条件:本教程旨在遵循 Firebase Remote Config Tutorial for iOS。也就是说,如果您已经熟悉Firebase Remote Config并曾经使用过它,则可能无需完成第一个教程就可以跳入该教程。

即使您具有以前的Remote Config教程中的项目,也最好从新的启动程序项目开始,因为它使用最新的Firebase版本。必需的库已作为Swift Package Manager的软件包添加,并且在第一次打开项目时可能需要一些时间来加载。

注意:在撰写本文时,Firebase支持通过Beta中的SwiftPM进行安装。存在一些已知问题,如果尝试在设备上运行该应用程序,则可能会出错。如果您这样做,请参考this workaround来修复它。

1. Creating a Firebase Project

如果您已经使用Google Analytics(分析)为之前的Remote Config教程创建了一个项目,则可以跳过此部分。如果没有,请按照以下说明创建您的项目:

  • 1) 前往https://console.firebase.google.com
  • 2) 如果这是您的第一个项目,请单击Create a project。否则,请单击Add project
  • 3) 将您的项目命名为Planet Tour,然后单击Continue
  • 4) 将Google Analytics(分析)添加到您的项目中(默认情况下处于打开状态),然后单击Continue
  • 5) 选择您的地区,阅读并接受使用条款。 然后单击Create project

接下来,将iOS应用添加到项目中。 单击iOS按钮,然后按照以下说明进行操作:

  • 1) 添加项目的bundle ID —— com.raywenderlich.PlanetTour —— 给它一个有趣的昵称,将App Store ID字段留空,然后单击Register app
  • 2) 下载GoogleServices-info.plist文件,然后单击Next
  • 3) 在Xcode中打开PlanetTour.xcodeproj,然后将下载的GoogleServices-info.plist文件拖到Planet Tour项目中(如果需要,请选择Copy Items if Needed)。
  • 4) 返回浏览器,转到Firebase控制台。 单击下一步按钮,完成接下来的几个步骤(数字3和4)。
  • 5) 在第5步上按Continue to the console

构建并运行您的应用程序。 您应该会看到我们太阳系的美丽之旅。 单击一些行星以查看有关它们的详细信息:

如果您不熟悉该项目,请查看RCValues.swift以了解如何在项目中使用Remote Config。 然后,返回主屏幕并查看底部的横幅,该横幅中的应用程序要求您注册newsletter

单击“Get our newsletter!”。 现在,您将要通过一些A / B测试来优化此屏幕。


An Introduction to iOS A/B Testing

Planet Tour Inc.的高层担心,没有足够的人订阅Planet Tour newsletter。 毕竟,如果您无法通过电子邮件向人们发送有关激动人心的Planet Tour新优惠的信息,那么如何建立成功的业务呢?

Any way we can make this Subscribe button more enticing?

市场营销人员有一个理论。如果将Subscribe按钮的标签更改为Continue,则可能会获得更多订阅者。在阅读时,也许您应该尝试将横幅文本从Get our newsletter更改为Get more facts

现在,您的应用程序已从Remote Config获取其数据,因此可以轻松进行这些更改。在Firebase控制台中发布这些新值仅需花费几秒钟的时间。然后,一周后,您可以查看是否有更多的新闻通讯订阅者。简单吧?

如果您无法将更改与newsletter sign-up的更改区分开,则可能会得出错误的结论。

理想情况下,您希望同时发布两个版本的应用程序。 一组随机用户可以看到新的新闻标签,另一组用户可以看到当前的新闻标签。 只要这两个组没有偏差,就可以比较它们之间的结果。 每个组中的用户越多,您越有信心将差异归因于您所做的更改,而不是某些外部因素。

嗯,这就是A / B测试,这是进行此类实验的常用方法。许多大型公司已经建立了自己的基础架构来运行和衡量这些测试。您可以使用Firebase Remote Config随附的便捷工具加入这些较大的公司。


Adding Analytics to Your App

创建A / B测试的主要步骤之一就是告诉Firebase实验目标。有时,这可能是一个高层目标,例如增加保留率(几天后有多少用户返回)或用户参与度(每天用户在应用上花费了多少时间)。但有时,这可能是一个特定的目标,例如增加访问您的应用内商店的用户数量。或者,在这种情况下,增加了注册Planet Tour newsletter的用户数量。

当然,Firebase知道用户是否已注册newsletter的唯一方法是告诉您。为此,您将使用Firebase Analytics。因此,在开始在您的应用中创建A / B测试之前,您应该在应用中添加一些分析数据,以便为您制定一些目标。

注意:有关Firebase Analytics的更多信息,请查看Firebase Analytics: Getting Started

1. Adding Events

与大多数其他移动分析解决方案一样,Firebase Analytics也使用基于事件的模型。 当用户在您的应用中执行操作时,Firebase Analytics会将事件发送到其服务器。 稍后,这些服务器将处理这些事件,并将其转变为有意义的图形,供您分析。

打开ContainerViewController.swift。 将以下内容添加到文件的顶部:

import Firebase

接下来,将以下内容添加到viewDidLoad()的末尾:

Analytics.logEvent("mainPageLoaded", parameters: nil)

当您的用户首次启动应用程序并将其发送到主屏幕时,这将发送一个名为mainPageLoaded的事件。parameters参数是与此事件关联的键/值对的可选字典。 您此处不需要任何内容,因此请保留为nil

接下来,打开GetNewsletterViewController.swift。 将以下内容添加到文件的顶部:

import Firebase

将以下内容添加到viewDidLoad()的末尾:

Analytics.logEvent("newsletterPageLoaded", parameters: nil)

最后,将以下内容添加到submitButtonWasPressed(_ :)的末尾:

Analytics.logEvent("newsletterSubscribed", parameters: nil)

现在,当用户首次访问主页或新闻稿页面以及单击Submit按钮注册newsletter时,您的应用程序将触发不同的分析事件。

2. Enabling Debug View

在构建和运行之前,您需要打开Firebase Analytics调试模式,该模式可让您在控制台中查看所有这些Analytics(分析)调用的结果。

为此,选择Product ▸ Scheme ▸ Edit Scheme。 在Run scheme中,选择Arguments。 在Arguments Passed On Launch中,单击+符号,然后输入参数-FIRAnalyticsDebugEnabled。 确保在开始处包含破折号。

完成后,您应该会看到以下内容:

关闭对话框,然后构建并运行。 现在,您将在控制台中看到更多输出。 文本如下:

[Firebase/Analytics][I-ACS023051] Logging event: origin, name, params: app, mainPageLoaded, {
    firebase_event_origin (_o) = app;
    firebase_screen_class (_sc) = WaitingViewController;
    firebase_screen_id (_si) = 5917351895999520221;
}

如果您无法手动找到控制台,则可以单击控制台并按Command-F,然后在搜索框中输入mainPageLoaded进行查找。

当您点击Get our newsletter!(或Get more facts!),该应用程序还将将此内容记录到您的控制台中:

[Firebase/Analytics][I-ACS023051] Logging event: origin, name, params: app, newsletterPageLoaded, {
    firebase_event_origin (_o) = app;
    firebase_screen_class (_sc) = ContainerViewController;
    firebase_screen_id (_si) = 5917351895999520222;
}

当您点击Subscribe时,它将记录一个类似的事件。

通过转到Firebase控制台的Debug View部分,您还应该能够几乎实时地看到这些结果。 这将使您知道Firebase从启用了调试模式的设备收到的任何事件。 这些不仅包括您添加的事件,还包括Firebase为您测量的其他事件,例如screen_viewuser_engagement

3. Debug Mode Considerations

由于您已打开调试模式,因此Firebase Analytics在向其服务器发送数据方面非常积极。当其拥有的数据超过10秒时,或者当您的应用移至后台时,它都会发送一批数据。在正式版(production)应用中,这种行为可能会耗尽手机的电池寿命。因此,当您未打开调试模式时,Firebase Analytics会在其数据使用时间超过一个小时或您的应用进入后台时发送数据。

顺便说一句,此debug设置确实存在。因此,如果您想关闭Analytics debug调试模式(例如,要对应用程序的电池性能进行压力测试),则可以禁用该标志,然后删除并重新安装该应用程序,或者通过更改该标志为-noFIRAnalyticsDebugEnabled显式关闭调试模式。

注意:在撰写本教程时,您创建的事件大约需要24小时才能传到A / B测试系统。您无需等待那么长时间即可继续学习本教程。但是请记住,您可能需要选择与这些事件之一不同的目标。

注意:在RCValues.swift中,您设置了minimumFetchInterval = 0,因此Firebase不会限制更新。但是有时,尤其是对于一个新项目,您仍然会受到限制。如果发生这种情况,请等待一个小时或重置模拟器,然后重试。


Creating Your First A/B Test

转到Firebase控制台的A/B Testing部分。 如果系统提示您选择一个项目,请选择您创建的Planet Tour项目。 点击Create experiment

选择Remote Config以使用远程配置服务器端配置参数创建具有应用程序行为的实验:

您会看到一个用于创建新实验的表格。前几个Field应该很容易填写。给您的实验起一个名称,例如Newsletter sign-ups以及所需的任何描述,然后单击Next

注意:您会在此处看到一条注释,说明Firebase A / B测试最多可以持续90天。值得一提的是,在这段时间之后,如果您想继续收集数据,则需要开始一个新的A / B测试。

1. Defining Targeting

对于Targeting,请确保您从下拉列表中选择您的iOS应用(完整面板请参见下文)。您没有Android应用程序,但是即使您安装了Android应用程序,也有必要在不同平台上分别进行试验,因为您的应用程序(或用户)在不同平台上的行为可能会大不相同。

因为您正在尝试使用text label,所以将实验范围限制在说英语的用户是很有意义的。单击and按钮,选择Languages,然后从第二个下拉列表中选择English

最后,您可以决定要投入此实验的用户百分比。参与您的实验的用户越多,您对结果的信心就越大。但是,如果您尝试的某些冒险活动可能激怒您的社区或使您的应用内经济陷入混乱,那么将这类人群保持在较小水平可能是有道理的。

因为您的更改看起来很安全,所以您可能可以负担得起增加此百分比。开始时30似乎是一个很好的百分比。

完成后,实验面板的第一部分应如下所示:

2. Defining Goals

单击Next转到Goals部分。 这就是您想要在您的应用程序中实现最大化的东西。 就您而言,您希望增加之前创建的newsletterSubscribed事件的发生。

假设已经过去了足够的时间使您在上一节中创建的事件已进入A / B测试系统,则您应该在下拉列表中看到newsletterSubscribed作为您的目标之一列出。 如果有,请选择它。 如果尚不存在,请创建它:

Firebase已经包含了一些其他次要目标以及主要目标。这些额外的目标有助于获得实验的“全景”视图。它们有助于确保您不会意外地损害您的保留率,因为您过于专注于newsletter订阅。

3. Defining Variants

单击Next移至Variants部分。在这里,您将为实验中的不同人员分配不同的Remote Config值。

首先尝试在主屏幕底部的小横幅中显示不同的文本变体。此值由Remote Config变量subscriptionBannerButton设置。

单击Choose or create new。如果您在以前的 Firebase Remote Config Tutorial for iOS中使用了此应用程序,则可能会在下拉列表中看到这些参数的名称。如果您不必使用它们,也可以创建新的!因此,输入subscribeBannerButton并选择Create parameter选项:

现在,您可以选择为实验中的不同变体添加不同的subscriptionBannerButton值。

对于您的control group,将此值保留为(empty string)的默认值。 如果用户不在您的实验中,这将告诉Remote Config使用它将使用的任何值。 对于您而言,这将是Get our newsletter!的默认值! 如RCValues.swift中的设置。 通常,最好将控制组值设置为(empty string)。 这是将更改与应用程序中当前运行的内容进行比较的最佳方法。

对于下一个变体,将subscribeBannerButton的值设置为Get more facts!

您的面板现在应如下所示:

您还将要尝试使用GetNewsletterViewController中显示的按钮 —— 这是名为subscriptionVCButton的参数。 单击Choose or create new,然后使用该名称创建一个新参数。

4. Clarifying the Cause of a Change

您可以像这样在Variant A中进行此更改:

更好的选择是尝试几种变体中的所有不同组合。 这项技术称为multi-variant testing,现在您将执行一个简单的版本。 将Variant A中的subscriptionVCButton设置为(empty string)

单击Add Variant,这一次,将subscribeBannerButton设置为默认值,并将subscribeVCButton的值设置为Continue。 然后,再次单击Add Variant,并给subscribeBannerButton赋予Get more facts!的值,并将subscribeVCButton的值设置为Continue

现在,您的实验面板应如下所示:

您已经成功添加了三个variants。 两个变量分别单独更改两个变量,而一个变量同时更改两个变量。 您也可以在此处创建其他变体来测试其他字符串!

创建实验已完成! 单击Review


Testing Your Experiment

您可能想在将实验推向世界之前对其进行测试。 幸运的是,Firebase使得在单个设备上尝试所有实验变型变得容易。 为此,您将需要您的Instance ID token,这是分配给您应用的每个实例的唯一标识符。

要获取它,请返回Xcode中的Planet Tour并打开AppDelegate.swift。 然后,在对FirebaseApp.configure()的调用之后添加以下内容:

Installations.installations().authToken { result, _ in
  print("Your instance ID token is \(result?.authToken ?? "n/a")")
}

构建并运行您的应用程序。 您应该在Xcode控制台的某处看到类似以下内容的行:

返回Firebase Console控制台中的实验,然后单击Start experiment按钮旁边的Menu按钮。 然后,单击Manage test devices

在出现的对话框中,从Xcode控制台复制并粘贴大instance ID token字符串。 然后,从下拉列表中选择一个变量 —— 我喜欢尝试variant C,因为您可以一次测试两个更改:

单击Add。 然后,单击Save

退出并重新启动您的应用程序。 由于您的应用程序明确将Remote Config缓存时间设置为零(如果您需要对此进行刷新,请参阅以前的Firebase Remote Config Tutorial for iOS),因此您应该立即看到新值:

也可以尝试其他variations。 只需重新访问Manage test devices对话框,从下拉列表中选择其他变量,然后单击Save,重新启动应用程序后,您应该在测试设备(或模拟器)上看到该变量。


Launching an Experiment

测试完所有变量后,您对每种变量在测试设备上的外观感到满意后,就可以开始进行真实的实验了。 返回Firebase A / B测试控制台,单击Start Experiment,然后单击Start

此时,将随机选择30%的说英语的观众使用您的四种不同变量之一。 A / B测试将衡量他们的进度,记下其中有多少人达到了订阅newsletter的最终目标,并最终告诉您哪种变量可以最好地指导您的用户实现该目标。


Understanding Your Experiment Results

Firebase A / B测试不仅告诉您哪个变量的user subscribed to newsletter率最高。 它还使用一些称为贝叶斯统计的奇特数学来告知您这些差异是否是由于您对应用程序所做的更改而不是随机机会造成的。 这就是人们通常使用statistically significant的意思。

为了使此数学有效,Firebase需要在相当多的用户上尝试这些不同的变量。 尽管Planet Tour是一款可爱的应用程序,但它仍然是一个测试应用程序,用户总数为1。 这意味着,在本教程中,Firebase A / B测试不会收集足够的数据以给您任何有意义的结果,并且可能会留下一个类似以下的屏幕:

这是一个通过真实的实时应用完成的实验示例,它带来了明显的改善:

这里有很多统计数据,但是这里有一些重要的统计数据:

顶部的巨大标签为您提供了实验的执行摘要。 在这种情况下,它告诉您名为Guidebot and group的变体,并且组将基线提高了8%。 请注意,您的变量被无聊地命名为Variant A, Variant B and Variant C,但是,您可以根据需要实际重命名它们,以便为其命名。

在其下方,您将看到一个图表,比较了每个变量随时间变化的效果:

再往下看,您将看到每个变量与您的对照组的比较情况,作为您要衡量的每个目标的总体改进范围:

例如:

  • Modeled data下,您可以看到它预测Guidebot and group在提高保留率方面的表现将比对照组高0.3%16.6%。 由于这肯定是一种改善,因此以绿色显示并带有向上箭头。
  • Observed data可测量实验的更多原始数据。 在这种情况下,您可以看到Guidebot and group保留了1,145个用户,而对照组仅保留了1,064个用户。

Rolling Out an Experiment

根据实验的结果,您可能需要采用其中一种变量,然后将其推送给应用程序的所有用户。 如果您的实验有明确的获胜者,您应该会看到一个按钮,显示Roll out variant

单击此按钮将停止实验,并为您提供一个对话框,该对话框允许您将获胜变量中的所有变量作为每个人的新默认值发布到Remote Config中。 就像这样,您的new newsletter选项已向全世界公开!

您可以使用Firebase AnalyticsRemote Config进行更多操作,您随时可以阅读文档以了解更多信息。

后记

本篇主要讲述了iOSA/B Test,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容