Grails에서 직접 Http 요청을 발행하여 앞으로 나아갈 것을 결정했습니다. 나는 2 개 이상의 링크를 게시하기에 충분한 명성이 없으므로 코드 샘플로 감쌌다. 미안하다.
당 500-599 범위
https://firebase.google.com/docs/cloud-messaging/http-server-ref#interpret-downstream
오류 (예를 들면 500 또는 503) 프로세스에 요청을 시도하고, 또는 서버인지하면서 FCM 연결 서버 내부 에러가 되었음을 나타낼 일시적으로 사용할 수 없으므로 (예 : 시간 초과로 인해). 보낸 사람은 응답에 포함 된 모든 Retry-After 헤더를 에게 알리고 나중에 다시 시도해야합니다. 응용 프로그램 서버 은 지수 백 오프을 구현해야합니다.
이
compile 'com.google.http-client:google-http-client:1.22.0'
compile 'com.google.http-client:google-http-client-jackson2:1.22.0'
그런 다음 사용하여 간단한 컨트롤러를 구현 :
그래서 지수 백 오프
https://developers.google.com/api-client-library/java/google-http-java-client/
https://developers.google.com/api-client-library/java/google-http-java-client/backoff
사용 사례의 예를 들어이 종속성을 추가 제공하는 구글의 HTTP 자바 클라이언트를 사용하기로 결정 HTTP 게시 요청 예
https://firebase.google.com/docs/cloud-messaging/downstream
import com.google.api.client.http.javanet.NetHttpTransport
import com.google.api.client.http.HttpBackOffUnsuccessfulResponseHandler
import com.google.api.client.http.HttpTransport
import com.google.api.client.http.HttpRequest
import com.google.api.client.http.HttpResponse
import com.google.api.client.http.GenericUrl
import com.google.api.client.http.HttpUnsuccessfulResponseHandler;
import com.google.api.client.http.json.JsonHttpContent
import com.google.api.client.json.jackson2.JacksonFactory
import com.google.api.client.util.ExponentialBackOff
import com.google.api.client.http.HttpHeaders
import com.google.api.client.http.HttpResponseException
class MyPushController {
def push(String token){
def postJson = [:]
def data = [:]
data['score'] = '5x1'
data['time'] = '15:10'
postJson['data'] = data
postJson['to'] = token
log.info "postJson: ${postJson}"
HttpTransport transport = new NetHttpTransport()
HttpRequest request = transport.createRequestFactory().buildPostRequest(new GenericUrl("https://fcm.googleapis.com/fcm/send"), new JsonHttpContent(new JacksonFactory(), postJson));
HttpHeaders reqHeaders = new HttpHeaders()
reqHeaders.setAuthorization("key=${grailsApplication.config.android.fcm.api.key}")
reqHeaders.setAccept("application/json")
reqHeaders.setContentType("application/json")
request.setHeaders(reqHeaders)
request.setUnsuccessfulResponseHandler(new HttpBackOffUnsuccessfulResponseHandler(new ExponentialBackOff.Builder()
.setInitialIntervalMillis(500)
.setMaxElapsedTimeMillis(900000)
.setMaxIntervalMillis(6000)
.setMultiplier(1.5)
.setRandomizationFactor(0.5)
.build()
))
try{
HttpResponse response = request.execute();
InputStream is = response.getContent()
BufferedReader br = new BufferedReader(new InputStreamReader(is))
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
ObjectMapper mapper = new ObjectMapper()
Map<String, Object> responseMap = mapper.readValue(sb.toString(), new TypeReference<Map<String, Object>>(){})
// Process response JSON per https://firebase.google.com/docs/cloud-messaging/server#response
if(responseMap && (responseMap['failure'] != 0 || responseMap['canonical_ids'] != 0)){
if(responseMap['message_id'] && responseMap['registration_id']){
log.info "New push token, setting to ${responseMap['registration_id']}"
// TODO Notify backend that token has changed, i.e. update
}
}else{
def results = responseMap['results']
if(results){
results.each{
if(it['error']){
if(it['error'] == "NotRegistered"){
log.info 'NotRegistered, updating AppToken to null'
// TODO Notify backend this token is no longer valid, i.e. delete
}
}
}
}
}
}
render responseMap as JSON
}catch(HttpResponseException e){
log.error "Error: ${e.toString()}"
render (['SC' : e.getStatusCode(), 'M' : e.getStatusMessage() ]) as JSON
}
}
}
$ {grailsApplication.config.android.fcm.api.key}를 FCM 서버 키로 바꾸십시오. -> 클라우드 메시징
https://console.firebase.google.com
그런 다음 프로젝트 설정으로 이동 : 귀하의 FCM 서버 키는 중포 기지 콘솔에 로그인하여 찾을 수 있습니다