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
'programing' 카테고리의 다른 글
| Oracle에서 Check 문에 하위 조회 사용 (0) | 2023.06.17 |
|---|---|
| 모듈 모드 Vuex로 전환 중입니다.VueJS에 저장 (0) | 2023.06.17 |
| typescriptsconfig.json include exclude 작동하지 않음 (0) | 2023.06.12 |
| 레일즈에서 상대적인 시간은 어떻게 됩니까? (0) | 2023.06.12 |
| 서버 응답: 5.7.0 STARTTLS 명령을 먼저 실행해야 합니다. i16sm1806350pag.18 - gsmtp (0) | 2023.06.12 |