2016-06-16 4 views
0

Firebase Cloud Messaging으로 다운 스트림 Android GCM 알림을 보내는 애플리케이션 서버를 이식하려고합니다. 현재 Grails가 다운 스트림 메시지를 보내려면 Android GCM 플러그인을 사용하고 있습니다.Grails Firebase 클라우드 메시징 플러그인

https://grails.org/plugin/android-gcm

나는 다운 스트림 메시지를 보낼 수있는 Grails의 FCM 플러그인을 볼 수 없습니다. 나는 뭔가를 놓치고 있거나 아직 존재하지 않습니까?

답변

3

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 서버 키는 중포 기지 콘솔에 로그인하여 찾을 수 있습니다

관련 문제