Android Grails Firebase云消息传递插件
我正在寻找端口应用服务器发送下游Android GCM通知到Firebase云消息。我目前正在使用Grails的Android GCM插件发送下游消息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
我没有看到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
}
}
}
然后转到项目设置->云消息