繁体   English   中英

Firebase 远程配置:无法读取任何值,但获取成功

[英]Firebase Remote Config: Can't read any values, but fetch is successful

我正在尝试使用 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 ,所以似乎获取成功。

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

找到解决方法! 见下文

我遇到了“无声完成”的事情——我称之为“获取”,但 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);

您可能会在远程配置中使用 缓存 它的工作方式是 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>() {
     // ...
});

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

发现问题了。

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

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

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

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

在这种情况下,第一件事是检查您是否有正确的 firebase 配置并且您已连接到 firebase 。如果您有 android studio 2.2,请转到 Tools->Firebase->RemoteConfig - 连接到 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”。 如果您看到相同的内容,则您的远程配置已加载并激活。

我使用了类似的代码,如@Ian Barber(复制):

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

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

那么在我的情况下,我能得到控制addOnCompleteListener为获取方法,但我已经取的值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")
                }

            })

Android Studio 的 Build Variant 是否与您预期的 Firebase 项目匹配?

我有一个问题,Firebase 远程配置没有使用fetch(0)触发 OnCompleteListener ,但使用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()
    }

}

我在做一个大项目,但问题被埋在了一个意想不到的地方。 长话短说: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”的信息。

使用 fetchAndActivate 而不是 fetch

我面临着同样的问题。 获取后,只有第一次没有听众接到电话。 我在单行中尝试 fetchAndActivate,它对我有用。 使用下面的代码

mFirebaseRemoteConfig.fetchAndActivate()
    .addOnCompleteListener(this, new OnCompleteListener<Boolean>() {
        @Override
        public void onComplete(@NonNull Task<Boolean> task) {
            if (task.isSuccessful()) {
                boolean updated = task.getResult();
                Log.d(TAG, "Config params updated: " + updated);
                Toast.makeText(MainActivity.this, "Fetch and activate succeeded",
                        Toast.LENGTH_SHORT).show();

            } else {
                Toast.makeText(MainActivity.this, "Fetch failed",
                        Toast.LENGTH_SHORT).show();
            }
            displayWelcomeMessage();
        }
    });

它将立即获取并激活。 您可以在此处的官方文档中找到这种方式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM