46

我正在尝试使用 Firebase 的新远程配置功能来获得远程配置参数,但我遇到了问题。

这是我的远程配置控制台:远程配置控制台

我正在我的应用程序中进行获取和更新onCreate()

final FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();
remoteConfig.fetch().addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            remoteConfig.activateFetched();
        }
    }
});

这就是我的阅读方式:

FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();
String value = remoteConfig.getString("active_subscriptions");

值返回 null。

如果我调用remoteConfig.getInfo().getLastFetchStatus(),它会返回LAST_FETCH_STATUS_SUCCESS,因此似乎获取成功。

知道为什么我的值为空白吗?

4

10 回答 10

19

找到解决方法!见下文

我遇到了“静默完成”的事情——我称之为“获取”,但 onComplete、onSuccess 或 onFailure 侦听器永远不会触发。我尝试将它移动到一个活动 onCreate,但仍然没有发生任何事情,因此,配置项永远不会从服务器加载。我启用了开发人员模式,并且正在调用缓存值为 0 的 fetch。

我能够(曾经)在“public void onComplete(@NonNull Task task){”行上放置一个断点,它被击中,然后我能够单步执行并触发 onComplete。然后我无法以任何其他方式重现相同的结果,包括第二次做同样的事情(我认为)。

似乎是时间或并发问题,但这没有什么意义,因为这是一个异步调用。

解决方法

如果您从 Activity#onResume(或者,我认为是 Activity#onStart)中获取,它会完美运行。从 Activity#onCreate 或 Application#onCreate 调用 fetch 会导致看似从未处理过的调用,实际上,在 fetch 开始后,应用程序的性能会明显下降,所以我认为有一个循环器正在运行或其他什么。*

解决方法 #2

如果您真的希望它从 Application#onCreate (我这样做)运行,这似乎也可以:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        // Run mFirebaseRemoteConfig.fetch(timeout) here, and it works
    }
}, 0);
于 2016-05-22T15:42:09.937 回答
18

您可能会遇到远程配置中的缓存。它的工作方式是 Config 将在本地缓存传入的项目,并返回它们。因此,您的最后(缓存)获取状态可能是在定义值之前,我们得到一个缓存的空白值。

您可以控制缓存过期时间,但如果您过于频繁地获取缓存,则可能会受到限制。

因为这是一个常见的开发问题,所以有一个开发者模式可以让您更快地请求(对于小用户组):

FirebaseRemoteConfigSettings configSettings = 
    new FirebaseRemoteConfigSettings.Builder()
        .setDeveloperModeEnabled(BuildConfig.DEBUG)
        .build();
FirebaseRemoteConfig.getInstance().setConfigSettings(configSettings);

当你打电话时,fetch你可以通过一个短的缓存过期时间

long cacheExpiration = 3600;
FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
if (mFirebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
     cacheExpiration = 0;
}
mFirebaseRemoteConfig.fetch(cacheExpiration)
     .addOnCompleteListener(new OnCompleteListener<Void>() {
     // ...
});

如果您想要完整的参考,这就是它在快速入门示例中的完成方式。

于 2016-05-18T23:58:45.743 回答
11

发现了问题。

添加一些日志记录后,我发现onComplete()从未调用过 fetch 作业。我将 fetch 从我的应用程序onCreate移到了一个片段,现在它可以正常工作了!

Ian Barber,这可能是需要调查或澄清的事情,因为日志表明 Firebase 在应用程序中初始化时没有出现问题,并且获取是静默失败。)

于 2016-05-21T13:51:21.807 回答
8

我也遇到了这个问题。原来我没有在 Firebase 控制台中看到“发布”按钮。:facepalm:

于 2019-02-04T17:15:22.640 回答
5

我遇到了同样的问题,在我的情况下没有任何解决方法有帮助。问题出在测试设备上。我在没有安装谷歌移动服务的情况下使用了模拟器,因此没有触发 Complete 事件。我用 GMS 尝试了我的手机,一切都很好。祝你好运。

于 2016-10-23T16:01:57.447 回答
2

我使用了类似@Ian Barber 的代码(副本):

FirebaseRemoteConfigSettings configSettings = 
    new FirebaseRemoteConfigSettings.Builder()
        .setDeveloperModeEnabled(BuildConfig.DEBUG)
        .build();
FirebaseRemoteConfig.getInstance().setConfigSettings(configSettings);

我的问题是"BuildConfig.DEBUG",它返回 false。所以它在缓存中取值 1h 直到它被再次获取!

于 2016-06-28T10:53:05.760 回答
2

在这种情况下,第一件事是检查您是否具有正确的 firebase 配置并且您已连接到 firebase。如果您有 android studio 2.2,请转到 Tools->Firebase->RemoteConfig - Connect to Firebase 并查看是否收到通知说已连接。连接后,在您的代码中执行以下操作: mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();

    /** NOTE: At this point, your app can use in-app default parameter values.To use in-app
     *        default values,skip the next section. You can deploy your app without setting
     *        parameter values on the server,and then later set values on the server to
     *        override the default behavior and appearance of your app.
     */

    mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);
    FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
            .setDeveloperModeEnabled(true)
            .build();
    mFirebaseRemoteConfig.setConfigSettings(configSettings);

然后为获取配置执行以下 long cacheExpiration = 2000; // 可以增加这个通常 12hrs 是推荐的

    /** If in developer mode cacheExpiration is set to 0 so each fetch will retrieve values from
     * the server.*/

    if (mFirebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
        cacheExpiration = 0;
    }

   /**  cacheExpirationSeconds is set to cacheExpiration here, indicating that any previously
    * fetched and cached config would be considered expired because it would have been fetched
    * more than cacheExpiration seconds ago. Thus the next fetch would go to the server unless
    * throttling is in progress. The default expiration duration is 43200 (12 hours).
    */

    mFirebaseRemoteConfig.fetch(cacheExpiration)//TODO Bring this from a config file
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Firebase Remote config Fetch Succeeded");
                        // Once the config is successfully fetched it must be activated before newly fetched
                        // values are returned.
                        mFirebaseRemoteConfig.activateFetched();
                    } else {
                        Log.d(TAG, "Firebase Remote config Fetch failed");
                    }
                    showRemoteConfig();
                }
            });

运行您的应用程序并检查日志“Firebase Remote config Fetch Succeeded”。如果您看到相同的内容,您的远程配置将被加载并激活。

于 2016-06-14T12:28:30.800 回答
1

好吧,就我而言,我能够在addOnCompleteListenerfetch 方法中接收控制,但是我在firebaseRemoteConfig调​​用之后就获取了值firebaseRemoteConfig.activate(),所以当我尝试从中获取值时,firebaseRemoteConfig会返回我以前保存的值,因为firebaseRemoteConfig.activate()异步运行并且新值没有在我从 firebaseRemoteConfig 获取它们之前保存,所以我也为activate()方法添加了完整的监听器,这里:

firebaseRemoteConfig.fetch()
            .addOnCompleteListener(activity, OnCompleteListener {
                if (it.isSuccessful)
                {
                    Log.d("task","success")
                    firebaseRemoteConfig.activate().addOnCompleteListener {  // here I have added a listener
                        val base_url=firebaseRemoteConfig.getString("base_url")
                        Log.d("base url",base_url)
                        Toast.makeText(activity, "Base url: $base_url",Toast.LENGTH_SHORT).show()
                    }
                }
                else
                {
                    Log.d("task","failure")
                }

            })
于 2019-06-13T11:31:26.540 回答
0

我遇到了一个问题,即 Firebase Remote Config 没有使用 OnCompleteListener 触发fetch(0),但是使用fetch()了。

查看FirebaseRemoteConfig.fetch() 不会每次都触发 OnCompleteListener,我发现第一个答案有时甚至可以使用fetch(0). 然后我再次将间隔设置为 3600 秒,因为错误继续出现:

override fun onPostResume() {
    super.onPostResume()

    // Initialize FirebaseRemoteConfig here.
    ...

    firebaseRemoteConfig.fetch(3600).addOnCompleteListener { task ->
        if (task.isSuccessful) {
            firebaseRemoteConfig.activateFetched()
            //calling function to check if new version is available or not
            checkForUpdate(currentVersionCode, firebaseRemoteConfig.getString(VERSION_CODE_KEY))
        } else
            Toast.makeText(this@MainActivity, "Someting went wrong please try again",
                Toast.LENGTH_SHORT).show()
    }

}
于 2019-02-01T10:59:40.787 回答
0

我在一个大项目上工作,问题被埋在了一个意想不到的地方。长话短说:firebase 应用程序 ID(通常通过 google-services.json 设置)已通过代码更改:

FirebaseOptions.Builder builder = new FirebaseOptions.Builder();
builder.setApplicationId(applicationId);
builder.setApiKey(apiKey);
FirebaseOptions options = builder.build();
FirebaseApp.initializeApp(context, options);

解决方案是删除该代码并让 firebase 使用“google-services.json”中的信息。

于 2019-08-26T12:41:48.310 回答