Firebase Remote Config 是一项云服务,可以更改 APP 的响应,而无需用户更新 APP。使用 Remote Config 时,可以先创建默认值,通过 Firebase 控制台,可以修改其默认配置,整个过程对性能的影响微乎其微。
Remote Config 包括一个客户端库,通过在 Firebase 控制台,可以设置相关参数与条件,在适当的时机触发相关逻辑处理,维持良好的应用体验
建议向提取逻辑添加实时 Remote Config 功能,以便在有新的 Remote Config 参数值发布时立即自动提取这些最新的值。
Remote Config SDK 中提供了各种 get
方法去访问参数值。应用在获取服务器端值时所使用的逻辑与在获取应用内默认值时相同,因此无需编写大量代码
如需替换应用内默认值,您可以使用 Firebase 控制台或 Remote Config 后端 API 来创建与应用中使用的参数同名的参数。对于每个参数,您可以设置服务器端默认值来替换应用内默认值,也可以创建条件值来替换满足特定条件的应用实例的应用内默认值。
使用 Remote Config 定制的新功能,可以采用灰度发布(百分比发布),逐步向用户发布,如果在这 10% 的用户群体中,新功能的稳定性令您满意,那么您可以将比例提高到 30%,再到 50%。最终,当您对新功能抱有充分信心时,就可提高到 100%
Snip20230918_33.png
示例: 10 月之前首次打开APP,送10个金币,在7月1号至10月1号之前,首次打开APP,送30个金币,发布之后俩组用户将收到不同的配置信息
Snip20230918_34.png
Snip20230918_36.png
Snip20230918_38.png
true
,否则为 false
示例:根据不同平台显示不同的文案
Snip20230918_39.png
Snip20230918_40.png
true
,则读取对应的值true
,则读取 Firebase 控制台显示的第一个int
,使用 0
,对于 boolean
,使用 false
)Snip20230919_41.png
Snip20230919_43.png
Snip20230919_44.png
Snip20230919_45.png
Snip20230919_46.png
fetchAndActivate()
之后,便可开始通过调用 addOnConfigUpdateListener
来实时监听参数值更新。因为实时参数更新,这种简单的方法非常适用于不会在界面中引起任何明显视觉变化的配置更改。当用户正在使用界面时,应避免在界面可能发生明显变化的情况下使用此策略
loading
框
为了避免启动时加载的UI问题,调用 fetchAndActivate()
之后添加 loading
框,当收到回调或通知时取消 loading
框
使用此策略,建议添加超时。对于 Remote Config,一分钟超时可能太长,无法为用户提供良好的应用启动体验。
与远程推送相结合
APP 订阅主题(以主题的形式给部分用户发送远程通知,如果需求不区分用户群,直接发全部用户的远程通知即可)
- (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(@"🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻--%@",config3.stringValue);
__weak typeof(self) weakSelf = self;
//默认12小时只能访问一次
[self.remoteConfig fetchWithExpirationDuration:expirationDuration completionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) {
if (status == FIRRemoteConfigFetchStatusSuccess) {
FIRRemoteConfigValue *config4 = [self.remoteConfig configValueForKey:@"config_title"];
NSLog(@"🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻--%@",config4.stringValue);
NSLog(@"🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻--获取配置成功(获取未激活)");
// 只有调用这个方法,才能获取服务器的值
[weakSelf.remoteConfig activateWithCompletion:^(BOOL changed, NSError * _Nullable error) {
if (error != nil) {
NSLog(@"🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻 -- %@", error.localizedDescription);
}else{
NSLog(@"🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻--获取数据成功(获取已激活)");
FIRRemoteConfigValue *config5 = [self.remoteConfig configValueForKey:@"config_title"];
NSLog(@"🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻--%@",config5.stringValue);
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"showInfo"];
}
}];
} else {
NSLog(@"🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻🏊🏻--获取配置失败(获取未激活)-- %@", error.localizedDescription);
}
}];
}
Snip20230920_47.png
除了 Firebase 控制台可以控制使用,也可以通过 Remote Config REST API 或 Admin SDK,用我们自己的后端控制 Remote Config,详情可见
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=139afv05e38g