web-dev-qa-db-ja.com

FirebaseRemoteConfig.fetch()は毎回OnCompleteListenerをトリガーしません

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は常に正しく呼び出す必要がありますか?キャッシュをヒットしていても?

編集:開発者モードを無効にしても、動作は同じです。コールバックがトリガーされることもあれば、トリガーされないこともあります。

28
guillaume

私は同じ問題に直面していて、ファイアベースのサポートに連絡しました。彼らは次のように答えた:

現在、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の修正がリリースされました。とりあえずこのケースを閉じます。ただし、引き続き問題が発生する場合は、お気軽にご連絡ください。

27
Max

デバイスが古い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'
2
bagage

単に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);
}
1
shoheikawano