[Firebase Cloud Message] FCM Push example for JAVA

Programming/Java 2021. 2. 10. 13:00 Posted by 생각하는로뎅
반응형

FCM 만들때마다 다시 찾아야해서, 블러그에 기록해 놓는다.

 

다중 사용자에게 전송해도 좋다.

 

FCM은 한번에 1000명씩 전송이 가능하다. 1000명이 넘는다면, 나눠서 보내야한다. 

    /**
     * FCM으로 Push 보내기
     * @since 2021.02.09
     * @author Lim.sung.jin
     */
    private void sendPush(){

        // Http client 생성
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();

        // 전송방식 POST
        HttpPost httpPost = getFcmHttpPost();

        // FCM 으로 보낼 파라미터 생성
        JSONObject rootObj = null;

        try {

            // 메세지 포맷 JSON 생성
            rootObj = getFcmMessage("메세지 제목", "메세지 내용", "푸쉬 토큰 값");

            // 파라미터 설정 (UTF-8 설정하지 않으면, 한글이 깨진다)
            StringEntity params = new StringEntity(rootObj.toString(), "UTF-8");
            httpPost.setEntity(params);

            // 응답 처리
            HttpResponse httpResponse = httpClient.execute(httpPost);

            // 결과값
            String responseStrJson = EntityUtils.toString(httpResponse.getEntity());
            JSONObject responceJsonObj = new JSONObject(new JSONTokener(responseStrJson));

            /****************** [START] 결과 값 ******************/

            // 전송 성공 Count
            int successCount = responceJsonObj.optInt("success");

            // 전송 실패 Count
            int failureCount = responceJsonObj.optInt("failure");

            // 전송 결과 리스트
            JSONArray pushResultList = responceJsonObj.optJSONArray("results");

            /****************** [// END] 결과 값 ******************/


        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                httpClient.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }


    /**
     * FCM용 Http Post 객체 반환
     * @return HttpPost	: FCM용 Http Post
     * @since 2021.02.09
     * @author Lim.sung.jin
     */
    private HttpPost getFcmHttpPost(){
        HttpPost httpPost = new HttpPost("https://fcm.googleapis.com/fcm/send");

        // 인증키를 헤더 추가
        httpPost.addHeader("Authorization", "key=FCM 설정에 있는 Server Key");

        // json content type 추가
        httpPost.addHeader("content-type", "application/json");

        return httpPost;
    }

    /**
     * FCM에 보낼 메세지 JSON을 생성해서 반환한다.
     * @param title			: 푸시 제목
     * @param content		: 푸시 내용
     * @param pushTokenKey	: 푸시 보낼 푸시 토큰 키
     * @return JSONObject	: FCM Message에 맞는 json 생성
     * @since 2021.02.09
     * @author Lim.sung.jin
     */
    private JSONObject getFcmMessage(String title, String content, String pushTokenKey) throws JSONException {

        // FCM 으로 보낼 파라미터 생성
        JSONObject rootObj = new JSONObject();
        JSONObject dataObj = new JSONObject();
        JSONObject notificationObj = new JSONObject();
        JSONArray regIdList = new JSONArray();

        // 타이틀
        notificationObj.put("title", sendPushVO.getMsgTitle());
        
        // 내용
        notificationObj.put("body", sendPushVO.getMsgContent());

        // 사운드 (default : "default", custom : "alarm.wav"(system noti의 앱이 가지고 있는 alarm.wav를 싪행시킨다.))
        // Android : res/raw/alarm.wav
        // iOS : 링크 참조 shorturl.at/cjCF6
        notificationObj.put("sound", "alarm.wav");
        
        // FCM PUSH를 보낼 TOKEN 값 셋팅 (여러개 put 하면, 여러명에게 보낼 수 있다)
        regIdList.put(pushTokenKey);

        // json 합치기
        
        // iOS 시스템 noti를 위해, notification obj으로 감싼다.
        // android도 마찬가지로 시스템 noti로 인식한다.
        // 앱이 종료되어 있을때는 앱 시스템 noti로 작동된다.
        rootObj.put("notification", notificationObj); 
        rootObj.put("data", dataObj);
        rootObj.put("registration_ids", regIdList);
        
        // iOS ASPN 을 위해 content_available을 true로 설정한다.
        // content_available : 메시지가 FCM 연결 서버를 거치지 않고 APN을 통해 자동 알림으로 전송
        rootObj.put("content_available", true);

        return rootObj;

    }

 

반응형