android fcm background ( killed ) notification / 앱이 활성화 안되어 있을 때도 알림 받기


HKH

Share


앞서 적용한 push notification을 firebase console에서 테스트 해보면 앱이 비활성화 되어 있는 상태에서는 FirebaseMessagingService 의 onMessageReceived를 타지 않습니다.

 

 

 

10:22 분은  앱이 비활성화 된 상태에서 보낸 알림이고

10:23 분은 앱이 활성화 된 상태에서 보낸 알림입니다.

 

onMessageReceived에 해놓은 설정이 적용되지 않는 것을 확인 할 수 있습니다.

 

해결 방법

 

앱이 백그라운드에서 실행중이거나 죽어있을때 적용 하려면 fcm api를 직접 호출 해 주면 됩니다.

 

api url :: https://fcm.googleapis.com/fcm/send

 

node.js 를 통해 api를 호출하는걸 예로 들겠습니다.

 

 

function sendTopicMessage(title, content, imgUrl, link) {
        var message = { title : title , content : content, imgUrl : imgUrl , link : link }
        request({
                url : 'https://fcm.googleapis.com/fcm/send',
                method : 'POST',
                headers : {
                        'Content-Type' : ' application/json',
                        'Authorization' : 'key=Firebase API KEY'
                },
                body : JSON.stringify({
                        "data" : {
                                "message" : message
                        },
                        "to" : "/topics/notice"
                })
        }, function(error, response, body) {
                if (error) {
                        console.error(error, response, body);
                } else if (response.statusCode >= 400) {
                        console.error('HTTP Error: ' + response.statusCode + ' - '
                                        + response.statusMessage + '\n' + body);
                } else {
                        console.log('Done')
                }
        });

 

url은 'https://fcm.googleapis.com/fcm/send' method = POST 방식 , json 타입으로 설정하였습니다.

header에는 Authorization을 꼭 넣어 주셔야 합니다. Firebase API KEY에는 발급 받으신 api key를 넣어줍니다.

 

 

body의 to는 보낼 대상으로 /topic/토픽명 으로 하게 되면 해당 토픽 전체 사용자에게 메세지를 발송 합니다.

 

ex) FirebaseMessaging.getInstance().subscribeToTopic("notice");

 

/topic 대신에 사용자별 토큰 값을 넣게 되면 특정 사용자에게만 보낼 수 있습니다.

 

ex)

String token = FirebaseInstanceId.getInstance().getToken();

 

android 프로젝트에서 저렇게 하면 사용자 token값을 얻어 올 수 있고 그 값이

 

fmPgYSi3Iww:APA91bHKi23li9Kn1YKPiSTX4cfdwJ4BBjTHHRvhZBYnz4Rw2aKWgLYNgTKGJX2-tmjoZRib0XonkxL34yQk-O_pplT-mR46dd3l04NL1BCW3D47dd2Ra87ejktW1ju6FUw_AUZrndb9wt

 

위와같이 나오는데 저 값을 to 에 넣으면 해당 사용자 에게 푸시알림 발송이 가능합니다.

 

"to" : "fmPgYSi3Iww:APA91bHKi23li9Kn1YKPiSTX4cfdwJ4BBjTHHRvhZBYnz4Rw2aKWgLYNgTKGJX2-tmjoZRib0XonkxL34yQk-O_pplT-mR46dd3l04NL1BCW3D47dd2Ra87ejktW1ju6FUw_AUZrndb9wt"


------------------------------


fcm messaging api를 사용해서 보내게 되면 앱이 background에서 실행 중이거나 kill 되어 있을때에도 onMessageReceived를 타는것을 확일 할 수 있습니다.


* 위 코드의 var message는 제 프로젝트에 맞춰 놓은거라 각자 프로젝트에 맞게 쓰시면 됩니다.​ 


 

 

+ 내용 추가 2017-01-13

 

postman으로 테스트 할 경우 파라미터 세팅

 


 

1. 상단 POST , fcm URL 입력

2. headers 탭에 content-Type 과 authorizatino 추가 (api key값은 지웠습니다)

 


 

3. body에 JSON 형식으로 위와같이 적고 raw 선택 오른쪽에서 타입은 JSON을 선택 합니다

4. Send를 누르면  테스트 가능합니다.

 

OkHTTP Generator 결과

 

OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");

RequestBody body = RequestBody.create(mediaType, "{\"data\" : {\"message\" : {\"title\":\"test\",\"content\":\"testcontent\",\"imgUrl\":\"\",\"link\":\"\"}},\"to\" : \"/topics/noticeMsg\"}");

Request request = new Request.Builder()

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

    .post(body)

    .addHeader("content-type", "application/json") 

    .addHeader("authorization", "key=api키") 

    .addHeader("cache-control", "no-cache")

    .addHeader("postman-token", "postman토큰")

    .build();

Response response = client.newCall(request).execute(); 

 

+ 내용 추가

 

java에서 firebase messaging api 호출 하는 방법 추가 했습니다

 

LINK :: http://trandent.com/board/Android/detail/764

 

첨부파일
Sign in required
  • : {{i.writer }}
    {{i.regdate}}


    {{i.content||breakFilter }}