Firebase Remote Configを実装しようとしています:
override fun onCreate(savedInstanceState: Bundle?) {
val configSettings = FirebaseRemoteConfigSettings.Builder().setDeveloperModeEnabled(BuildConfig.DEBUG).build()
mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance()
mFirebaseRemoteConfig.setConfigSettings(configSettings)
mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults)
fetchRemoteConfig()
}
private fun fetchRemoteConfig() {
var cacheExpiration = 3600L
if (mFirebaseRemoteConfig.info.configSettings.isDeveloperModeEnabled) {
cacheExpiration = 0L
}
mFirebaseRemoteConfig.fetch(cacheExpiration)
.addOnCompleteListener { task ->
if (task.isSuccessful) {
Log.d(TAG, "Remote config fetch succeeded")
mFirebaseRemoteConfig.activateFetched()
} else {
Log.d(TAG, "Remote config fetch failed - ${task.exception?.message}")
}
setupView()
}
}
private fun setupView() {
val text = mFirebaseRemoteConfig.getString("my_text")
//...
}
私の問題は、OnCompleteListenerが常に呼び出されるとは限らないことです。アプリを数回閉じたり開いたりすると、setupView()がトリガーされないことがあります。
OnCompleteListenerは常に正しく呼び出す必要がありますか?キャッシュをヒットしていても?
編集:開発者モードを無効にしても、動作は同じです。コールバックがトリガーされることもあれば、トリガーされないこともあります。
私は同じ問題に直面していて、ファイアベースのサポートに連絡しました。彼らは次のように答えた:
現在、fetch()の呼び出しが早すぎるとonComplete、onSuccess、およびonFailureリスナーが呼び出されないというバグが報告されています。 [...]現在、fetch()をpostResume内に配置できる回避策があります。ソリューションがリリースされる前に、これを使用してみてください。
それに応じて回避策を実装しました
protected void onPostResume() {
super.onPostResume();
mFirebaseRemoteConfig.fetch(cacheExpiration)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "Fetch Succeeded");
// Once the config is successfully fetched it must be activated before newly fetched values are returned.
mFirebaseRemoteConfig.activateFetched();
// Do whatever should be done on success
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Log.d(TAG, "Fetch failed");
// Do whatever should be done on failure
}
});
}
これまでのところ、彼らが提案した回避策は問題を解決したようです。
更新:
Firebaseサポートから通知を受け取りました。彼らによると、この問題は最新のGoogle Play Servicesアップデートで解決されています。
最新のGoogleプレイサービスアップデートで、取得後にリスナーを呼び出さないRemote Configの修正がリリースされました。とりあえずこのケースを閉じます。ただし、引き続き問題が発生する場合は、お気軽にご連絡ください。
デバイスが古いGoogle Playサービスと互換性のないバージョンを実行している場合、ログに次のように表示されます:
GooglePlayServicesUtil:古くなったGoogle Playサービス。 11020000が必要ですが、10930470が見つかりました
1つの解決策は、デバイスのGoogle Play開発者サービスをアップグレードすることですが、それができない場合は、Firebaseのバージョンをダウングレードして、期待されるバージョンに一致させることもできます(ここでは11.0.2から10.9.3に変更します)。理想的ではありませんが、デバイスをアップグレードできない場合の解決策です(たとえば、現在、シミュレータは10.9.3を実行しています)。
compile 'com.google.firebase:firebase-core:10.2.6'
compile 'com.google.firebase:firebase-messaging:10.2.6'
compile 'com.google.firebase:firebase-config:10.2.6'
単にfetch()onPostResumeを呼び出すだけでは作成できない(そして実際にこの機能を向上させたい)場合は、Handler.postDelayed()
内でfetchメソッドを呼び出して取得タイミングを遅らせることができます。私たちのチームにとっては、fetchメソッドが正しく機能する可能性が高まりました。もちろん、このソリューションはfetch onPostResumeを呼び出すのと同じように確実に動作しません。
@Override
public void onPostResume() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mFirebaseRemoteConfig.fetch(cacheExpiration)...
...
}
}, 500L);
}