이전 포스팅중에 하나인
[Android]안드로이드 앱 마켓 버전 체크에서 사용하던 코드는 이제 사용이 불가능합니다.
(현재 코드를 일부 수정하여 사용 가능합니다)
그렇기에 미루고 미루어두었던 Firebase의 Remote Config를 통해 앱 버전을 체크하는 방법에 대해 알아보겠습니다.
이번 포스팅에서 설명하는 소스코드는 GitHub에서 만나보실 수 있습니다.
우선 Firebase에 새로운 프로젝트를 생성합니다.
원하는 프로젝트 이름을 정하시고 국가/지역을 선택합니다.
프로젝트 생성이 완료된 후
Android앱에 Firebase 추가 버튼을 클릭합니다.
Firebase를 추가하고자하는 안드로이드 프로젝트의 패키지 이름을 입력합니다.
아래 입력사항들은 선택사항이니 생략하셔도 됩니다.
다운로드 google-services.json 버튼을 클릭하여 다운받은 후
안내와 같이 앱 모듈 디렉토리에 옮겨둡니다.
안내와 같이 Gradle에 의존성을 정의합니다.
저는 안내에 나와있는 버전이 아닌 15.0.0 버전으로
compile 이 아닌 implementation을 사용했습니다.
여기까지 완료하셨으면 기본적인 파이어베이스 설치가 완료되었습니다.
우리는 Remote Config 기능을 사용할 것 이기에
Gradle에 Remote config를 추가하겠습니다.
1 | implementation 'com.google.firebase:firebase-config:15.0.0' | cs |
첫 번째 매개변수 추가 버튼을 클릭합니다.
저는 간단하게 latest_version이라는 키에 1.0.2의 값을 지정하여 추가하였습니다.
조건 값을 추가하여 보다 다양한 환경을 설정할 수 있지만 여기서는 생략하겠습니다.
앱을 서비스하실 때는 플레이스토어에 업로드한 최신 앱 버전으로 값을 정하시면 되겠습니다.
매개변수를 추가하고 변경사항 게시를 클릭하셔야합니다.
그렇지 않으면 우리가 추가하거나 변경한 변수값들이 반영이 되지 않습니다.
여기까지 파이어베이스의 Remote Config를 설치하고 매개변수를 추가하는 과정이었습니다.
이제부터는 안드로이드 소스코드를 살펴보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | private fun remoteConfigInit() { // developer mode enable when debug val configSettings = FirebaseRemoteConfigSettings.Builder() .setDeveloperModeEnabled(BuildConfig.DEBUG) .build() // set in-app defaults val remoteConfigDefaults = HashMap<String, Any>() remoteConfigDefaults["latest_version"] = "1.0.0" // FirebaseRemoteConfig init FirebaseRemoteConfig.getInstance().apply { setConfigSettings(configSettings) setDefaults(remoteConfigDefaults) // every 60 minutes refresh cache // default value is 12 hours fetch(60).addOnCompleteListener({ task: Task<Void> -> if (task.isSuccessful) { Log.d("RemoteConfig", "remote config is fetched.") activateFetched() } }) } } | cs |
위의 코드는 Remote Config 객체를 초기화해주는 코드입니다.
set in-app defaults라고 주석처리한 부분은
파이어베이스의 remote config에 추가한 매개변수의 디폴트 값을 설정해주는 과정입니다.
즉, 정의한 매개변수 값들을 받아오지 못했을 경우에 사용할 기본 값들입니다.
여러개의 매개변수를 등록하였고, 그 값들의 기본값을 설정해주고 싶으시면 추가로 설정하시면 됩니다.
저는 해당 코드를 Application 클래스에 두고 사용합니다.
1 2 3 4 5 6 7 8 9 10 11 12 | private fun checkGooglePlayServices() { val googleApiAvailability = GoogleApiAvailability.getInstance() val status = googleApiAvailability.isGooglePlayServicesAvailable(this) if (status != ConnectionResult.SUCCESS) { val dialog = googleApiAvailability.getErrorDialog(this, status, -1) dialog.setOnDismissListener { _ -> finish() } dialog.show() googleApiAvailability.showErrorNotification(this, status) } } | cs |
위의 코드는 구글 플레이 서비스 설치 여부를 파악하는 코드입니다.
구글 플레이 서비스가 설치되어 있지 않으면 Remote Config를 사용할 수 없습니다.
구글 플레이 서비스가 설치되어 있지 않은 안드로이드 스마트폰은 거의 없다고 봐도 무방하기에 생략하셔도 괜찮을 것 같지만
혹시 모르는 상황에 대비하여 체크하고 넘어가시는게 좋을 것 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | private fun getAppVersion(context: Context): String { var result = "" try { result = context.packageManager .getPackageInfo(context.packageName, 0) .versionName result = result.replace("[a-zA-Z]|-".toRegex(), "") } catch (e: PackageManager.NameNotFoundException) { Log.e("getAppVersion", e.message) } return result } | cs |
현재 설치된 앱의 버전을 확인하는 코드입니다.
문자는 제거하고 버전 숫자만 리턴하도록 되어있습니다.
(ex: v1.0.0 -> 1.0.0)
1 2 | val remoteConfig = FirebaseRemoteConfig.getInstance() val latestVersion = remoteConfig.getString("latest_version") | cs |
Remote Config의 매개변수 값을 가져오는 코드입니다.
latest_version이라는 키의 value를 가져옵니다.
아래의 코드는 버튼을 클릭하여 현재의 앱 버전과 Remote Config에 등록한 'latest_version'의 값을 가져와서
TextView에 보여주고 버전이 다르다면 AlertDialog를 보여주는 메인액티비티 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) checkGooglePlayServices() button.setOnClickListener { checkVersion() } } private fun checkGooglePlayServices() { val googleApiAvailability = GoogleApiAvailability.getInstance() val status = googleApiAvailability.isGooglePlayServicesAvailable(this) if (status != ConnectionResult.SUCCESS) { val dialog = googleApiAvailability.getErrorDialog(this, status, -1) dialog.setOnDismissListener { _ -> finish() } dialog.show() googleApiAvailability.showErrorNotification(this, status) } } private fun checkVersion() { val remoteConfig = FirebaseRemoteConfig.getInstance() val latestVersion = remoteConfig.getString("latest_version") val currentVersion = getAppVersion(this) currentAppVersion.text = currentVersion latestAppVersion.text = latestVersion if (!TextUtils.equals(currentVersion, latestVersion)) { showUpdateDialog() } } private fun getAppVersion(context: Context): String { var result = "" try { result = context.packageManager .getPackageInfo(context.packageName, 0) .versionName result = result.replace("[a-zA-Z]|-".toRegex(), "") } catch (e: PackageManager.NameNotFoundException) { Log.e("getAppVersion", e.message) } return result } private fun showUpdateDialog() { val dialog = AlertDialog.Builder(this) .setTitle("New version available") .setMessage("Please, update app to new version") .setPositiveButton("Update", { dialog, _ -> dialog.dismiss() }) .setNegativeButton("No, thanks", { dialog, _ -> dialog.dismiss() }) .create() dialog.show() } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class BaseApplication : Application() { override fun onCreate() { super.onCreate() remoteConfigInit() } private fun remoteConfigInit() { // developer mode enable when debug val configSettings = FirebaseRemoteConfigSettings.Builder() .setDeveloperModeEnabled(BuildConfig.DEBUG) .build() // set in-app defaults val remoteConfigDefaults = HashMap<String, Any>() remoteConfigDefaults["latest_version"] = "1.0.0" // FirebaseRemoteConfig init FirebaseRemoteConfig.getInstance().apply { setConfigSettings(configSettings) setDefaults(remoteConfigDefaults) // every 60 minutes refresh cache // default value is 12 hours fetch(60).addOnCompleteListener({ task: Task<Void> -> if (task.isSuccessful) { Log.d("RemoteConfig", "remote config is fetched.") activateFetched() } }) } } } | cs |
1 2 | <application android:name=".BaseApplication" | cs |
아래는 결과 스크린샷 및 동영상입니다.
파이어베이스의 Remote Config 기능을 이용하여 앱 버전을 비교해보는 방법에 대해 알아보았습니다.
지금은 단순히 버전 비교하는 동작만 구현을 해보았지만
다양한 매개변수를 통해서 보다 유용한 동작들(설치된 앱 버전에 따른 사용자 동작 구현 다양화)을 구현하실 수도 있을겁니다.
해당 소스코드는 GitHub에 올려져있습니다.
직접 사용해보고 싶은신 분들은 본인의 firebase google-services.json 파일을 추가하고 매개변수를 등록하셔서 사용하실 수 있습니다.
'Android' 카테고리의 다른 글
[Android]2018.07 Android OS 점유율 (0) | 2018.07.12 |
---|---|
[Android]안드로이드 오레오 버전 알림 채널 및 그룹(Notification Channel, Group) 간단 사용법 (3) | 2018.05.14 |
[Android]커스텀 폰트 일괄 적용법 (4) | 2018.04.27 |
[Android]Java를 따라잡을 Kotlin (1) | 2018.04.24 |
[Android]커스텀 폰트 간단 적용법 (2) | 2018.04.24 |