0%

Firebase笔记(二)-Remote Config的简单使用

remoteconfig

Remote Config是什么?

远程配置(Remote Config)是Firebase的功能之一。开发者可以通过在云端配置键值对来更改APP的一些属性,例如行为和外观。这样的功能也可以通过产品迭代更新来进行变换,但是产品的迭代是一个漫长的过程,少说也要几天。RemoteConfig可以快速实现这一过程,首先在本地设置一个参数名A和一个参数值a,当该参数的值需要改变时,在云端赋予参数名A一个新值b,发布之后,用户在下次打开APP的时候就会发现这个参数的值已经由a变成了b,省去了迭代一个版本的时间。

在理解通过远程配置来更改APP属性之前,先要知道一个Remote Config对象有三种参数值:Default Config(默认配置)、Active Config(活动配置)和 Fetched Config(已获取的配置)。

Default Config是用来存储在本地配置参数的值,就是默认情况下的参数值a。
Fetched Config是最近一次从云端获取的值,之前的会被覆盖。Remote Config会在适当的情况下发起请求以获取云端配置的参数值b,此时获取到的b值并不会立刻赋给参数,而是保存在Fetched Config。
Active Config是存储参数可用的值或者说是活动的值,Remote Config对象会用过get方法获取其中的值并赋给本地参数。

现在整个远程配置的过程可以这样理解:在app的本地逻辑中设置一组键值对保存参数A和参数值a,Remote Config对象通过get<type>方法获取Active Config中的值并赋给相关变量,如果云端没有发布新的参数值,默认值a会传入Active Config中,如果在云端发布了参数值b,Remote Config对象会在适当的时候通过fetch方法获取b值并保存在Fetched Config中,随后调用activateFetched方法将参数值b传入Active Config并赋值给相关变量。这样就完成了远程配置的过程,这一过程会很迅速的完成,当然也可以手动控制请求变更的时间。可以参照下图进行理解:

api_use

关于RemoteConfig的更多介绍,也可以观看官方介绍视频

Remote Config使用条件

RemoteConfig这一功能可以在国内使用,只要设备满足了Google Play Services在9.6.1或更新,同时安装了Play Store即可使用。在虚拟机上也可正常使用,不过虚拟机反应速度不如真机快,过几分钟才会更新。

Remote Config的简单使用

下面通过示例熟悉一下RemoteConfig的基本功能。将APP链接到firebase后就可以通过RemoteConfig的可用库来使用远程配置功能了。

上一篇笔记记录了将Firebase整合到APP的相关知识

打开已链接了Firebase的项目,在app/build.gradle文件中新增firebase-config依赖:

1
2
3
4
5
6
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
...
compile 'com.google.firebase:firebase-core:9.6.1'
compile 'com.google.firebase:firebase-config:9.6.1'
}

上面的操作已经实现了将RemoteConfig加入到应用中来,加完记得Sync Now。之后在布局文件中放置一个Button和一个TextView:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_firebase"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.pudding.firebaselearn.FirebaseActivity">

<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Checking your text..."
android:textSize="20sp" />

<Button
android:text="@string/fetch_button_text"
android:id="@+id/fetch_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="18dp" />
</LinearLayout>

然后完成逻辑代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
public class FirebaseActivity extends AppCompatActivity {

//申明参数
private static final String DEFAULT_TEXT_CONFIG_KEY = "default_text";
private static final String LOADING_TEXT_CONFIG_KEY = "loading_text";
private static final String PROMOTION_CONFIG_KEY = "is_promotion_on";
private static final String UPDATE_TEXT_CONFIG_KEY = "update_text";

private FirebaseRemoteConfig mFirebaseRemoteConfig;
private TextView mTextView;
private Button mFetchButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_firebase);

mTextView = (TextView) findViewById(R.id.text_view);

mFetchButton = (Button) findViewById(R.id.fetch_button);
mFetchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fetchConfig();
}
});

//获取Remote Config 实例
mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();

//设置Remote Config Settings为开发者模式
//正常情况下每小时只能抓取5次在远程配置的参数值值,设置为开发者模式后可
//以抓取更多次数,便于在开发过程中进行调试
FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
.setDeveloperModeEnabled(BuildConfig.DEBUG)
.build();
mFirebaseRemoteConfig.setConfigSettings(configSettings);

//设置默认的Remote Config value.app中默认使用的参数值(default value)
//当需要对这些值进行调整时,可以在远程控制面板发布新的值(update value)到服务器
//当app抓取到远程配置的值之后,下次打开app时,对应的参数值就会使用update value
mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);

//抓取远程配置的参数值
fetchConfig();
}

//从服务器端抓取参数值
private void fetchConfig() {
mTextView.setText(mFirebaseRemoteConfig.getString(LOADING_TEXT_CONFIG_KEY));

//设置自动抓取远程参数值的时间间隔,默认是43200s(12小时)
long cacheExpiration = 3600;

//在开发者模式下将cacheExpiration设置为0,每次请求都能抓取到远程参数值
if (mFirebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
cacheExpiration = 0;
}

mFirebaseRemoteConfig.fetch(cacheExpiration)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {

//检测是否成功抓取到远程参数值
if (task.isSuccessful()) {
Toast.makeText(FirebaseActivity.this, "Fetch Succeed", Toast.LENGTH_SHORT).show();

//激活抓取的远程参数值
mFirebaseRemoteConfig.activateFetched();
} else {
Toast.makeText(FirebaseActivity.this, "Fetch Failed", Toast.LENGTH_SHORT).show();
}

displayText();
}
});
}

//如果存在远程参数值,显示远程参数值,否则显示默认值
private void displayText() {
//默认值
String initialText = mFirebaseRemoteConfig.getString(DEFAULT_TEXT_CONFIG_KEY);
if (mFirebaseRemoteConfig.getBoolean(PROMOTION_CONFIG_KEY)) {

//获得远程参数值
String finalText = mFirebaseRemoteConfig.getString(UPDATE_TEXT_CONFIG_KEY);

mTextView.setText(finalText);
} else {
mTextView.setText(initialText);
}
}
}

新建一个xml资源文件保存default value(也可以选择使用Map对象):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<defaultsMap>
<entry>
<key>default_text</key>
<value>Hello World!</value>
</entry>
<entry>
<key>loading_text</key>
<value>Checking your text...</value>
</entry>
<entry>
<key>is_promotion_on</key>
<value>false</value>
</entry>
<entry>
<key>update_text</key>
<value>There is no update</value>
</entry>
</defaultsMap>

运行效果如下,当远程控制面板没发布更新时,会使用xml资源文件中的默认参数值:

default_value

当在远程控制面板发布更新后,点击Fetch Remote Config,会获取云端的更新。

远程配置:

remote-parameter

更新效果:

fetch_succeed

RemoteConfig的条件控制

设置远程参数改变移动端的数据只是RemoteConfig最基本的功能,再高级和人性化一点的就是条件控制功能了。根据条件的选择,你可以指定特定的群体享受怎么样的改变,真正实现用户的VIP体验。

由于这项功能需要一定的用户量为基础,所以先记录下使用的情况:

create-conditions

在仪表板点击相应的参数或者新建参数时,右上角都会有一个添加条件的值,点击之后可以给各个参数定义不同的条件,只有才满足这个条件的情况下才能获取云端相应的值。

china

像上图新建了一个名为china的条件(名称只能用英文),限定国家为中国,也可以添加其需要同时满足的条件,点击后面的且就行了。那个颜色块是用于分类管理条件的,相似的条件可以用相同的颜色,便于分类。另外再新建一个条件限定国家为美国。

conditions

新建好条件之后为条件添加相应的参数值。如图,就是说在中国地区就显示”你好!中国”,在买过就显示”Hello America!”,默认也就是不满足中国和美国的国家就显示”Hello Remote Config”。新建的条件会按从上往下的优先级进行匹配,如果匹配到第一个条件则不会再去匹配下面的条件,直接按照第一个条件的值进行更新,否则再向下匹配,知道有匹配的为止。当然,我们可以手动修改条件的优先级:

change-conditions

可以看到,图片左上角多了一个选项卡,新建了条件之后,就会多出一个CONDITIONS选项卡,我们可以在这里修改条件的优先级,还能对条件进行二次编辑。

以上就是RemoteConfig的基本功能的使用,通过手动获取云端更新,也可以结合Activity的生命周期,实现后台自动更新,RemoteConfig的云端配置更新占用的资源可忽略不计,在真机上能快速反应出云端的数据,当然也需要网速支持。


文章属原创,欢迎转载,但请务必保留原文链接!