[GCM to FCM Migration 삽질기#3] Legacy 코드를 제거하자!

2019. 4. 24. 18:56Programming/Android

반응형

2019/04/29 - [Programming/Android] - GCM to FCM Migration 정리
이 글은 GCM을 사용해서 푸쉬알람을 띄우던 기존의 Legacy코드를 FCM으로 통합할 때 작성하기 시작한 글로, 작업이 완료된 시점에 다시 작성한 글은 위를 참조해주세요. :)

 

앞서 말했듯이 Migrate a GCM Client App for Android to Firebase Cloud Messaging 페이지를 순서대로 따라하다보면, 대부분의 4번까지는 문제없이 해결할 수 있다.

나의 경우에는 Legacy 코드의 GCMRegistrar.getRegistrationId, GCMRegistrar.register같은 녀석들이 문제였다. GCM에 대해 알고 있었다면 그나마 문제가 좀 덜했겠지만, 사전지식이 없으니 멘탈에 금이 더욱 쉽게 갔다. 계속해서 구글링을 하다가 다음과 같은 문서를 발견했다. Going on to Firebase cloud messaging(FCM) in Android, D.J's development log

 

GCMBaseIntentServiceonRegistered, onUnregistered, onMessage같은 녀석들이나, GCMRegistrarcheckDevice, checkManifest, register같은 녀석들은 더 이상 필요하지 않다고 한다. = ㅅ=) 따라서 이 녀석들을 지워주고, Android Studio에서 Tool > Firebase를 통해 Firebase Assistant menu를 실행해보라고 한다.

fcm assistant menu

Tool > Firebase에서 Cloud message 항목을 누르면 위와 같이 뜬다. 각 항목을 실행해주도록 하자.
Connect your app to Firebase > Add FCM to your app > Handle Messages 순서대로 진행하면 된다.

 

일단 Connect to Firebase, Add FCM to your app까지 하면 기본적인 환경 세팅은 Firebase Assistant가 처리해준다. 그 다음의 문제는 GCMRegistrar을 이용해서 서버에 토큰값을 등록하는 녀석을 수정하는 것이었다. 기기 등록 토큰 액세스와 관련된 내용은 Android에서 Filebase 클라우드 메시징 클라이언트 앱 설정 페이지를 참조하면 된다.

현재 토큰을 검색하기 위해 FirebaseInstanceId.getInstance().getInstanceId()를 호출하는 예제코드를 복사/붙여넣기 했다.

FirebaseInstanceId.getInstance().getInstanceId()
        .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                if (!task.isSuccessful()) {
                    Log.w(TAG, "getInstanceId failed", task.getException());
                    return;
                }

           // Get new Instance ID token
           String token = task.getResult().getToken();

           // Log and toast
           String msg = getString(R.string.msg_token_fmt, token);
           Log.d(TAG, msg);
           Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
       }
   });

복사/붙여넣기 한 코드는 위와 같다.

 

이상하게 토큰이 등록되야 할 시점에서 앱이 죽길래 로그를 살펴보니 다음과 같은 에러가 출력됐다.

  Caused by: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process `[APP NAME]`. Make sure to call FirebaseApp.initializeApp(Context) first.  

FirebaseApp이 초기화되지 않았으니, FirebaseApp.initializeApp(Context)를 호출해서 초기화해보라는 에러 메시지가 출력됐다.

 

어째서인지 FirebaseApp이 초기화되지 않는다는 얘기였다. 일반적으로는 자동으로 초기화되지만, google-services.json 파일에 문제가 있거나 build.gradle의 설정이 잘못된 경우에 에러가 출력된다고 한다.

위의 순서대로 따라했다면 문제의 해결책은 생각보다 간단하다. Android Studio Assist가 Firebase Cloud Message에 관한 사항만 초기화했기 때문에, App의 Built.gradle파일을 열어보면 implementation 'com.google.firebase:firebase-messaging:17.3.4' 의존성이 추가되어있는 것을 확인할 수 있을 것이다. 백그라운드 앱에 테스트 메시지 보내기, firebase docs 페이지의 SDK 추가항목을 참조하여, gradle 파일에 누락된 내용을 추가하도록 하자.

buildscript {
 // ...
 dependencies {
 // ...
   classpath 'com.google.gms:google-services:4.2.0' // google-services plugin
 }
}

allprojects {  
 // ...  
 repositories {  
   google() // Google's Maven repository  
   // ...  
 }
}

루트 수준의 build.gradle에 google-services plugin 의존성을 추가해주자.

 apply plugin: 'com.android.application'

android {
 // ...
}

dependencies {
 // ...
 implementation 'com.google.firebase:firebase-core:16.0.7'
 implementation 'com.google.firebase:firebase-messaging:17.3.4'
 // Getting a "Could not find" error? Make sure you have
 // added the Google maven respository to your root build.gradle
}

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

앱 수준의 build.gralde에 firebase-corefirebase-messaging 의존성을 추가해주자. 그리고 google-services 플러그인을 적용해주면 끝난다.

 

위의 내용을 적용해주고 빌드를 해서 확인해보면, Token값이 출력되는 것을 확인할 수 있다. 이제 Firebase dashboard에서 푸쉬 알람 테스트를 진행할 수 있다. 간단하게 테스트 메시지를 보내보자.

fsm test message1

Firebase console에 접속해서 Cloud Messaging을 클릭한 후, Send Your First Message를 눌러보면 위와 같은 화면이 나온다. 테스트 메시지를 작성해보자.

 

테스트 메시지를 작성하고나면, 토큰을 입력할 수 있다. FirebaseInstanceId.getInstance().getInstanceId()를 호출하는 예제 코드가 정상적으로 동작했다면, 토큰값이 토스트 및 로그캣에 찍혔을 것이다. 토큰을 입력한 후 앱에서 메시지가 수신되는지 확인해보도록 하자. 여기까지 진행했다면, 문제없이 테스트 메시지가 발생하는 것을 확인할 수 있다. :)

반응형