안드로이드 앱을 개발하시다보면 앱이 업데이트되어서,
최신버전을 받을수있도록 앱스토어로 사용자가 가게끔 해야하는 경우가 있습니다.
어떤 아키텍쳐로 가져갈까 고민을 해보면 결국 서버가 필요하다는것을 모두 느끼실겁니다.
하지만 저같은 가난한 개발자의 경우는 서버 운영비용도 없기에 어떻게 해야할까
고민을 했는데, 그해답을 Google이 제공하는 Firebase를 이용하면 가능할 수 있음을
알게 되었습니다.
Remote config를 사용하시려면 사전에 Firebase세팅이 끝나셔야 합니다.
1. Remote Config 파라메터 설정
https://console.firebase.google.com/project/lottomagic-b574d/config
위의 주소로 들어가신다음 앱에서 요청하여 받을 remote config를 추가하거나 수정 및 삭제 하실 수 있습니다.
로또매직 앱의 latest version을 앱에 알려주기 위해 아래와 같이 셋팅했습니다.
2. app/src/main/res/xml/remote_config_defaults.xml
위의 경로의 xml을 추가해주고 아래와 같은방식으로 작성합니다.
작성하는 이유는, remote config를 읽어오는것을 실패하게되면 기본값으로 받아올 수 있는값을
설정하기 위함입니다.
<?xml version="1.0" encoding="utf-8"?> <!-- START xml_defaults --> <defaultsMap> <entry> <key>latest_version_code</key> <value>0</value> </entry> </defaultsMap> |
3. app/build.gradle
gradle설정을 아래와 같이합니다.
... implementation 'com.google.firebase:firebase-config:18.0.0' .... |
4. app/src/main/java/com/jinlab/android/lottomagic/remote/config/RemoteConfigManager.java
public void init() { mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance(); if (BuildConfig.DEBUG) { L.d(TAG, "debug config"); mFirebaseRemoteConfigSettings = new FirebaseRemoteConfigSettings.Builder() .setMinimumFetchIntervalInSeconds(60 * 10) // 10 mins .build(); } else { // Release mFirebaseRemoteConfigSettings = new FirebaseRemoteConfigSettings.Builder() .setMinimumFetchIntervalInSeconds(ONE_DAY_SECONDS) .build(); } mFirebaseRemoteConfig.setConfigSettingsAsync(mFirebaseRemoteConfigSettings); mFirebaseRemoteConfig.setDefaultsAsync(R.xml.remote_config_defaults); } |
위의 매니져 클래스에 init부분을 정의하고 MainActivity가 열릴때 init메서드를 호출하게끔 구현하였습니다.
init메서드에서는, remote config를 셋팅하는데, 디버그버전일때는 10분에 한번씩 firebase 서버에서 fetch할 수 있도록하였고, 실제 릴리즈버전에서는 하루가 지나야 fetch하도록 하였습니다.
구글에서는 실시간으로 앱에서 정보를 받아오는 목적이라면 remote config가 아닌 실시간 데이터베이스를 사용하라고 권장하고있습니다.
로또매직의 앱업데이트같은경우는 매번 쿼리를 날리는게 아니라 하루에 한번정도면 족하다라고 생각하여 remote config로 구현하였습니다.
5. app/src/main/java/com/jinlab/android/lottomagic/remote/config/RemoteConfigManager.java
MainActivity에서 remote config를 fetch하고 사용할 수 있도록 다음과 같은 wrapper 메서드를 생성하였습니다.
public void fetchAndActivate(Activity activity, OnCompleteListener < Boolean > onCompleteListener) {
|
6. app/src/main/java/com/jinlab/android/lottomagic/main/ui/MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// Remote config
RemoteConfigManager.getInstance().init();
RemoteConfigManager.getInstance().fetchAndActivate(this, new OnCompleteListener<Boolean>(){
@Override
public void onComplete(@NonNull Task<Boolean> task) {
if (task.isSuccessful()) {
boolean updated = task.getResult();
L.d(TAG, "Config params updated: " + updated);
try {
mLatestVersionCode = Integer.parseInt(RemoteConfigManager.getInstance().getString(LATEST_VERSION_KEY));
if (mLatestVersionCode > BuildConfig.VERSION_CODE) {
showUpdatePopup();
}
} catch (NumberFormatException e) {
L.e(TAG, "NumberFormatException for mLatestVersionCode");
mLatestVersionCode = 0;
}
} else {
L.e(TAG, "Fail to load remote config");
}
}
});
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
MainActivity에서는 remote config fetch가 성공하고 active가 되는시점의 리스너를 등록하였습니다.
현재버전과 firebase로부터 받은 latest version을 비교하여, Firebase에 올린 latest version의 정보가 더높은경우
update popup이 뜨도록 구현하였습니다.
7. app/src/main/java/com/jinlab/android/lottomagic/remote/config/RemoteConfigManager.java
public String getString(String key) { return mFirebaseRemoteConfig.getString(key); } |
fetch가 성공하면 Firebase에 설정해놓은 파라메터의 value를 받아올 수 있습니다.
Fetch의 시간이 10분이라면, 10분뒤에 remote config를 원격의 firebase에서 받아오게 됩니다.
만약 10분전에 운영자가 Firebase remote config를 추가하거나 update하고나서,
곧바로 앱에서 fetch를 요청하게되면 반영된값을 받아오지못하고 이전에 firebase에 반영되어있는 값을 리스너에서 받을수있습니다.
즉 10분이 지나서야 요청하게되면 새로 생신된 값을 받아오게 됩니다.
성공적인 구현 기원합니다.
Remote config로 App update logic을 추가한 로또매직 구경하러 가기
*참고
RemoteConfig 구글 가이드
https://firebase.google.com/docs/remote-config/use-config-android