android #android-studio #push-notification #parse-server
#Android #android-studio #push-уведомление #parse-сервер
Вопрос:
В настоящее время я работаю над приложением для чата и хочу реализовать Push-уведомления сервера Parse. Я следую документации и добавляю весь необходимый код. Моя проблема в том, что я не вижу уведомления, хотя консоль сообщает мне, что оно было отправлено.
Это мой MainActivity.java где находится установка Parse.
@Override
protected void onCreate(Bundle savedInstanceState) {
notificationsPush();
createGraphicElements();
super.onCreate(savedInstanceState);
}
private void notificationsPush(){
ParseInstallation.getCurrentInstallation().saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null){
System.out.println("---------------------");
System.out.println("SUCCESS ON INSTALLATION");
System.out.println("----------------------");
ParsePush.subscribeInBackground("Chat", new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
System.out.println("----------------------");
System.out.println("SUCCESS ON CHANNEL");
System.out.println("----------------------");
} else {
System.out.println("----------------------");
System.out.println("ERROR ON CHANNEL: " e.getMessage());
System.out.println("CODE: " e.getCode());
System.out.println("----------------------");
}
}
});
}else{
System.out.println("---------------------");
System.out.println("ERROR ON INSTALLATION");
System.out.println("ERROR: " e.getMessage());
System.out.println("CODE: " e.getCode());
System.out.println("----------------------");
}
}
});
}
Это мои реализации в модуле graddle. (Есть также тот, который требуется для подключения к Firebase).
implementation platform('com.google.firebase:firebase-bom:28.4.1')
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-messaging'
//Parse Server
implementation "com.github.parse-community.Parse-SDK-Android:parse:1.26.0"
//PUSH Parse Server
implementation "com.github.parse-community.Parse-SDK-Android:fcm:1.26.0"
Это функции, которые я использую в своем ParseCloud (они включены main.js ).
Parse.Cloud.define("SendPush", function(request) {
var query = new Parse.Query(Parse.Installation);
query.exists("deviceToken");
// here you can add other conditions e.g. to send a push to sepcific users or channel etc.
var payload = {
alert: request.params.Message
// you can add other stuff here...
};
Parse.Push.send({
data: payload,
where: query
}, {
useMasterKey: true
})
.then(function() {
response.success("Push Sent!");
}, function(error) {
response.error("Error while trying to send push " error.message);
});
});
Parse.Cloud.define("SendPush2", function(request) {
var msg = request.params.Message;
var query = new Parse.Query(Parse.User);
var user = request.params.user;
query.equalTo("objectId", user);
Parse.Push.send({
where: query,
data:{
alert: {
"title" : msg,
"body" : msg
},
sound: 'default'
}
}, {
useMasterKey: true,
success: function(){
response.success("Push Sent!");
},
error: function(error){
response.error("Error while trying to send push " error.message);
}
});
});
Parse.Cloud.define("SendPush3", function(request, response) {
var userId = request.params.user;
var message = "sening a test message"; //request.params.message;
var queryUser = new Parse.Query(Parse.User);
queryUser.equalTo('objectId', userId);
var query = new Parse.Query(Parse.Installation);
query.matchesQuery('user', queryUser);
Parse.Push.send({
where: query,
data: {
alert: message,
badge: 0,
sound: 'default'
}
}, {
success: function() {
console.log('##### PUSH OK');
response.success();
},
error: function(error) {
console.log('##### PUSH ERROR');
response.error('ERROR');
},
useMasterKey: true
});
});
Finally, the piece of code of my app where I test those ParseCloud functions to send the notification.
private void sendMessage(){
if(messageEditText.getText().toString().length() > 0) {
String messageToSend = messageEditText.getText().toString();
messageEditText.setText("");
MessageBO messageBO = new MessageBO();
messageBO.setText(messageToSend);
messageBO.setUserIdSender(idUser);
messageBO.setUserIdReceiver(idContact);
insertMessage(messageBO.getUserIdSender().toString(),
messageBO.getUserIdReceiver().toString(),
messageBO.getText().toString());
enviarNotificacionPush(messageBO);
}
actualizarMensajes();
}
private void sendNotificationPush(MessageBO m){
HashMap<String,String> map = new HashMap<String, String>();
map.put("Message", m.getText().toString());
ParseCloud.callFunctionInBackground("SendPush",map, new FunctionCallback<Object>() {
@Override
public void done(Object object, ParseException e) {
if (e == null){
System.out.println("----------------------------");
System.out.println("NOTIFICATION SUCCES: " object);
System.out.println("----------------------------");
}else{
System.out.println("----------------------------");
System.out.println("ERROR ON NOTIFICATION PUSH: " e.getMessage());
System.out.println("CODE: " e.getCode());
System.out.println("----------------------------");
}
}
});
HashMap<String,String> map2 = new HashMap<String, String>();
map2.put("Message", m.getText().toString());
map2.put("user", idUser);
ParseCloud.callFunctionInBackground("SendPush2",map2, new FunctionCallback<Object>() {
@Override
public void done(Object object, ParseException e) {
if (e == null){
System.out.println("----------------------------");
System.out.println("NOTIFICATION 2.0 SUCCESS: " object);
System.out.println("----------------------------");
}else{
System.out.println("----------------------------");
System.out.println("ERROR ON NOTIFICATION PUSH 2.0: " e.getMessage());
System.out.println("CODE: " e.getCode());
System.out.println("----------------------------");
}
}
});
ParseCloud.callFunctionInBackground("SendPush3",map2, new FunctionCallback<Object>() {
@Override
public void done(Object object, ParseException e) {
if (e == null){
System.out.println("----------------------------");
System.out.println("NOTIFICACION 3.0 SUCCESS: " object);
System.out.println("----------------------------");
}else{
System.out.println("----------------------------");
System.out.println("ERROR ON NOTIFICACION PUSH 3.0: " e.getMessage());
System.out.println("CODE: " e.getCode());
System.out.println("----------------------------");
}
}
});
}
As you can see, I use 3 functions that send notifications, all of them said that it was a success, but in my android emulator never arrive a notification. I check my parse Dashboard and even though that it says that the notifications were sent, it also says 0 deliveries. I need your help please because I don’t know exactly what I’m doing wrong.
If you need, the info of my Android emulator is the following:
My android emulator info
[EDIT 1]
(I don’t know how to refer the comment that ask me to do it but anyways) Because I see that maybe you’ll need the installation class.
installation class
All installations are from the emulator due to I uninstall and install again the application. There is algo my smartphone, that is a Huawei (that also I can’t see notifications but I know thats due to Huawei problems with google services).
[EDIT 2]Hello again, here is my Parse Server configuration(aka the index.js
of my parse). I’m using the parse_server_example
repository by the way.
// Example express application adding the parse-server module to expose Parse
// compatible API routes.
const express = require('express');
const ParseServer = require('parse-server').ParseServer;
const path = require('path');
var ParseDashboard = require('parse-dashboard');
const args = process.argv || [];
const test = args.some(arg => arg.includes('jasmine'));
const databaseUri = process.env.DATABASE_URI || process.env.MONGODB_URI;
if (!databaseUri) {
console.log('DATABASE_URI not specified, falling back to localhost.');
}
const config = {
databaseURI: databaseUri || 'mongodb://admin:123@localhost:27017/ParseServer?authSource=admin',
cloud: process.env.CLOUD_CODE_MAIN || __dirname '/cloud/main.js',
appId: process.env.APP_ID || 'MY_APP_ID',
masterKey: process.env.MASTER_KEY || 'MY_MASTER_KEY', //Add your master key here. Keep it secret!
serverURL: process.env.SERVER_URL || 'http://192.168.10.100:1337/parse/', // Don't forget to change to https if needed
liveQuery: {
classNames: ['Posts', 'Comments'], // List of classes to support for query subscriptions
},
push: {
android: {
apiKey: 'AAAASP09btg:APA91bGxn3e0vJX0ri2DeFEWUjAODTCaP3mfCQ0la3oiIgNqNYUlj2THFlEwRjqnXGuI-8H_l5-0xZtyscn3yY4mRrAL5tNHYXrM8NBltgCwCx1gH8LFVvgAWubmV2Zsa5NkmD53vCeO'
}
}
};
// Client-keys like the javascript key or the .NET key are not necessary with parse-server
// If you wish you require them, you can set them as options in the initialization above:
// javascriptKey, restAPIKey, dotNetKey, clientKey
var configdashboard = {
"allowInsecureHTTP": true,
"apps": [
{
"serverURL": "http://192.168.10.100:1337/parse/",
"appId": "MY_APP_ID",
"masterKey": "MY_MASTER_KEY",
"appName": "ParseServer01"
}
],"users": [
{
"user": "root",
"pass": "123456"
}
]
};
var dashboard = new ParseDashboard(configdashboard,{allowInsecureHTTP:configdashboard.allowInsecureHTTP});
const app = express();
app.use('/dashboard', dashboard);
// Serve static assets from the /public folder
app.use('/public', express.static(path.join(__dirname, '/public')));
// Serve the Parse API on the /parse URL prefix
const mountPath = process.env.PARSE_MOUNT || '/parse';
if (!test) {
const api = new ParseServer(config);
app.use(mountPath, api);
}
// Parse Server plays nicely with the rest of your web routes
app.get('/', function (req, res) {
res.status(200).send('I dream of being a website. Please star the parse-server repo on GitHub!');
});
// There will be a test page available on the /test path of your server url
// Remove this before launching your app
app.get('/test', function (req, res) {
res.sendFile(path.join(__dirname, '/public/test.html'));
});
const port = process.env.PORT || 1337;
if (!test) {
const httpServer = require('http').createServer(app);
httpServer.listen(port, function () {
console.log('parse-server-example running on port ' port '.');
});
// This will enable the Live Query real-time server
ParseServer.createLiveQueryServer(httpServer);
}
module.exports = {
app,
config,
};
[РЕДАКТИРОВАТЬ 3] Еще раз здравствуйте, я пытался отправлять уведомления с помощью curl, и вот что происходит:
curl -X POST
-H "X-Parse-Application-Id: wPacsFQMmP" -H "X-Parse-Master-Key: DwonoEbeNf" -H "Content-Type: application/json" -d '{ "where": { "deviceType": { "$in": [ "android" ] } }, "data": { "title": "The Shining", "alert": "All work and no play makes Jack a dull boy." } }' http://192.168.10.100:1337/parse/push
{«результат»: true}[
Также в качестве дополнительной информации, когда я пытаюсь выполнить нажатие, используя только FCM (это означает, следуйте этой документации Firebase FCM), и результат в основном тот же, он говорит, что он был отправлен успешно, но я не вижу его на эмуляторе Android, даже на моем старом смартфоне (Nokia 6).
[РЕДАКТИРОВАТЬ 4] Я включаю verbose, и это то, что я нашел в своих журналах синтаксического анализа о функции SendPush cloud.
REQUEST for [POST] /parse/push: {\n \"channels\": [\n \"SignChat\"\n ],\n \"data\": {\n \"alert\": \"The Giants won against the Mets 2-3.\"\n }\n}",n "method": "POST",n "timestamp": "2021-10-28T20:25:27.623Z",n "url": "/parse/push"n },n {n "level": "verbose",n "message": "RESPONSE from [POST] /parse/functions/SendPush: {\n \"response\": {}\n}",n "result": {n "response": {}n },n "timestamp": "2021-10-28T20:25:27.619Z"n }
Комментарии:
1. Не могли бы вы поделиться тем, что вы видите в своем классе установки?
2. вы имеете в виду класс, который получил ParseInstallation.getCurrentInstallation() ?
3. Было бы лучше проверить на вашей панели инструментов.
4. Здравствуйте, я поместил изображение своих установок панели анализа в EDIT 1
5.
SendPush2
не будет работать, потому что вы не можете запросить класс установки, используя идентификатор пользователя.SendPush3
не будет работать, потому что у вас нетuser
указателя на ваш класс установки.SendPush
должно сработать. Что вы видите в своих журналах, ответах облачного кода и статусе отправки, когда используете его?
Ответ №1:
Для отправки push-уведомлений для устройств Android обязательными полями являются deviceToken
и GCMSenderID
.
Однако, согласно отправленному вами скриншоту, идентификатор GCMSenderId ваших установок пуст, и он необходим для отправки push-уведомлений.
В вашем MainActivity
случае вы явно не установили его, что необходимо для его правильного сохранения.
Вот пример кода, показывающий, как вы можете это сделать:
ParseInstallation installation = ParseInstallation.getCurrentInstallation();
installation.put("GCMSenderId", INSERT_YOUR_SENDER_ID);
installation.saveInBackground();
Как только оба поля будут заполнены, push-уведомление может работать правильно.
Комментарии:
1. Я использовал этот код, и он регистрирует идентификатор отправителя в поле. Однако он по-прежнему не отображается.
2. Каковы ваши результаты с панели мониторинга? Вы установили свои учетные данные FCM на стороне сервера?
3. В нем говорится, что результат работы функций Parse Cloud, которые я использую для отправки уведомлений, не определен. Да, я поместил ключ api FCM на сервер. Я начинаю думать, что, возможно, есть проблема с некоторыми php-кодами, которые я поместил в проект.