programing

Firebase 원격 구성:값을 읽을 수 없지만 가져오기는 성공했습니다.

elecom 2023. 6. 12. 21:07
반응형

Firebase 원격 구성:값을 읽을 수 없지만 가져오기는 성공했습니다.

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그래서 가져오기가 성공적으로 진행되는 것 같습니다.

내 가치가 왜 비어있는지 알아요?

원격 구성에서 캐싱을 실행할 가능성이 높습니다.구성은 수신 항목을 로컬로 캐시한 후 반환합니다.따라서 마지막(캐시된) 가져오기 상태는 값이 정의되기 전일 수 있으며 캐시된 빈 값이 표시됩니다.

캐시 만료를 제어할 수 있지만 너무 자주 가져오면 제한될 위험이 있습니다.

그러나 이것은 일반적인 개발 문제이기 때문에 (소규모 사용자 그룹의 경우) 보다 신속하게 요청할 수 있는 개발자 모드가 있습니다.

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>() {
     // ...
});

전체 참조를 원하는 경우 빠른 시작 샘플에서 이 작업이 수행됩니다.

해결 방법을 찾았습니다!아래 참조

저는 "조용한 완료"라는 것과 마주치고 있습니다. 저는 "fetch"라고 부르지만 완료, 성공 또는 실패 시 청취자는 절대 발포하지 않습니다.Create의 작업으로 이동하려고 했지만 여전히 아무 일도 일어나지 않았고, 따라서 구성 항목은 서버에서 로드되지 않습니다.개발자 모드를 사용하도록 설정했으며 캐시 값 0을 사용하여 가져오기를 호출하고 있습니다.

저는 "public void on Complete(@Null Task task) {" 라인에 브레이크포인트를 붙일 수 있었고, 이 라인을 통과할 수 있었고, 온Complete가 작동했습니다.그리고 나서 저는 같은 일을 두 번 하는 것을 포함하여 이 같은 결과를 다른 방법으로 재현할 수 없었습니다.

타이밍이나 동시성 문제처럼 보이지만 비동기식 통화라는 점에서 말이 되지 않습니다.

해결 방법

다시 시작할 때 Activity#에서 가져온 경우(또는 시작할 때 Activity#에서 가져온 경우) 완벽하게 작동합니다.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);

문제를 발견했습니다.

로깅을 추가한 후 가져오기 작업이onComplete()호출된 적이 없습니다.응용프램에가서이를기동습다니에서 를 했습니다.onCreate파편의 것으로, 그리고 이제는 제대로 작동합니다!

(Ian Barber, Firebase가 애플리케이션에 있을 때 문제 없이 초기화되었으며 가져오기가 자동으로 실패한 것으로 로그에 표시되었기 때문에 이 문제를 조사하거나 명확히 할 수 있습니다.)

저도 이 문제에 부딪혔습니다.Firebase 콘솔에서 'Publish(게시)' 버튼을 보지 못했습니다.:얼굴 손바닥:

저도 같은 문제가 있었고 제 경우에는 어떤 해결책도 도움이 되지 않았습니다.테스트 장치에 문제가 있었습니다.Complete 이벤트가 실행되지 않았기 때문에 Google 모바일 서비스를 설치하지 않고 에뮬레이터를 사용했습니다.저는 GMS로 핸드폰을 사용해봤는데 모든 것이 잘 작동했습니다.행운을 빌어요.

이러한 경우 첫 번째는 올바른 방화벽 구성을 가지고 있으며 방화벽에 연결되어 있는지 확인하는 것입니다.안드로이드 스튜디오 2.2가 있으면 Tools->Firebase->RemoteConfig - Firebase에 연결하여 연결되었다는 알림이 표시되는지 확인합니다.연결되면 코드에서 mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();

    /** 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);

그런 다음 구성을 가져오는 경우 다음과 같은 긴 캐시 만료 = 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 Successful" 로그를 확인합니다.동일한 항목이 표시되면 원격 구성이 로드되고 활성화됩니다.

저는 @Ian Barber(복사본)와 같은 비슷한 코드를 사용했습니다.

FirebaseRemoteConfigSettings configSettings = 
    new FirebaseRemoteConfigSettings.Builder()
        .setDeveloperModeEnabled(BuildConfig.DEBUG)
        .build();
FirebaseRemoteConfig.getInstance().setConfigSettings(configSettings);

제 문제는 "BuildConfig"였습니다.DEBUG", false를 반환합니다.따라서 다시 가져올 때까지 캐시에서 값 1h가 필요합니다!

저의 경우, 저는 통제를 받을 수 있습니다.addOnCompleteListener에도 fetch .firebaseRemoteConfig내가 전화한 직후에firebaseRemoteConfig.activate()그래서 내가 가치를 얻으려고 노력했을 때.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")
                }

            })

Firebase Remote Config가 OnCompleteListener를 실행하지 않는 문제가 있었습니다.fetch(0)하지만 그와 함께fetch()했다.

Firebase RemoteConfig를 보고 있습니다.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()
    }

}

Android Studio의 빌드 변형이 의도한 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);

해결책은 해당 코드를 제거하고 소방서가 "google-services.json"의 정보를 사용하도록 하는 것이었습니다.

fetch 대신 fetchAndActivate 사용

저도 같은 문제에 직면했습니다.가져온 후에는 처음에만 수신자에게 전화가 걸려오지 않습니다.저는 fetchAndActivate를 한 줄로 시도했고 그것은 저에게 효과가 있습니다.아래 코드 사용

mFirebaseRemoteConfig.fetchAndActivate()
    .addOnCompleteListener(this, new OnCompleteListener<Boolean>() {
        @Override
        public void onComplete(@NonNull Task<Boolean> task) {
            if (task.isSuccessful()) {
                boolean updated = task.getResult();
                Log.d(TAG, "Config params updated: " + updated);
                Toast.makeText(MainActivity.this, "Fetch and activate succeeded",
                        Toast.LENGTH_SHORT).show();

            } else {
                Toast.makeText(MainActivity.this, "Fetch failed",
                        Toast.LENGTH_SHORT).show();
            }
            displayWelcomeMessage();
        }
    });

즉시 가져오기 및 활성화됩니다.공식 문서에서 이 방법을 찾을 수 있습니다.

언급URL : https://stackoverflow.com/questions/37311582/firebase-remote-config-cant-read-any-values-but-fetch-is-successful

반응형