gpt4 book ai didi

android - 当 Firebase 有新条目时如何向客户端推送通知?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:42 24 4
gpt4 key购买 nike

我想知道是否有可能在 Firebase 在特定实体上添加新子项时向 android 移动设备发送推送通知。例如,假设 Firebase 上有一个名为 Tasks 的实体。每当将新任务添加到该 firebase 集合时,都会触发“child_added”事件,然后以某种方式将推送通知发送到移动客户端。触发器是 child_added 事件。但是,我不确定是否可以直接从 Firebase 事件发送推送通知。

最佳答案

您可以创建一个非常简单的 node.js 服务器或 java servlet(根据您的语言偏好),然后使用 firebase server sdk 添加 childEventListener。当值发生变化时,您可以使用 FCM 通过 http 协议(protocol)发送推送通知。我在我的应用程序中使用它,它非常可行且可靠。

注意:如果您将此流程用于 Android 应用程序,那么使用 Java 服务器 SDK 将是有益的,因为它与您在 Android 上拥有的几乎相似。

编辑:在对这个答案有了一些关注后,我想分享更多关于它的信息。

//在 this official firebase blog 上看到的示例 node.js 服务器

var firebase = require('firebase');
var request = require('request');

var API_KEY = "..."; // Your Firebase Cloud Server API key

firebase.initializeApp({
serviceAccount: ".json",
databaseURL: "https://.firebaseio.com/"
});
ref = firebase.database().ref();

function listenForNotificationRequests() {
var requests = ref.child('notificationRequests');
ref.on('child_added', function(requestSnapshot) {
var request = requestSnapshot.val();
sendNotificationToUser(
request.username,
request.message,
function() {
request.ref().remove();
}
);
}, function(error) {
console.error(error);
});
};

function sendNotificationToUser(username, message, onSuccess) {
request({
url: 'https://fcm.googleapis.com/fcm/send',
method: 'POST',
headers: {
'Content-Type' :' application/json',
'Authorization': 'key='+API_KEY
},
body: JSON.stringify({
notification: {
title: message
},
to : '/topics/user_'+username
})
}, function(error, response, body) {
if (error) { console.error(error); }
else if (response.statusCode >= 400) {
console.error('HTTP Error: '+response.statusCode+' - '+response.statusMessage);
}
else {
onSuccess();
}
});
}

// start listening
listenForNotificationRequests();

//我为了演示这个用例而制作的示例测试java servlet

@WebServlet("/TestServlet")
public class MainServlet extends HttpServlet {
* @see HttpServlet#HttpServlet()
*/
public MainServlet() {
super();

}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

// Get context and then relative path to saved json config file from
// firebase
ServletContext context = getServletContext();
String fullPath = context.getRealPath(FILE_PATH_FOR_JSON_SERVER_AUTH);


// Check if we actually got a file from above path
if (fullPath != null) {

} else {

}

// Setup connection to firebase database here
FirebaseOptions options = new FirebaseOptions.Builder().setServiceAccount(new FileInputStream(fullPath))
.setDatabaseUrl(FIREBASE_DATABSE_URL).build();


// Check to make sure we don't initialize firebase app each time webpage
// is refreshed
if (!exists) {

// If firebase app doesn't exist then initialize it here and set
// exists to true
FirebaseApp.initializeApp(options);
exists = true;



}


// Call this to begin listening *notify* node in firebase database for notifications
addNotificationListener(request, response);


}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

// Build apache httpclient POST request
HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(ENDPOINT_URL);


//Get the required id stored in lastMsgId tree map here
if (!(chatLogs.getLastMsgIdTreeMap().isEmpty())) {


sendToID = chatLogs.getLastMsgIdTreeMap().firstKey();
lstmsg = chatLogs.getLastMsgIdTreeMap().get(sendToID);
}

//Set up a unique id with concatenating sendToID and lstmsg
uniqueID = sendToID + lstmsg;
//Set up a previous id to check with unique id. To avoid instant duplicate notifications
previousID = fcmHelper.getPreviousid();

// Check uniqueId and PreviousID beforeSending
if (!(uniqueID.equals(previousID))) {
fcmHelper.setPreviousid(uniqueID);

//Check if device token and user Id hashmap is not null
if (!(userLogs.getUserIdAndFcmTokenHashMap().isEmpty())) {

//Get the device token of sendTo Id here
deviceToken = userLogs.getUserIdAndFcmTokenHashMap().get(sendToID);

// Create JSON object for downstream data/notification
JSONObject mainNotificationJsonObj = new JSONObject();
JSONObject outerBaseJsonObj = new JSONObject();
try {

// Notification payload has 'title' and 'body' key
mainNotificationJsonObj.put(TITLE, NEW_MESSAGE_RECEIVED);
mainNotificationJsonObj.put(BODY, lstmsg);
mainNotificationJsonObj.put(NOTIFICATION_SOUND, NOTIFICATION_SOUND_TYPE_DEFAULT);
//mainNotificationJsonObj.put(TAG, fcmHelper.getFcmTagId());
System.out.println("This is sentBy id =" + fcmHelper.getFcmTagId());

// This will be used in case of both 'notification' or 'data' payload
outerBaseJsonObj.put(TO, deviceToken);


// Set priority of notification. For instant chat setting
// high will
// wake device from idle state - HIGH BATTERY DRAIN
outerBaseJsonObj.put(PRIORITY_KEY, PRIORITY_HIGH);

// Specify required payload key here either 'data' or
// 'notification'. We can even use both payloads in single
// message
outerBaseJsonObj.put(NOTIFICATION, mainNotificationJsonObj);
} catch (JSONException e) {

e.printStackTrace();
}


// Setup http entity with json data and 'Content-Type' header
StringEntity requestEntity = new StringEntity(outerBaseJsonObj.toString(),
ContentType.APPLICATION_JSON);

// Setup required Authorization header
post.setHeader(AUTHORIZATION, FIREBASE_SERVER_KEY);

// Pass setup entity to post request here
post.setEntity(requestEntity);

// Execute apache http client post response
HttpResponse fcmResponse = client.execute(post);


// Get status code from FCM server to debug error and success
System.out.println(RESPONSE_CODE + fcmResponse.getStatusLine().getStatusCode());

// Get response entity from FCM server and read throw lines
BufferedReader rd = new BufferedReader(new InputStreamReader(fcmResponse.getEntity().getContent()));

StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}

if (response != null) {

// Print out the response to webpage
PrintWriter out;
out = response.getWriter();
out.println(result);
System.out.println("This is Result - " + result);
}
} else {
//Abort this process if conditions not met
post.abort();
System.out.println(THIS_MSG_ALREADY_SENT);
}

}

}





/*
* This is the main method to be called to setup notifications listener on server startup
*/

private void addNotificationListener(HttpServletRequest request, HttpServletResponse response) {


//Initialize Value event listener
lastMsgListener = new ValueEventListener() {

@Override
public void onDataChange(DataSnapshot arg0) {

// Clear idLastMessagerecivedhash map if not null
if (lastMsgIdTreeMap != null) {
lastMsgIdTreeMap.clear();
}



//Get lastmsg to be sent as notification here
lstmsg = (String) arg0.child(LAST_MESSAGE).getValue();

//Get sendToID here
String sendToID = (String) arg0.child(SEND_TO).getValue();

//Get Sent by ID here
sentBy = (String) arg0.child(SENT_BY).getValue();

//Set fcmTag ID here
fcmHelper.setFcmTagId(sentBy);

//Check if lstmsg is not null
if (lstmsg != null) {

// Create lastmsgTimestampHashMap here
lastMsgIdTreeMap.put(sendToID, lstmsg);



}
//Check for null again
if (lastMsgIdTreeMap != null) {

chatLogs.setLastMsgIdTreeMap(lastMsgIdTreeMap);

}

try {
doPost(request, response);
} catch (ServletException e) {

e.printStackTrace();
} catch (IOException e) {

e.printStackTrace();
}


}

@Override
public void onCancelled(DatabaseError arg0) {

}
};

//Set up database reference to notify node here
messageRef = FirebaseDatabase.getInstance().getReference().child(NOTIFY);

//Add value listener to database reference here
messageRef.addValueEventListener(lastMsgListener);



}

“Java servlet 只是一个个人测试。有些部分已经过编辑或删除,只是为了让您了解它的设置,这绝不是生产就绪的 servlet,请不要只是复制 - 粘贴。我鼓励你了解并构建你自己的。”

关于android - 当 Firebase 有新条目时如何向客户端推送通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39670667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com