개발자의 끄적끄적

[java] Firebase, Android 연동 및 push 알림보내기 [펌] 본문

개발/java & jsp

[java] Firebase, Android 연동 및 push 알림보내기 [펌]

효벨 2020. 8. 13. 03:00
728x90
반응형

[java] Firebase, Android 연동 및 push 알림보내기 [펌]

 

구현할 기능

Firebase의 cloud messaging을 이용하여 android app에 push 알림을 보내는 동작 구현

개발환경

FCM receive app

  • Android Studio 3.2.1
  • Android SDK Tools 26.1.1

앱 수준 build.gradle setting

저번 Firebase 시작하기 스토리 대로 따라했다면 추가되어 있겠지만, 혹시 모르니 다시 보겠다. 앱 수준 build.gradle에 messaging 라이브러리를 추가해야 앱에서 알림을 수신할 수 있다. dependencies안에 추가 해야 할 코드는 다음과 같다. 추가하고 동기화를 잊지말자

implementation 'com.google.firebase:firebase-messaging:17.3.3'

java file

매니페스트를 설정하기 전미리 java파일을 생성해 두는 것이 편하다. 2개의 파일이 필요하다.

이와 같이 파일을 생성했다. 코드는 매니페스트 설정 후 작성할 것이다.

※파일 명 주의※

FirebaseInstanceIdService / FirebaseMessagingService 는 클래스 명으로 사용하면 안된다. 저 두 문장만 아니면 클래스 명은 상관없다.

  • MyFirebaseInstanceIdService : 디바이스에서 앱이 최초 실행되어 디바이스 토큰이 생성되거나 재생성 될 시 에 동작을 작성할 클래스
  • MyFirebaseMessagingService : 메시지를 수신하여 알림으로 보여주는 클래스

string setting

src > main > res > values > string.xml

매니페스트를 설정하기 전 미리 셋팅해준다.

<string name="default_notification_channel_id">Channel ID</string>
<string name="default_notification_channel_name" translatable="true">Test</string>

설정한 모습

AndroidManifest setting

src > main > AndroidManifest.xml

매니페스트에서는 설정해줄 것이 조금 있다. 순서대로 해보자

1. application 밖에 uses-permission 설정

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

  • android permission internet : 인터넷을 사용할 수 있도록 함
  • android permission access network state : 네트워크가 연결 되었는지 확인 할 수 있도록 함

2. application 안에 meta-data 설정

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

3. application 안 activity 밑에 service 설정

<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>

  • MyFireBaseMessagingService 클래스에 푸시 메시지를 받았을 때 동작하는 서비스 설정
  • MyFirebaseInstanceIDService 클래스에 어플을 설치한 디바이스 토큰 값을 얻어 오는 서비스 설정

 

모두 설정이 되었다면 이런 형태를 가질 것이다.

MyFirebaseInstanceIDService.java

 

이 클래스는 디바이스가 처음 앱을 실행 시키거나 재설치를 해서 실행을 시켰을 때 자동으로 실행된다.

새로운 디바이스에서 앱이 실행되었을 때 서버에 디바이스 토큰 값을 넘겨주는 동작을 하고 싶다면 sendRegistrationToServer에 코드를 작성하면 된다.

MyFirebaseMessagingService.java

 

Firebase에서 메시지를 받으면 디바이스에 알림이 뜨게하는 클래스이다. 앱이 실행되면 계속 이 서비스를 돌다가 메시지를 받을 시 동작한다.

  • onMessageReceived : 받은 메시지에서 title과 body를 추출
  • sendNotification : 받은 title과 body로 디바이스 알림 전송

MainActivity.java

 

그냥 device token 값 확인하려고 추가한건데 저렇게 예외처리 안해주면 에뮬레이터가 아닌 실제 디바이스에서는 앱이 중지되더라

app run

실행

필자는 에뮬레이터로 앱을 실행시켰다. 문제없이 build 된 모습이다.

Firebase 알림 전송

이제 Firebase console로 돌아가서 이 디바이스에 알림을 전송시켜 보겠다. 우선 주의할 점은 미리 에뮬레이터나 디바이스에서 앱을 한번은 꼭 실행시켜야 한다. 디바이스에서 apk로 설치한 후 실행시키지 않으면 onTokenRefresh 메소드가 실행되지 않아, firebase에서 해당 디바이스에 알림을 보낼 수 없다.

1) cloud messaging 클릭 2) 메시지보내기 클릭 3) 알림 내용

이 와 같이 해당 앱을 선택했을 때, 앱 사용자에 1명이 떠야 정상이다. 사용자가 0명을 타겟팅 한다면, 안드로이드 앱과 Firebase가 제대로 연동이 되지 않았다는 뜻이다.

이 이후 데이터들은 값을 넣지 않아도 된다. 알림을 보내면

성공

이와 같이 알림이 잘 오는 것을 볼 수 있다. 앱을 실행하고 있을 때, 앱이 죽은 상태일 때 모두 알림이 잘 간다.

 

 

출처 : https://medium.com/2kyung19/firebase-android-%EC%97%B0%EB%8F%99-%EB%B0%8F-push-%EC%95%8C%EB%A6%BC%EB%B3%B4%EB%82%B4%EA%B8%B0-ec6c57b2eb68

반응형
Comments