【问题标题】:Grails Firebase Cloud Messaging PluginGrails Firebase 云消息传递插件
【发布时间】:2016-06-16 19:12:58
【问题描述】:

我希望将发送下游 Android GCM 通知的应用程序服务器移植到 Firebase Cloud Messaging。我目前正在使用 Grails 的 Android GCM 插件来发送下游消息。

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

我没有看到用于发送下游消息的 Grails FCM 插件。我是错过了什么还是它还不存在?

【问题讨论】:

    标签: android grails google-cloud-messaging


    【解决方案1】:

    我决定直接从 Grails 发出一个 Http 请求。我没有足够的声誉来发布超过 2 个链接,所以我将它们包装在代码示例中,抱歉。每

    https://firebase.google.com/docs/cloud-messaging/http-server-ref#interpret-downstream
    

    500-599 范围内的错误(例如 500 或 503)表示存在 尝试连接时 FCM 连接服务器出现内部错误 处理请求,或者服务器暂时不可用 (例如,由于超时)。发件人必须稍后重试,兑现 响应中包含的任何 Retry-After 标头。 应用服务器 必须实施指数退避

    所以我决定使用 Google 的 Http Java Client,它提供指数回退

    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
    

    对于用例示例,添加依赖项:

    compile 'com.google.http-client:google-http-client:1.22.0'
    compile 'com.google.http-client:google-http-client-jackson2:1.22.0'
    

    然后使用 HTTP Post Request 示例实现一个简单的控制器

    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 服务器密钥。您可以通过登录 Firebase 控制台找到您的 FCM 服务器密钥:

    https://console.firebase.google.com
    

    然后进入项目设置->云消息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2018-02-06
      • 1970-01-01
      相关资源
      最近更新 更多