진짜 개발자
본문 바로가기

App/Android

Android - FCM 이용 Push Server 구축 - 4 (비동기 Push Server 구축)

728x90

비동기 Push Server 구축


전제 조건

1. emulator - Nexus S (Nexus 5 사용시 createChannelId 에서 알 수 없는 에러 발생)

2. API - (26)

3. Server - Spring Boot (Rest)



과정

1. 프로젝트 API Key, Sender ID 얻기

2. Android Device Token값 얻기 (서버에서 특정 device에 push를 보낼 때 사용됨)

3. API key, SenderID, Device Token값을 이용하여 FCM에 PUSH 요청을 보내는 Push Server 구축



Server 구축

      1. API Key, Sender ID 얻기

- 내가 구축한 Push Server에서 FCM으로 Push 요청을 보내기 위해서는 API Key와 Sender ID가 필요하다


1) Firebase 콘솔에 들어가 내가 생성한 프로젝트를 선택한 후 좌측 상단의 톱니바퀴 모양을 클릭한 뒤

   프로젝트 설정을 클릭한다


2) 클라우드 메시징 탭을 클릭한뒤 "서버 키" 와 "발신자 ID" 를 복사한다.


3) Server로 돌아가 apiKey와 senderId 변수를 생성하여 값을 넣어준다



2. Android에서 Device Token 얻기

- 특정 Device에 메시지를 보내기 위해서는 해당 디바이스의 Token값을 얻어야 한다.

  Token 값은 Firebase 프로젝트에 등록된 Android의 App의 FirebaseMessagingService를 상속받은 클래스의 onNewToken() 메소드가 

  실행될 때 얻어낼 수 있다


onNewToken()

FirebaseMessagingService 클래스의 콜백 함수로써 새로운 토큰이 생성될 때 호출되는 함수이다.


1) Android 설정

 - manifest의 앞전에 추가했던 "MyfirebaseMessagingService" Service에 intentfilter(MESSAGING_EVENT)를 꼭 추가해주어야 

   onNewToken()이 호출 된다.


2) android에서 Server로 토큰값 보내기

- 아래 그림과 같이 FirebaseMessagingService를 상속받는 클래스에서 onNewToken을 오버라이딩하여

  구축한 PushSever로 Token값을 보내는 코드를 추가한다


필자는 Test를 위해 debug 포인트를 찍어 새로운 토큰이 생성될때 값을 복사하여 

  Server로 바로 옮겼다



3. Server에서 FCM으로 요청보내기

- REST API 형태로 FCM에 PUSH 요청을 보낼 수 있다 


1. Body

- post 메소드로 body에 to, project_id, notification 을 담아 요청하면 된다.

1) to : android에서 얻어온 token을 적어준다

2) project_id : firebase console에서 

3) notification : 일단 비워도 된다


2. Request

- url에는 FCM서버의 주소, header에는 앞전에 얻어낸 Server Key를 입력하면 된다

1) url : "https://fcm.googleapis.com/fcm/send"

2) Autorization : key="얻어낸 API key"


3. Test 

- Postman을 이용해 내가만든 Push Server에 Push 요청을 보내본다

  주소를 입력하고, GET메소드로 요청을 보내면 된다


4. 정상적으로 메시지가 도착함을 볼 수 있다.



4. data 담아 보내기

- 사실 별다른것은 없다 어차피 RESTAPI로 통신하기 때문에 서버에서는 Body에 

   키,값 쌍으로 원하는 데이터를 추가해서 보내기만 하고 Client에서는 해당 키로 데이터를 꺼내 사용하기만 하면 된다.


1. Server

- body에 key: data, Value: 설문에 참여해주세요! 를 추가한다.


2. Client(Android)

- data에서 "data"를 key로하는 값을 꺼내 알림처리를 하는 메소드로 보낸다

 알림을 처리하는 곳에서 해당 데이터를 내용에 담으면 끝이다.


3. Test

- Postman을 이용하여 다시 테스트해본 결과 데이터를 성공적으로 띄운다.



5. 알림 클릭시 웹사이트로 이동

- 이용 방법만을 기록함


1. Push Server에서 보내고자 하는 URL을 담아 보낸다


2. Android에서 서버에서 보낸 uri를 꺼내 인텐트에 담아 주기만 하면 된다.


3. 결과




ERROR

1. InvalidRegistraion ERROR 

1) 기기가 FCM에 등록되지 않았을 경우 나타나는 에러이다

   토큰이 정상적인지 확인하고 재발급을 받는다


2) /topics/all 로 보내어도 이러한 에러가 나타난다 기기의 Token 값을 받아와 보내보자.



2. FCM에서 메시지 수신 시 "App Name" keeps stopping ERROR

1. Token을 지정하고 Push 메시지를 보낸 결과 기기에서 반응이 오는 것으로 보아 메시지 전달은 잘 이루어 진것이다

   Android Code상의 오류일 확률이 높으므로 Log를 확인하자 예상대로 Code상의 오류가 있었다 

로그를 확인한 결과 FCM에서 메시지를 받아 처리하는 부분에서 remoteMessage가 Null이어서 나타나는 에러이다


메시지가 다시 안나타난다?

- 에러가 날 시 자동적으로 해당 App 또는 Service를 종료 시키므로 다시 한번 App을 실행 시켜주면 

  다시 에러메시지가 나타난다 이때 로그를 확인하여 에러를 해결하면 된다


3. NotificationManager Error

Nexus 5가 원인인지는 모르겠으나 다음과 같이 Channel 생성시 계속 오류가 발생하였다 

Nexus S로 에뮬레이터를 변경한 후 테스트하니 정상적으로 작동 했다.