중요 태그

2019년 1월 2일 수요일

FCM 서버구현하기(HTTP v1 동작 - 자바 & JSP )

1. 일단 URL은 아래와 같습니다. 중간에 FCM 프로젝트 ID가 들어 갑니다.

https://fcm.googleapis.com/v1/projects/[프로젝트 ID]/messages:send

2. 기존에 key 부분은 아래와 같이 변경됩니다. Token이 얻어 오는 부분은 따로 구현해야됩니다. Header 부분에 들어갑니다.

Authorization: Bearer [valid Oauth 2.0 token]

3. 보내는 메시지 부분도 아래와 같이 약간 변경이 되었기 때문에 확인은 해보셔야합니다. 아래 예제는 FCM에 있는 내용입니다. 보내는 부분에 topic로 되어 있지만 사용자의 FCM TOKEN으로 보내려면 "topic": "news", 부분을 "token" : "[PUSH TOKEN]", 으로 변경하시면 됩니다.

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    }
  }
}

4. 서버 Token 얻어오기
- 일단 라이브러리가 필요합니다. https://developers.google.com/api-client-library/?hl=ko 주소에서 다운로드 받아서 라이브러리 추가 하시고 JSP라면 WEB-INF/lib에 넣으셔야 동작합니다.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
 private String getAccessToken() {
      List scopes = new ArrayList();
      scopes.add("https://www.googleapis.com/auth/firebase.messaging"); // 서버를 사용할 범위 저는 FCM만 사용하기 때문에 위와 같이 했습니다.

      FileInputStream fs = null;
      GoogleCredential googleCredential = null; // 위에 라이브러리에 있는 클래스 입니다.
      try {
           fs = new FileInputStream("[FCM 서버 관련 JSON 파일 PATH]");
           googleCredential =  GoogleCredential.fromStream(fs).createScoped(scopes);
           googleCredential.refreshToken();
      } catch (FileNotFoundException e) {
           return null;
      } catch (IOException e) {
           return null;
      }
      return googleCredential.getAccessToken(); 
 }

5 Push 보내는 방법, Body 구성 부분은 위 3번을 참조하세요.

 public String send(String appos, String userToken, String title, String message) throws IOException {
      String token = getAccessToken();

      URL url = new URL(_fcmUrl); 
      _http = (HttpURLConnection) url.openConnection(); 
      _http.setRequestMethod("POST"); 
      _http.setRequestProperty("Content-Type", "application/json");
      _http.setRequestProperty("Authorization", "Bearer " + token); 
      _http.setDoOutput(true);

      OutputStream os = _http.getOutputStream(); 
      String body = "";
      body += "{\n";
      body += "\"message\":{\n";
      body += "\"token\" : \"" + userToken + "\",\n";
      body += "\"notification\" : {\n";
      body += "\"body\" : \"This is an FCM notification message!\",\n";
      body += "\"title\" : \"FCM Message\",\n";
      body += "},\n";
      body += "}\n";
      body += "}\n";
 
      os.write(body.getBytes()); 
      os.flush(); 
      os.close();
}

댓글 없음: