
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并赋值给相关变量。这样就完成了远程配置的过程,这一过程会很迅速的完成,当然也可以手动控制请求变更的时间。可以参照下图进行理解:

关于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(); } });
mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder() .setDeveloperModeEnabled(BuildConfig.DEBUG) .build(); mFirebaseRemoteConfig.setConfigSettings(configSettings);
mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);
fetchConfig(); }
private void fetchConfig() { mTextView.setText(mFirebaseRemoteConfig.getString(LOADING_TEXT_CONFIG_KEY));
long cacheExpiration = 3600;
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资源文件中的默认参数值:

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

更新效果:

RemoteConfig的条件控制
设置远程参数改变移动端的数据只是RemoteConfig最基本的功能,再高级和人性化一点的就是条件控制功能了。根据条件的选择,你可以指定特定的群体享受怎么样的改变,真正实现用户的VIP体验。
由于这项功能需要一定的用户量为基础,所以先记录下使用的情况:

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

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

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

可以看到,图片左上角多了一个选项卡,新建了条件之后,就会多出一个CONDITIONS选项卡,我们可以在这里修改条件的优先级,还能对条件进行二次编辑。
以上就是RemoteConfig的基本功能的使用,通过手动获取云端更新,也可以结合Activity的生命周期,实现后台自动更新,RemoteConfig的云端配置更新占用的资源可忽略不计,在真机上能快速反应出云端的数据,当然也需要网速支持。
文章属原创,欢迎转载,但请务必保留原文链接!