46

Firebase の新しい Remote Config 機能を使用してリモート構成パラメーターを設定しようとしていますが、問題が発生しています。

これが私の Remote Config コンソールです。リモート構成コンソール

私は自分のアプリケーションでフェッチと更新を行っています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

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

「サイレント コンプリート」に遭遇しました。「fetch」を呼び出しますが、onComplete、onSuccess、または onFailure リスナーが起動しません。アクティビティ onCreate に移動しようとしましたが、まだ何も起こらなかったため、構成項目がサーバーから読み込まれません。開発者モードを有効にして、キャッシュ値 0 で fetch を呼び出しています。

「public void onComplete(@NonNull Task task) {」という行に (1 回) ブレークポイントを設定できましたが、これがヒットし、ステップスルーして onComplete が起動しました。その後、同じことを2回行うことを含め、この同じ結果を他の方法で再現することができませんでした.

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

回避策

Activity#onResume (または、おそらく Activity#onStart) から取得すると、完全に機能します。Activity#onCreate や Application#onCreate から 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

Remote Configのキャッシュにヒットしている可能性があります。これが機能する方法は、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()ログを追加した後、フェッチ ジョブが呼び出されていないことがわかりました。フェッチをアプリケーションからonCreateフラグメントに移動したところ、適切に機能するようになりました!

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

于 2016-05-21T13:51:21.807 に答える
5

私は同じ問題を抱えていましたが、私の場合は回避策はありませんでした。問題は試験装置にありました。Google Mobile Services をインストールせずにエミュレータを使用したため、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に移動し、接続されているという通知を受け取るかどうかを確認します.接続したら、コードで次のことを行います。

    /** 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; を実行します。// これを増やすことができます。通常は 12 時間が推奨されます

    /** 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 に答える