0
votes

I'm trying to make a push notification, I had set my .p12 files in parse-server/certs folder. Here is my code in my index.js:

var api = new ParseServer({  
    databaseURI: process.env.DATABASE_URI || 'mongodb://localhost:27017/dev',  
    cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
    appId: 'xx',  
    masterKey: 'xx',
    fileKey: 'xx',  
    clientKey: 'xx',
    serverURL: 'xx',
    push: {
    ios: [
      {
        pdx: 'certs/ParsePushDevelopmentCertificate.p12', // Dev PFX or P12
        bundleId: 'bundleId',
        production: false // Dev
      }
    ]
  }
});

I would like to send push notification by cloud code. So here is my main.js:

Parse.Cloud.define("pushToAll", function (request, response) {
    var message = request.params.message;
    if (message != null && message !== "") {
        message = message.trim();
    } else {
     response.error("Must provide \"message\" in JSON data");
     return;
    }

    // Can see this at https://www.parse.com/apps/{APP_NAME}/cloud_code/log
    var logMessage = "Sending \"{0}\" to all installations".format(message);
    console.log(logMessage);

    var pushQuery = new Parse.Query(Parse.Installation);
    // pushQuery.containedIn("deviceType", ["ios", "android"]); // errors if no iOS certificate

    // Send push notification to query
    Parse.Push.send({
        where: pushQuery, // Set our installation query
        data: {
            alert: message
            }
        }, {
        success: function () {
            // Push was successful
            console.log("Message was sent successfully");
            response.success('true');
        },
        error: function (error) {
            response.error(error);
        }
   , useMasterKey: true});
});

And I call it in my Xcode project:

[PFCloud callFunctionInBackground:@"pushToAll" withParameters:@{@"message" : @"test"} block:^(id object, NSError *error) {
    if (!error) {
        NSLog(@"YES");
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Try Again !" message:@"Check your network" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
    }
}];

But that doesn't work: [Error]: {"code":1,"message":"Internal server error."} (Code: 1, Version: 1.12.0)

On Parse.com, I've "Installation" field in my DB: Screenshot

Have you got any idea ?

1
Make sure that you are able to connect to Parse - Server first. Send something up or pull something down to make sure that your app is connected correctly. - Dan Levy
@DanL Yes it works fine : add/delete object, other PFCloud method works fine, but PFCloud for notification pushes doesn't work. - Vjardel
If you set both production and development cert in the config you will get at least one error everytime in console because the server tries to send it both ways and obviously one of them always fail, you should have seperate parse server for dev and production in this moment... Provide some logs what happens when the cloud code runs - Mazel Tov

1 Answers

2
votes

My cloud code wasn't right, here is the good code:

Parse.Cloud.define("pushToAll", function (request, response) {
    var message = request.params.message;
    console.log(message);
    if (message != null && message !== "") {
        message = message.trim();
    } else {
     response.error("Must provide \"message\" in JSON data");
     return;
    }

    // Can see this at https://www.parse.com/apps/{APP_NAME}/cloud_code/log
    // var logMessage = "Sending to all installations".format(message);
    // console.log(logMessage);

    var pushQuery = new Parse.Query(Parse.Installation);
    // pushQuery.containedIn("deviceType", ["ios", "android"]); // errors if no iOS certificate

    // Send push notification to query
    Parse.Push.send({
        where: pushQuery, // Set our installation query
        data: {
            "alert": message
            }
        }, {
        success: function () {
            // Push was successful
            console.log("Message was sent successfully");
            response.success('true');
        },
        error: function (error) {
            response.error(error);
        }
   , useMasterKey: true});
});