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()
が呼び出されないことがわかりました。アプリケーションのonCreate
からフラグメントにフェッチを移動しましたが、今では正しく動作します!
( Ian Barber 、Firebaseはアプリケーション内で問題なく初期化され、フェッチはサイレントエラーであったことがログに示されているため、これは調査または明確化する必要があるかもしれません。)
回避策が見つかりました!以下を参照
「サイレントコンプリート」の問題に直面しています-「フェッチ」と呼びますが、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);
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サンプル でこれが行われます。
私は同じ問題を抱えており、私の場合は回避策はありませんでした。問題はテストデバイスにありました。 Google Mobile Servicesをインストールせずにエミュレーターを使用しました。これは、Completeイベントが発生しなかったためです。私は自分の携帯電話をGMSで試してみたが、すべてうまくいった。幸運を。
@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」からの情報を使用させることでした。
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()
}
}
私もこの問題に遭遇しました。 Firebaseコンソールに[公開]ボタンが表示されていなかったことがわかりました。 :facepalm:
私の場合、フェッチメソッドの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")
}
})