Не могу настроить Parse и Push Notifications


#1

Привет. Прохожу курс parse. Застрял на push notifications. Сервер работает нормально, данные отправляются/принимаются. Push в аккаунте на сайте apple настроен правильно. Если использовать Pusher и отправлять пуши напрямую используя сертификат, всё приходит и работает. Не получается настроить сам parse для отправки push. Судя по документации, способ как в курсе больше не поддерживается. Может кто-нибудь проходил курс недавно, поделитесь кодом, как отправляли уведомления и как у вас настроены методы в AppDelegate.


#2

Parse на своем серваке установлен?


#3

Да. Арендовал виртуальный сервер


#4

Содержимое index.js можете показать?


#5
// Example express application adding the parse-server module to expose Pars// compatible API routes.

var express = require('express');
var ParseServer = require('parse-server').ParseServer;
var path = require('path');

var databaseUri = process.env.DATABASE_URI || process.env.MONGODB_URI;

if (!databaseUri) {
  console.log('DATABASE_URI not specified, falling back to localhost.');
}

var api = new ParseServer({
  databaseURI: databaseUri || 'mongodb://localhost:27017/parseApp',
  cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
  appId: process.env.APP_ID || 'id',
  masterKey: process.env.MASTER_KEY || 'key', //Add your master key here. Keep it secret!

  serverURL: process.env.SERVER_URL || 'http://localhost:1337/parse',  // Don't forget to change to https if needed
  push: {
    ios: [
    {
      pfx: '/Certificates.p12',
      bundleId: 'com.ayatsev.parse',
      production: false
    }
  ]
}
  liveQuery: {
    classNames: ["Posts", "Comments"] // List of classes to support for query subscriptions
  }
});
// 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 app = express();

// 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
var mountPath = process.env.PARSE_MOUNT || '/parse/parseApp';
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!');
});

#6

Сертификат лежит в папке с index.js


#7

Так не пойдет, нужен полный путь до сертификата и тогда все заработает)


#8

т.е. ~/parsedirectory/certname.p12 ?


#9

В этом я, к сожалению, не силен, погугли команды для убунту(если у тебя она) для получения пути к файлу(How get file path ubuntu) и после этого уже перезапусти Parse Server и пробуй получить нотификацию. Удачи)


#10

Ок. Спасибо. буду пробовать


#11

Указал полный путь, та же картина. Выдаёт в консоль


#12

В общем. Путь нужно было вообще указать ка ‘certificate.p12’, положив его в каталог с index.js. Так же была пропущена запятая в одном месте. В итоге сертификат подхватился и можно отправить push из parsedashboard например, или с помощью curl в терминале. Но вопрос остался. Как отправить client push из кода приложения? Судя по документации, это теперь невозможно сделать из соображения безопасности. Теперь рекомендуют использовать cloud functions, которые, я так понимаю написаны на java. Кто-нибудь работал с cloud code, может есть какой-нибудь толковый туториал по этому делу? Java код вроде понятен, но не зная синтаксиса ничего не напишешь. Так же не понятно, где именно писать этот код


#13

Насчет пути до сертификата: Не важно где он лежит, я его где только не клал и нужно было только правильно прописать путь, но то что у вас заработало - это отлично. Насчет клиенских пушей: попробуйте посмотреть здесь.


#14

И да, забыл по “где писать этот код”: по пути ниже(скрин) лежит файл main.js, в нем и пишется все)


#15

Написал функцию в main.js

Parse.Cloud.define("pushUser", function(req, res) {

 var userQuery = new Parse.Query(Parse.User);
 userQuery.equalTo("username", "b");
 var pushQuery = new Parse.Query(Parse.Installation);
 pushQuery.matchesQuery("user", userQuery);

 Parse.Push.send({
        where: pushQuery,
        data: {
        alert: "Hello world",
        badge: "Increment"
        sound: "default",
        }
    }, {success: function() {
        console.log("Push Ok");
        }, error: function(error) {
         console.log("Push Error" + error.message);
        }, useMasterKey: true}); 
});

В коде вызываю её так

PFCloud.callFunction(inBackground: "pushUser", withParameters: nil)

Выдаёт такую ошибку

Может кто знает js и может проверить ошибки в функции? Функцию писал по шаблонам документации на Parse


#16

К сожалению именно в синтаксисе js не силен( Попробуйте найти телеграм чат по java script, думаю должен такой быть, в таких чатах быстро помогают.


#17

Довёл всё в итоге до рабочего состояния. Были ошибки в коде java функции на сервере. Так же в этом туториале http://swiftbook.ru/tutorials/parse-server немного не правильно настроен index.js файл: сервер будет работать, а вот cloud-функции не будут исполняться, ругаясь в консоли на неверный формат JSON. В общем, как я писал выше, теперь отправка пушей из кода самого приложения не поддерживается из соображений безопасности. Только через cloud-функцию. Скрины содержимого index.js и main.js прикладываю ниже, может кому пригодится

Вызов функции:

 PFCloud.callFunction(inBackground: "pushUser", withParameters: [ "message" : self.chatTextView.text, "username" : self.recipientName! ], block: { (any, error) in
                    if let error = error {
                        print(error.localizedDescription + "error error error")
                    }
                })