Parse.Push.send的成功可能太早了

时间:2015-11-25 07:20:31

标签: parse-platform

我尝试在Parse Cloud服务中实施一次PUSH通知订阅。这是我的模特:

  • Installation.user - 指向User
  • 的指针
  • User - teamString
  • Subscription - emailString),statusString),user(指向User的指针)< / LI>

作为用户,我可以说 - 当email的用户变为status并且此用户位于我的team时,向我的所有设备发送推送通知。用户可以拥有多个订阅。用户可以手动取消订阅(通过OS X,iOS,Android,...应用程序)或自动取消订阅 - 当用户收到PUSH通知时,订阅应自动取消。他可以再次订阅,没问题,但自动取消是必须的。这些订阅是基于用户的,用户可以在设备上看到它们。

我写了Parse Cloud函数,它由两部分组成。

发送推送

Parse.Push.send({
    where : query,
    data : pushData
  },
  { success: function() {
    response.success('OK');
  }, error: function(err) {
    console.log(err);
    response.error({ error: err });
  }});

这确实有效。我query的作品和PUSH收到了。

删除订阅

deleteSubscriptionQuery.find({
          success: function(objects) {
            Parse.Object.destroyAll(objects, {
              success: function() {
                response.success('OK');
              },
              error: function(err) {
                console.log(err);
                response.error(err);
              }
            });
          },
          error: function(err) {
            console.log(err);
            response.error(err);
          },
        });

这确实有效。我的deleteSubscriptionQuery正常工作并删除了正确的订阅。

结合在一起

Parse.Push.send({
    where : query,
    data : pushData
  },
  { success: function() {
    deleteSubscriptionQuery.find({
      success: function(objects) {
        Parse.Object.destroyAll(objects, {
          success: function() {
            response.success('OK');
          },
          error: function(err) {
            console.log(err);
            response.error(err);
          }
        });
      },
      error: function(err) {
        console.log(err);
        response.error(err);
      },
    });
  }, error: function(err) {
    console.log(err);
    response.error({ error: err });
  }});

这不起作用并报告成功。似乎问题出在Parse.Push.send,即。 success过早被召唤。我假设Parse.Push.send并未真正发送通知,但只是安排通知,并在成功安排时调用success。如果是,则应重命名为Parse.Push.schedule。另外我假设它们是按照我的查询安排的(查询保存,而不是真正执行),因此,我怀疑这个解决方案因为以下原因而无法正常工作:

  • Parse.Push.send - 保存我的query并致电success
  • Subscription个对象将在success
  • 中删除
  • Parse开始使用保存的query处理我的推送,执行query并返回零对象,因为我已经删除Subscription success中的Parse.Push.send个对象}}。

我是对的吗?有谁知道Parse内部人员?如果我是对的,你建议我应该做些什么来实现基于自定义查询的一次性PUSH通知?

1 个答案:

答案 0 :(得分:0)

以下是基于@ Wain提案的解决方案。

  • 根据请求参数获取Subscription个对象。
  • User包含在此查询中,因此,它与Subscription个对象一起提取。
  • 根据Installation个对象中的User个对象进行单独的Subscription查询。
  • 将PUSH发送到单独的Installation查询。
  • Subscription上删除已经提取的success个对象。

我可以安全地以这种方式删除Subscription个对象,并且它不会干扰Installation查询PUSH通知。是否按预期工作。

Parse.Cloud.define("status", function(request, response) {
  //
  // Input validation
  //
  if (!request.params.hasOwnProperty("status")) {
    response.error("Missing status parameter");
    return;
  }
  var statusQuo = request.params["status"]
  if (!statusQuo.hasOwnProperty("email") || !statusQuo.hasOwnProperty("team") || !statusQuo.hasOwnProperty("status")) {
    response.error("Invalid status dictionary");
    return;
  }

  var status = statusQuo["status"]
  if ( status != "Available" ) {
    response.success('OK');
    return;
  }
  var email = statusQuo["email"]
  var team = statusQuo["team"]

  Parse.Cloud.useMasterKey();

  //
  // Find subscriptions
  //
  var usersQuery = new Parse.Query(Parse.User);
  usersQuery.equalTo('team', team);

  var Subscription = Parse.Object.extend("Subscription");
  var subscriptionsQuery = new Parse.Query(Subscription);
  subscriptionsQuery.include('user');
  subscriptionsQuery.equalTo('status', status);
  subscriptionsQuery.equalTo('email', email);
  subscriptionsQuery.matchesQuery('user', usersQuery);

  subscriptionsQuery.find({
    success: function(subscriptions) {
      var users = subscriptions.map(function(subscription) {
        return subscription.get('user');
      });

      //
      // Query for notifications / installations
      //
      var query = new Parse.Query(Parse.Installation);
      query.equalTo('channels', 'status');
      query.containedIn('user', users);

      //
      // Push notifications data
      //
      var pushData = { 'status' : statusQuo };
      var apsData = { 'sound' : '', 'alert' : email + ' became Available.' };
      pushData['aps'] = apsData

      Parse.Push.send({
        where : query,
        data : pushData
      },
      { success: function() {
        Parse.Object.destroyAll(subscriptions, {
          success: function() {
            response.success('OK');
          },
          error: function(err) {
            console.log(err);
            response.error(err);
          }
        });
      }, error: function(err) {
        console.log(err);
        response.error({ error: err });
      }});
    }, error: function(err) {
      console.log(err);
      response.error(err);
    }
  });
});