2016-05-28 18 views
24

をOnCompleteListenerトリガしません:FirebaseRemoteConfig.fetchは()私はFirebaseリモートコンフィグを実装しようとしているたびに

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は常にrightと呼ばれる必要がありますか?キャッシュを打っていても?

EDIT:デベロッパーモードを無効にしても、動作は同じです。場合によってはコールバックがトリガーされることもあります。

+0

私はもちろんのデバッグのこの同じproblem..butを持って取得することはできません何が起こっているのかを見て、私はどのようにログを立てるかを理解できません。 – danb

+0

あなたはこのログメッセージ "FirebaseInstanceId:topic sync succeeded"が表示され、フェッチへの後続の呼び出しが機能するまで、oncompleteは呼び出されないようです。 – danb

+0

@danbどこでfetch()を起動しましたか? onCreate()、onResume()、他の場所では?私はonResume()でfetch()を動かしたので、今はうまくいくようです。ところで、あなたのような私の回避策は働いています。なぜなら、fetch()がトリガされる瞬間を遅らせるからです。たぶん、fetch()を早く呼び出すと、リモート設定を取得できなくなる可能性があります。 – guillaume

答えて

-2

UPDATEバージョン9.2.0のFirebaseが期待通りに動作し、このハックはもはや必要ありません。

私はこれを「信頼できる」状態にしていますが、あなたは私の解決策が気に入らないかもしれません。

FirebaseAuth.getInstance() 
    // I don't actually want to or need to sign in..(and this actually throws an error for us.. but we ignore it) 
    .signInAnonymously() 
    // when it completes (error or no error) we can do our business 
    .addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
     @Override 
     public void onComplete(@NonNull Task<AuthResult> task) { 
     // do the remote config fetch you were doing before 
     remoteConfig.fetch(...).addOnComplete(...); 
     } 
    }); 

これは最初のアプリで... firebase内部は初期設定でフェッチすることを行う準備ができていることを保証開き、これはと思わ:firebaseの準備ができたときに設定が起こることをフェッチ得るために、私はこれをしなければなりませんでした私の厄介なテストデバイス(authとconfigのフェッチを含むすべてのもの)で約6-10秒かかります。その後のオープンでは、全体が2-5秒かかる。明らかに、それはデバイス/ネットワークとYMMVに応じてすべて任意です。

私はこれがなぜ必要なのかを知りたいです。遠隔の設定が内部的にこれを管理し、これを私たちに公開する必要があるようです。

p.s.私は同じ問題に直面してfirebaseサポートを接触させた

compile 'com.google.firebase:firebase-auth:9.0.1'

+0

実際、私はこの回避策が嫌いです。私はFirebaseサポートチームに電子メールを送って、詳細を知っているか、少なくともこの奇妙な動作を知らせるようにしました。私はおそらくFirebaseに切り替える前に私の個人的なリモート設定を使用しています。しかし、とにかく感謝:) – guillaume

+0

いいね!あなたが応答を受け取ったら、この質問を更新してください! – danb

+2

私にとって、9.2.1はまだ期待どおりに動作していません。 – rciovati

24

firebase-config設定に加えて、この依存関係が必要になります。

現在onCompleteの、するonSuccess、およびONFAILUREリスナーがフェッチ場合は()が呼び出されないのは時期尚早と呼ばれていると報告されているバグがあります:彼らは、次の答え。 [...] 現在、postResumeの中にfetch()を置くことができます。解決策がリリースされる前に、これを試してみてください。

私はそれに応じて

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 
       } 
      }); 
} 

これまでのところ、彼らの提案回避策は、問題を解決したと思われる回避策を実施しました。

更新日:

私は火災基地のサポートから通知を受けました。最新のGoogle Playサービスのアップデートで問題は解決しました。

最新のGoogleプレイサービスアップデートでフェッチ後にリスナーを呼び出さないように修正されました。 私は今このケースを締め切ります。しかし、まだ問題が発生している場合は、お気軽にお問い合わせください。単に()onPostResume(とより良いこの作品を作るために本当に喜んで)フェッチを呼び出すことによって、それを作ることができない人のために

+2

ありがとう、マックス!彼らはこれを追跡するためにバグへのリンクを提供しましたか? – danb

+0

いいえ、残念ながらそうではありません。しかし、Firebaseのサポートでは、リリースがさらに必要になったときに私がバグ修正に掲載され続けると言いました。お知らせいたします。 – Max

+3

残念ながら、postResumeでfetch()を呼び出すことは、私にとっても信頼性の高いものではありません。 – Cachapa

1

、あなたのフェッチタイミングを遅らせるためにHandler.postDelayed()内のメソッドをフェッチ呼び出してみてください。チームにとって、フェッチ方法が正しく機能する可能性が増しました。もちろん、このソリューションはfetch onPostResumeを呼び出すのと同じように確実に動作しません。

@Override 
public void onPostResume() { 
    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
     mFirebaseRemoteConfig.fetch(cacheExpiration)... 
     ... 
     } 
    }, 500L); 
} 
2

お使いのデバイスが古いGoogleがサービスと互換性のないバージョンを再生実行する場合は、ログに表示されるはずです。

GooglePlayServicesUtil:Googleは時代遅れのサービスを再生します。 11020000が必要ですが、10930470

一つの解決策は、あなたのデバイスのGoogle Playサービスをアップグレードすることで見つけましたが、あなたは、あなたが単に予想バージョンと一致するfirebaseバージョンをダウングレードすることができますすることができない場合(ここでは10.9.3に11.0.2を変更) 。 ないあなたが(例えば、シミュレータは、今日のよう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' 
関連する問題