web-dev-qa-db-ja.com

Firebase Remote Config:値を読み取ることはできませんが、取得は成功します

Firebaseの新しいリモート構成機能を使用してリモート構成パラメーターを取得しようとしていますが、問題があります。

リモート構成コンソールは次のとおりです。 remote config console

アプリケーションの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_が返されるため、フェッチが正常に行われているようです。

私の価値が空白である理由は何ですか?

35
Steven Schoen

問題が見つかりました。

いくつかのロギングを追加した後、フェッチジョブのonComplete()が呼び出されないことがわかりました。アプリケーションのonCreateからフラグメントにフェッチを移動しましたが、今では正しく動作します!

Ian Barber 、Firebaseはアプリケーション内で問題なく初期化され、フェッチはサイレントエラーであったことがログに示されているため、これは調査または明確化する必要があるかもしれません。)

9
Steven Schoen

回避策が見つかりました!以下を参照

「サイレントコンプリート」の問題に直面しています-「フェッチ」と呼びますが、onComplete、onSuccess、またはonFailureリスナーは起動しません。 onCreateをアクティビティonCreateに移動しようとしましたが、それでも何も起こりませんでした。そのため、構成アイテムはサーバーからロードされません。開発者モードを有効にし、キャッシュ値0でフェッチを呼び出しています。

私は(一度)ブレークポイントを「public void onComplete(@NonNull Task task){」行に置くことができました。これはヒットし、それからステップスルーしてonCompleteが起動しました。それから、同じことを(もう一度考えて)行うなど、他の方法でこの同じ結果を再現することができませんでした。

タイミングまたは同時実行性の問題のように見えますが、これは非同期呼び出しであるため、ほとんど意味がありません。

回避策

Activity#onResume(または、私が推測するActivity#onStart)から取得した場合、完全に機能します。 Activity#onCreateまたはApplication#onCreateからフェッチを呼び出すと、処理されないように見える呼び出しが発生し、実際、フェッチの開始後にアプリのパフォーマンスが著しく低下するため、ルーパーなどが実行されていると思います。*

回避策2

これをApplication#onCreate(これは私が実行します)から実行したい場合、これも同様に機能するようです:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        // Run mFirebaseRemoteConfig.fetch(timeout) here, and it works
    }
}, 0);
18
jkane001

Remote Configで caching を押している可能性があります。動作方法は、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>() {
     // ...
});

完全なリファレンスが必要な場合は、 quickstartサンプル でこれが行われます。

16
Ian Barber

私は同じ問題を抱えており、私の場合は回避策はありませんでした。問題はテストデバイスにありました。 Google Mobile Servicesをインストールせずにエミュレーターを使用しました。これは、Completeイベントが発生しなかったためです。私は自分の携帯電話をGMSで試してみたが、すべてうまくいった。幸運を。

4
Vadim Zin4uk

@Ian Barber(コピー)のような同様のコードを使用しました:

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

私の問題は"BuildConfig.DEBUG"で、falseを返します。したがって、再度フェッチされるまで、キャッシュ内の値1hを使用します!

私は大きなプロジェクトに取り組んでおり、問題は予想外の場所に埋もれていました。簡単に言えば、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」からの情報を使用させることでした。

0
M.Paunov

Firebase Remote Configが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()
    }

}
0
CoolMind

私もこの問題に遭遇しました。 Firebaseコンソールに[公開]ボタンが表示されていなかったことがわかりました。 :facepalm:

0
aaronmarino

私の場合、フェッチメソッドのaddOnCompleteListenerで制御を受け取ることができますが、firebaseRemoteConfig.activate()を呼び出した直後に値firebaseRemoteConfigをフェッチしているので、 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")
                }

            })
0
Suraj Vaishnav