Android Grails Firebase云消息传递插件

Android Grails Firebase云消息传递插件,android,grails,google-cloud-messaging,Android,Grails,Google Cloud Messaging,我正在寻找端口应用服务器发送下游Android GCM通知到Firebase云消息。我目前正在使用Grails的Android GCM插件发送下游消息 我没有看到Grails FCM插件可以发送下游消息。我错过了什么或者它还不存在?我决定直接从Grails发出Http请求,继续前进。我没有足够的声誉发布超过2个链接,所以我用代码示例包装了它们,对不起。 https://firebase.google.com/docs/cloud-messaging/http-server-ref#interp

我正在寻找端口应用服务器发送下游Android GCM通知到Firebase云消息。我目前正在使用Grails的Android GCM插件发送下游消息


我没有看到Grails FCM插件可以发送下游消息。我错过了什么或者它还不存在?

我决定直接从Grails发出Http请求,继续前进。我没有足够的声誉发布超过2个链接,所以我用代码示例包装了它们,对不起。

https://firebase.google.com/docs/cloud-messaging/http-server-ref#interpret-downstream
500-599范围内的错误(如500或503)表明 尝试连接时FCM连接服务器中存在内部错误 处理请求,或者服务器暂时不可用 (例如,由于超时)。发件人必须稍后重试,并接受 响应中包含头之后的任何重试应用服务器 必须实施指数退避

所以我决定使用谷歌的Http Java客户端,它提供指数级的回退

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'
然后使用HTTPPOST请求示例实现一个简单的控制器

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

        }

  }

}

然后转到Project Settings->CLOUD MESSAGING

我决定通过直接从Grails发出Http请求向前推进。我没有足够的声誉发布超过2个链接,所以我用代码示例包装了它们,对不起。

https://firebase.google.com/docs/cloud-messaging/http-server-ref#interpret-downstream
500-599范围内的错误(如500或503)表明 尝试连接时FCM连接服务器中存在内部错误 处理请求,或者服务器暂时不可用 (例如,由于超时)。发件人必须稍后重试,并接受 响应中包含头之后的任何重试应用服务器 必须实施指数退避

所以我决定使用谷歌的Http Java客户端,它提供指数级的回退

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'
然后使用HTTPPOST请求示例实现一个简单的控制器

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

        }

  }

}
然后转到项目设置->云消息