반응형
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;
}
반응형
'Programming > Java' 카테고리의 다른 글
[Java/Gradle] RS232 통신 (java 11 or higher) (0) | 2021.12.04 |
---|---|
[Java/Gradle] RS232 에러 > Caused by: java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path (0) | 2021.12.04 |
[Java/백준 알고리즘] 어린왕자 (0) | 2020.03.12 |
[Java/백준 알고리즘] 피보나치 수열 (0) | 2020.03.03 |
[Java, 백준 알고리즘] 터렛 (0) | 2020.02.27 |