일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 7월 공모주 청약 일정
- Eclipse
- 코드이그나이터
- 자바
- 리눅스
- 주식 청약 일정
- codeigniter
- html
- Stock ipo
- 맥
- MYSQL
- JavaScript
- 6월 공모주 청약 일정
- java
- 자바스크립트
- linux
- 공모주 청약
- jquery
- 주식 청약
- Oracle
- SQL
- css
- Stock
- 오라클
- 공모주 청약 일정
- 주식
- php
- 공모주
- IPO
- 제이쿼리
- Today
- Total
개발자의 끄적끄적
[java] Firebase, Android 연동 및 push 알림보내기 [펌] 본문
[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가 제대로 연동이 되지 않았다는 뜻이다.
이 이후 데이터들은 값을 넣지 않아도 된다. 알림을 보내면
성공
이와 같이 알림이 잘 오는 것을 볼 수 있다. 앱을 실행하고 있을 때, 앱이 죽은 상태일 때 모두 알림이 잘 간다.
'개발 > java & jsp' 카테고리의 다른 글
[JavaFX] Canvas 그래픽 그리기 [펌] (0) | 2020.08.16 |
---|---|
[java/spring] 이미지 리사이즈 예제 [펌] (0) | 2020.08.15 |
[java/spring] 파일확장자를 필터링 하는 클래스 - FileExtFilter [펌] (0) | 2020.08.13 |
[java] 파일에서 확장자만, 파일명만 구하기? [펌] (0) | 2020.08.13 |
[java & spring] 문자열(String)의 빈 값 혹은 Null을 다루는 여러가지 방법[펌] (0) | 2020.08.11 |