2015-11-25 30 views
0

我試圖在解析雲服務中實現一次PUSH通知訂閱。這裏是我的模型:Parse.Push.send成功可能稱爲太快

  • Installation.user - 指針User
  • User - teamString
  • Subscription - emailString),statusString),user(指針User

作爲一個用戶,我可以說 - 發送PUSH通知(s),t o我所有的設備,當用戶email成爲status,並且此用戶位於我的team。用戶可以有很多訂閱。用戶可以手動取消訂閱(通過OS X,iOS,Android,...應用程序)或自動取消訂閱 - 當用戶收到PUSH通知時,應該自動取消訂閱。他可以再次訂閱,沒問題,但自動取消是必須的。這些訂閱是基於用戶的,用戶可以在設備上看到它們。

我寫了Parse Cloud函數,它由兩部分組成。

發送PUSH

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刪除,
  • 解析開始處理我與保存query推動,執行query,它返回零個對象,因爲我已經在Parse.Push.sendsuccess刪除Subscription對象。

對不起,對嗎?有誰知道解析內部?如果我是對的,你建議我應該怎麼做來實現基於自定義查詢的一次PUSH通知?

+0

我懷疑你是對的,API允許你指定一個發送日期,所以自然是異步的。考慮更改查詢,以便首先獲取所有安裝,然後進行查詢以匹配來自用戶數組的安裝用戶。 – Wain

+0

我也在想這件事,但對我來說似乎並不合適。我的意思是,Parse可以在內部更有效地執行它(如果它立即執行查詢)比我更有效。但這可能是不必要的恐懼。 – robertvojta

回答

0

以下是基於@ Wain提案的解決方案。

  • Subscription基於請求參數的對象。
  • User包含在此查詢中,因此,它將與Subscription對象一起提取。
  • 單獨製作Installation查詢基於User對象來自Subscription對象。
  • 發送推送分開Installation查詢。
  • 已刪除Subscription對象success

我可以安全地刪除這樣Subscription對象,它不與Installation查詢推送通知干擾。按預期工作。

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); 
    } 
    }); 
});