Things take time

[Android] FCM을 이용한 푸시 보내기 본문

Android(기능)

[Android] FCM을 이용한 푸시 보내기

겸손할 겸 2018. 11. 13. 15:10

[푸시]

 

FCM 관련 글을 쓴 것 같았는데, 옛날 블로그에만 기록이 되어있었다.

이번에 새로 앱을 하나 만들어야할 게 있어서, 기본 하이브리드앱 + 푸시만 들어간.. 거의 껍데기 앱을 만들었기에 이번에 하면서 정리하려 한다. 카메라/지도 등이 들어간다면 다시 정리해볼 수 있었을 텐데 아쉽네

https://firebase.google.com/docs/cloud-messaging/?hl=ko

기본 참고 사이트다. FCM은 구글에서 제공하는 클라우드 메시징 서비스이기 때문에 안드로이드와 궁합이 잘 맞다. 물론 iOS에서도 지원가능하다.

 

 

[순서 정리]

 

가장 간단하게 정리하면

 

1. 콘솔 사이트에서 앱 등록하기 / 안드로이드 스튜디오 내에 파일 import 및 Gradle 설정

 

2. 매니페스트 내 서비스 선언 및 실제 서비스 작성

 

이렇게 정리된다!

 

 

[상세]

 

1. 콘솔 사이트에서 앱 등록하기 / 안드로이드 스튜디오 내에 파일 import 및 Gradle 설정 가이드는 아래 참고 

https://firebase.google.com/docs/android/setup?hl=ko

 

이렇게 도움말로 나온다. 거기서 클라우드 메시징을 눌러보서 보면, 가이드가 나오게 된다.

 

 

이렇게 Firebase에 연결하기를 눌러서 구글 계정으로 로그인하고, 프로젝트를 새로 생성하던지, 기존 것을 사용하면 되는데.. 나는 여기서 에러 발생했다.

Firebase: Connect to Firebase failed. Please check your internet connection and try again. If errors persist, you can connect manually at https://console.firebase.google.com

결국 수동으로 하란 뜻.

다시 가이드 링크를 따라 수동으로 진행한다.

 

Firebase 콘솔 페이지 (https://console.firebase.google.com/?hl=ko)로 이동하여 프로젝트를 생성한다. (혹은 기존 사용, 위 과정과 같음)

 

 

 

만들게 되면, 리소스 프로비저닝 작업이 진행되며 프로젝트가 생성된다.

 

 

이제 저기서 안드로이드를 선택해서 화면대로 진행한다. (패키지명 입력하기 -> google-services.json 다운로드하기 -> 스튜디오 내 루트 디렉토리에 해당 json파일 이동하기 => Gradle에 메시징 서비스 implementation하기 등 설명 그대로를 따라한다. json 이동 시엔 ctrl + c로 파일 복사하고 ctrl + v로 넣으면 된다. 드래그 X)

 

마지막 과정으로는 앱을 실행시켜서 Firebase와 통신했는지 테스트하면 기본 설정이 완료된다.

 

 

2. 매니페스트 내 서비스 선언 및 실제 서비스 작성

 

매니페스트 내 application 태그 안에 작성한다.

<service
android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>

그리고 오레오부터 추가된 푸시 채널(짜증)을 위해 선언, 이 아이디는 서버에서 각 기기에 푸시 발송시 들어가는 channel_id에 이 식별자로 된 채널을 통하라고 알려줄 때 필요하다. 쓰지 않으면 기본 알림채널을 사용한다.

<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id"/>

이제 매니페스트에서는 기본 설정을 등록했다. 아마 이 상태라면 저 두개의 서비스 밑에 빨간 줄이 그어져 있을 것이다. 해당 이름으로 등록된 자바파일이 없기 때문이다.

 

때문에, 2개의 서비스 파일을 생성한다.

 

그리고 각각은 FirebaseMessaginService와 FirebaseInstanceIdService를 각각 상속받게 하여 두 개의 클래스 파일을 생성한다.

 

주의점

1. FirebaseMessaginService를 상속받는다 해도, cannot resolve symbol FirebaseMessaginService 이렇게 떠서 상속을 못받는 경우가 있다. 이 이유는 1번에서 알려준 것 + 앱 단위의 Gradle에 한 줄 더 추가해야한다. 버전이 낮을 경우, 주의점 2번 해결방법이 되지 않으므로 버전 값을 잘 볼 것, 현재 도큐먼트에 나온 12.버전은 사용하면 안 된다.

dependencies {
     compile 'com.google.firebase:firebase-messaging:17.3.4'
}

2. FirebaseInstanceIdService is deprecated

이 서비스가 곧 사라질 운명에 처했다. 가이드에서 하란대로 했더니 곧 삭제될 서비스라니?

https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceIdService

이 서비스의 역할은 토큰이 생성 되거나, refresh 등의 역할을 수행한다. 근데 이 서비스는 이제 사용되지 않고(onTokenRefresh() 포함) onNewToken()이란 함수를 FirebaseMessaginService를 상속받는 클래스내에 선언하여 사용하면 된다고 한다. 가이드에서도 업데이트가 이루어 질 듯 하다.

 

즉 => FirebaseInstanceIdService 이 서비스를 사용할 이유가 없다.

 

또한 현재 토큰 값을 얻어오는 문법 또한 변경되었다. 그리고 서비스의 특성상 토큰이 생성되었을 때(확실히) 값을 얻어내야 Null 에러가 나지 않기때문에 아래의 코드를 선호한다.

        FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MainActivity.this,  new OnSuccessListener() {
            @Override
            public void onSuccess(InstanceIdResult instanceIdResult) {
                String newToken = instanceIdResult.getToken();
                Log.e("newToken",newToken);

            }
        });

stackOverFlow에서 얻은 좋은 코드 :)

 

그리고 얻어낸 토큰값을 아래의 사이트에서 테스트!

https://console.firebase.google.com/project/콘솔 내 프로젝트명/notification?hl=ko