Я не вижу своего уведомления ParsePush на моем эмуляторе Android

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-кодами, которые я поместил в проект.