프로그램/안드로이드

앱이 background 상태일때, FCM Notification event handler 를 수신하지 못하는 경우.

(주)CKBcorp., 2017. 3. 31. 06:00
반응형


말 그대로다. 이거때문에 무려 이틀을 삽질했는데, 그 결과를 적는다.

일단, FCM 은 GCM 다음 나온 android notification 이다. ( notification 을 한글로 뭐라 해야 하나? "알림" 해버리면 Alarm 이랑 헷갈린단 말야. )

이거 쓰는 방법이야 인터넷 보면 많이 있다. 대표적인 건

http://blog.naver.com/PostView.nhn?blogId=cosmosjs&logNo=220739141098&parentCategoryNo=56&categoryNo=&viewDate=&isShowPopularPosts=true&from=search

http://www.inflater.co.kr/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-fcm%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC/


여기저기 많고, 내가 필요했던 건

1. background service 로 돌아가는 앱이

2. 서버의 FCM notification 을 받아서

3. 등록된 event handler 를 실행해서 작업하는 것. 


별 거 없다. 쉽게말해 "폰으로 오락하던 사용자가, 카톡 알림 오면 카톡 프로그램 실행되는 것'

차이점은, 카톡 알람의 경우 새로운 글이 오면 사용자가 메시지를 "클릭" 해서 이동하지만, 나는 자동으로(=클릭없이) 앱이 실행되는 것. 


그런데, 아무리 해 봐도 일단 background service 로 들어간 앱은 FCM noti 를 못 받더라. foreground 일 때만 event handler 가 실행되더라고. 

근데, 아무리 인터넷을 뒤져봐도 background service 일 때 안 된다는 이야기가 없더라고. 
FCM에 대해 글 써 놓은 사람들 보면, 별 어려움 없이 그냥 되는 느낌적인 느낌.

생각할 수 있는 별 조합을 다 해보다가 결국 되서, 그 삽질과정을 적는다. 다른사람은 나와 같은 삽질을 하지 않길 바란다. 


1. background 상태일 경우, google FireBase 사이트에서 noti 날려도 수신안된다.

Foreground 상태일때는 된다. Background 상태일 때만 안되는 거임. 

2. background 상태 수신 테스트 하려면, 웹서버를 만들어서 테스트 하던가, postman 을 설치해서 테스트 해 봐라.

postman 은 웹앱인데, REST API 테스트를 웹서버 없이 할 수 있게 해준다. 

편한 건 가져다 쓰자. 공짜임.

http://ourcstory.tistory.com/6

https://velopert.com/362

background 상태의 앱은 https://fcm.googleapis.com/fcm/send 를 경유해서 noti 를 전달해야 이벤트 처리가 가능하다. 

3. FCM noti body 에 notification 쓰지마라. data 써라.

이게 핵심이다. 

정확하게 기억이 안나는데, 어쨌던 FCM 이 단말에 메시지를 보내는 방법은 두 가지가 있다. 

메시지의 키 값으로 "notification" 을 쓰는 방법과 "data" 를 쓰는 방법

코드는 대략 아래와 같다. 

{
"notification" {
"title" : "title2",
"body" : "bodytest2"
},
"to" : "..."
"data" : {
"message" : "가나다라마"
}
}
}

key 가 "notification" 인 것과 "data" 인 게 차이가 있다. 뭐가 차이였는지는 잊어버렸지만, 하여튼 테스트하면 다름. 

결론부터 말하면, key 를 "notification" 을 쓰면 foreground 일때는 수신되지만, background 일때는 수신 안된다.
key 를 "data" 로 써야 background 일때도 수신된다. 


[ 진짜 이틀째 이런 기분이었다. ]


노삽질 천국행. 움마니사바하.


반응형