2019. 4. 24. 18:56ㆍProgramming/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
GCMBaseIntentService
의 onRegistered
, onUnregistered
, onMessage
같은 녀석들이나, GCMRegistrar
의 checkDevice
, checkManifest
, register
같은 녀석들은 더 이상 필요하지 않다고 한다. = ㅅ=) 따라서 이 녀석들을 지워주고, Android Studio에서 Tool > Firebase
를 통해 Firebase 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-core
와firebase-messaging
의존성을 추가해주자. 그리고google-services
플러그인을 적용해주면 끝난다.
위의 내용을 적용해주고 빌드를 해서 확인해보면, Token값이 출력되는 것을 확인할 수 있다. 이제 Firebase dashboard에서 푸쉬 알람 테스트를 진행할 수 있다. 간단하게 테스트 메시지를 보내보자.
Firebase console에 접속해서 Cloud Messaging을 클릭한 후, Send Your First Message를 눌러보면 위와 같은 화면이 나온다. 테스트 메시지를 작성해보자.
테스트 메시지를 작성하고나면, 토큰을 입력할 수 있다. FirebaseInstanceId.getInstance().getInstanceId()
를 호출하는 예제 코드가 정상적으로 동작했다면, 토큰값이 토스트 및 로그캣에 찍혔을 것이다. 토큰을 입력한 후 앱에서 메시지가 수신되는지 확인해보도록 하자. 여기까지 진행했다면, 문제없이 테스트 메시지가 발생하는 것을 확인할 수 있다. :)
'Programming > Android' 카테고리의 다른 글
[Android/Java] 파일 출력(FileOutputStream)관련 삽질 기록 (0) | 2019.05.23 |
---|---|
GCM to FCM Migration 정리 (0) | 2019.04.29 |
[GCM to FCM Migration 삽질기 #2] Migration 시작 (0) | 2019.04.24 |
구 버전의 NDK 설치(NDK 아카이브) (0) | 2019.04.12 |
[GCM to FCM Migration 삽질기 #1] 기존에 사용하던 GCM 코드 확인 (0) | 2019.04.08 |