什么是 Firebase Remote Config
Firebase Remote Config 是一项云服务,可以更改 APP 的响应,而无需用户更新 APP。使用 Remote Config 时,可以先创建默认值,通过 Firebase 控制台,可以修改其默认配置,整个过程对性能的影响微乎其微。
主要功能
- 向 APP 的用户群快速发布更改 可以通过更改服务器端参数值来更改 APP 的默认行为和外观。例如,您可以将功能标志设置为 Remote Config 参数,这样无需发布 APP 更新,就能更改 APP 的布局或颜色主题以配合季节性促销
- 为细分用户群量身打造应用 可以使用 Remote Config 按应用版本、语言、Google Analytics(分析)受众群体和导入的细分为 APP 的不同细分用户群提供不同的用户体验。
- 利用 Remote Config 个性化功能,针对各细分用户自动且持续地量身打造应用,并针对战略目标优化应用 利用机器学习技术,您可以使用 Remote Config 个性化功能持续地量身打造每位用户的体验,以针对用户互动度、广告点击次数和收入等目标或针对可通过 Google Analytics(分析)进行衡量的任何自定义事件优化您的应用
- 运行 A/B 测试以改进您的应用 您可以结合使用 A/B Testing 和适用于 Google Analytics(分析)的随机百分比定位功能,在不同的细分用户群中进行 A/B 测试,以改进您的应用。这样一来,您可以先验证改进,然后再将其推向整个用户群
工作原理
Remote Config 包括一个客户端库,通过在 Firebase 控制台,可以设置相关参数与条件,在适当的时机触发相关逻辑处理,维持良好的应用体验
建议向提取逻辑添加实时 Remote Config 功能,以便在有新的 Remote Config 参数值发布时立即自动提取这些最新的值。
Remote Config SDK 中提供了各种 get
方法去访问参数值。应用在获取服务器端值时所使用的逻辑与在获取应用内默认值时相同,因此无需编写大量代码
如需替换应用内默认值,您可以使用 Firebase 控制台或 Remote Config 后端 API 来创建与应用中使用的参数同名的参数。对于每个参数,您可以设置服务器端默认值来替换应用内默认值,也可以创建条件值来替换满足特定条件的应用实例的应用内默认值。
Remote Config 集成
- 关于iOS、Android、Flutter 等集成,详情可见
Remote Config 限制和政策
- 政策
- 不要使用 Remote Config 去获取用户授权
- 不要在 Remote Config 键值对中存储机密数据
- 不要使用 Remote Config 规避 APP 的平台的要求
- 限制
- 一个项目可拥有 2,000 个 Remote Config 参数
- 最多可存储 300 个版本的 Remote Config 模板,存储的任何模板的最长有效期为 90 天
- Remote Config 默认和建议的生产提取间隔为 12 小时,这意味着无论实际上调用了多少次提取方法,在 12 小时的时间段内最多从后端提取一次配置
Remote Config 用途
使用按百分比发布的机制发布新功能
使用 Remote Config 定制的新功能,可以采用灰度发布(百分比发布),逐步向用户发布,如果在这 10% 的用户群体中,新功能的稳定性令您满意,那么您可以将比例提高到 30%,再到 50%。最终,当您对新功能抱有充分信心时,就可提高到 100%
Snip20230918_33.png
根据首次使用应用的情况为用户提供定制体验
- 常见使用场景如下:
- 在用户使用 APP 时,提供不同的新手入门流程
- 在特定日期之后,向新用户公开激励措施或隐藏在功能标志或切换开关后的功能
- 为在特定时间段内加入的用户提供定制体验
示例: 10 月之前首次打开APP,送10个金币,在7月1号至10月1号之前,首次打开APP,送30个金币,发布之后俩组用户将收到不同的配置信息
Snip20230918_34.png
Remote Config 相关策略
参数和条件
- 设置应用内参数
在 Remote Config 对象中设置应用内默认参数值,以便应用在连接到 Remote Config 后端之前能够按预期运行,并且保证在后端中未设置任何值时可以使用默认值
- 配置 plist 文件步骤
Snip20230918_36.png
- 关于 plist 文件详情
Snip20230918_38.png
- 条件和条件值
条件用于逻辑判断。一般由一条或多条组成,当条件全部满足,条件值才是
true
,否则为false
示例:根据不同平台显示不同的文案- 配置条件内容
Snip20230918_39.png
- 保存预览效果
Snip20230918_40.png
- 参数值优先级
一个参数可能有多个与其关联的条件值。以下规则用于确定在某个特定时间点从 Remote Config 服务器提取哪个值
- 如果哪个条件值为
true
,则读取对应的值 - 如果多个条件均为
true
,则读取 Firebase 控制台显示的第一个 - 如果没有条件满足,则读取 Firebase 控制台设置的默认值
- 如果没有条件满足,且 Firebase 控制台没有设置默认值,则读不到任何参数
- APP 中,参数由 get 方法根据以下优先级列表返回
- 如果从后端获取到某个值,APP 则使用该值
- 可以直接使用应用内的默认值
- 如果没有设置默认值,则会获取静态类型值(例如,对于
int
,使用0
,对于boolean
,使用false
)
- 如果哪个条件值为
- 参数组
- 参数组的名称不得超过 256 个字符
- 每个参数只能属于一个组,且该参数要保持唯一
- 如果同时使用了 Firebase 控制台和 REST API ,请确保 REST API 逻辑为最新
Snip20230919_41.png
- 条件规则类型 Firebase 控制台支持以下规则类型。Remote Config REST API 中提供了等效功能。详情可见
- 搜索参数和条件
- 参数和条件限制 在 Firebase 项目中,最多可以有 2000个参数和500个条件。参数最多包含256个字符,且必须以下划线或英文开头,可以包含数字。一个项目所有参数和字符串总长度不能超过 100 万个字符
- 查看有关参数和条件的更改
- 可以查看上次修改参数或条件的用户姓名
- 可以查看发布的是记录
- 发布日期可以选择降序或升序
Snip20230919_43.png
- 搜索项目的参数键、参数值和条件
Snip20230919_44.png
Remote Config 模板和版本控制
- 在 Firebase 控制台,以图表形式显示版本发布
Snip20230919_45.png
- 模板版本管理
- 检索特定的 Remote Config 模板版本
- 回滚到指定版本
- 删除指定版本
Snip20230919_46.png
Firebase Remote Config 加载策略
- APP 启动时加载
在 APP 启动时,在调用
fetchAndActivate()
之后,便可开始通过调用addOnConfigUpdateListener
来实时监听参数值更新。因为实时参数更新,这种简单的方法非常适用于不会在界面中引起任何明显视觉变化的配置更改。当用户正在使用界面时,应避免在界面可能发生明显变化的情况下使用此策略 - 启动添加
loading
框 为了避免启动时加载的UI问题,调用fetchAndActivate()
之后添加loading
框,当收到回调或通知时取消loading
框 使用此策略,建议添加超时。对于 Remote Config,一分钟超时可能太长,无法为用户提供良好的应用启动体验。 - 为下次启动加载新值 本次打开检索下载的值,下次打开APP生效
- 避免使用的加载策略
- 切勿在用户查看界面或与界面进行交互时更新或切换界面
- 切勿同时发送大量提取请求,这可能导致服务器限制您的应用。如果您需要频繁提取更新,请使用实时 Remote
- 请勿依赖网络连接来获取 Remote Config 值。务必设置应用内默认参数值,确保应用始终按预期运行
实时传播 Remote Config 更新
与远程推送相结合
- 步骤
APP 订阅主题(以主题的形式给部分用户发送远程通知,如果需求不区分用户群,直接发全部用户的远程通知即可)
代码语言:javascript复制- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
NSLog(@"FCM registration token: %@", fcmToken);
NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"FCMToken" object:nil userInfo:dataDict];
NSString *str = @"主题名字";
[[FIRMessaging messaging] subscribeToTopic:str completion:^(NSError * _Nullable error) {
NSLog(@"订阅 %@ 主题成功了",str);
}];
}
给用户发送远程通知
服务器推送通知,携带信息中包含提示让用户更新 Remote Config 状态的信息
在客户端设置 Remote Config 状态
接收到推送通知后,设置本地现有 Remote Config 为旧版,请求更新新的 Remote Config 状态
APP 启动时获取 Remote Config 更新值
对于 - (void)fetchWithExpirationDuration:(NSTimeInterval)expirationDuration completionHandler:(FIRRemoteConfigFetchCompletion)completionHandler
该方法,需要参入 expirationDuration
,默认是12小时,如果设置为0,那么将实时返回 Firebase 控制台的信息,如果传入300(5分钟),那么在5分钟之后才可以请求到 Firebase 控制台的最新信息,5分钟之内都是之前的旧信息
- (void)fetchConfig {
long expirationDuration = 300; //当前设置为5分钟,开发可改为0
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"showInfo"]) {
expirationDuration = 0;
}
FIRRemoteConfigValue *config3 = [self.remoteConfig configValueForKey:@"config_title"];
NSLog(@"