2016-02-09 119 views
3

我一直在使用QuickBlox在iOS和Android上向我們的應用發送推送通知。我正在使用Marmalade C++ SDK來開發應用程序。我有問題獲取登錄用戶的活動推送通知訂閱。QuickBlox REST API無法獲取推送通知訂閱列表

我已經從QB管理員面板檢查過,我正在使用的用戶有主動推送通知訂閱,但請求GET api.quickblox.com/subscriptions.json返回404未找到。

API方法Retrieve subscriptions的文檔指出,沒有需要與請求一起傳遞的參數。它需要的唯一信息是在頭部傳遞的QB令牌。令牌間接指定已登錄的用戶,因此它是有道理的,就是它所需要的。

然而,對於該方法的描述是

檢索訂閱針對其在授權令牌指定的設備。

但是這不可能完全正確,因爲無法知道哪個設備發出請求。我假設它意味着檢索用戶的訂閱。

在我們的應用程序中,只需在登錄用戶後執行檢索訂閱請求。我已確認登錄成功,其他API方法正常工作。

我得到404後,我嘗試爲create a new subscription爲當前設備的用戶。如果設備已存在訂閱,POST api.quickblox.com/subscriptions.json將返回201以獲得成功,但響應正文僅爲[]。如果之前沒有設備訂閱,請求返回201,但響應主體包含創建的訂閱信息。

我能夠創建和刪除通知事件就好,他們交付給設備就好了。我的問題是,我無法輕易確認設備是否具有有效的訂閱,並且我無法知道該訂閱的ID是什麼,因此我可以在用戶註銷時將其刪除。

+0

我有同樣的問題,這是爲你解決嗎? –

回答

1

OK,我已經設法解決這個問題,我也被迷惑的文件,並沒有解釋清楚這意味着什麼用

檢索訂閱的這是在 指定的設備授權令牌

由於本文檔的模糊用語,我還遇到了讓用戶註冊訂閱的問題。

爲了獲得Quickblox授權令牌(會話或用戶會話),您必須在之前生成的使用文檔中描述的參數的HMAC SHA1簽名:

  • APPLICATION_ID(API應用標識符)
  • AUTH_KEY(驗證密鑰)
  • 時間戳(UNIX時間戳)
  • 隨機數
  • (Unix時間戳)
  • 用戶[登錄]
  • 用戶[口令]
  • 簽名(HMAC SHA1,如下所述)

使用這些參數和它們的值應創建一個字符串,它看起來像這樣:

「APPLICATION_ID = 22 & AUTH_KEY = wJHd4cQSxpQGWx5 &隨機數= 33432 &時間戳= 1326966962 &用戶[登錄] [email protected] &用戶[口令] = test123'

然後HMAC SHA1使用你的應用程序祕密作爲HMAC祕密來獲取請求的簽名,例如, C#

 using (HMACSHA1 hmac = new HMACSHA1(Encoding.ASCII.GetBytes(secret))) 
     { 
      hmac.Initialize(); 
      byte[] buffer = Encoding.ASCII.GetBytes(value); 
      return BitConverter.ToString(hmac.ComputeHash(buffer)).Replace("-", "").ToLower(); 
     } 

一旦你有了這個簽名,你就可以發送請求到Quickblox獲得授權令牌,在這個例子中它是一個用戶會話令牌。

您需要發送所有用來生成簽名,包括生成的簽名的參數,在請求的主體,並POST它的端點/session.json

例如 POST/session.json

{ 
    "application_id":"2", 
    "auth_key":"DtF9cZPqTF8Wy9Q", 
    "timestamp":"1333630392", 
    "nonce":"1236221330", 
    "user": 
    { 
    login: "[email protected]", 
    password: "test123" 
    }, 
    "signature":"eb0ec2d8c8184a3e62b41da2afb6e8d690577fa4" 
} 

你得到的響應應該有授權令牌,我們需要爲用戶會話的請求。

爲了解決您的問題

正如您所提到,此令牌不用於獲取用戶訂閱工作,並返回一個沒有發現,儘管認購推送通知已經存在的和被鏈接到用戶。

發生這種情況的原因是因爲用戶與設備有1:M的關係,並且Quickblox不會返回所有訂閱,只會訂閱與請求源自的特定設備有關的訂閱,但您必須告訴它。

我們缺少的元素是將設備參數添加到授權令牌,該授權令牌描述得非常糟糕,(如果在的文檔中)。

爲了使其正常工作,我們需要將device[udid]device[platform]添加到授權請求中。這標識了用戶以及他們正在使用QuickBlox的特定設備。

要做到這一點,做同樣如上所述,但價值,你HMAC SHA1現在看起來應該是這樣

「APPLICATION_ID = 22 & AUTH_KEY = wJHd4cQSxpQGWx5 &設備[臺] =機器人&設備[ UDID] = 2374682h23780239j &隨機數= 33432 &時間戳= 1326966962 &用戶[登錄] [email protected] &用戶[口令] = test123'

請注意,如果你把鑰匙放在了不同的順序,你會得到一個「意外的簽名」的錯誤,設備[臺]一定要來AUTH_KEY等後...

使用此字符串來生成你的簽名,並然後使用與上述類似的請求發送它:

例如 POST/session.json

{ 
    "application_id":"2", 
    "auth_key":"DtF9cZPqTF8Wy9Q", 
    "timestamp":"1333630392", 
    "nonce":"1236221330", 
    "user": 
    { 
    login:"[email protected]", 
    password:"test123" 
    }, 
    "device": 
    { 
    "platform":"android", 
    "udid":"2374682h23780239j" 
    } 
    "signature":"5t4d2d8c81848b6c4s41da2afb6e8d690889bc4" 
} 

你Quickblox回來應該再被用作QB-Token頭值使用請求訂閱時令牌: GET/subscriptions.json

提高門票和淘我設法找到後上網這個解決方案絆倒了這個代碼並研究了一會兒。

Sourcecode for Blackberry PushAuth using Quickblox

我希望這可以幫助別人卡住這個誰,因爲我認爲阿列克西GRON已經2個月後解決了這個問題。

+0

我以前沒有找到解決我的問題的方法,但看起來像是這樣。我解決了一個不太理想的解決方法,但應該可以在大多數情況下使用。首次創建時,我在本地保存訂閱信息,並在需要刪除訂閱時使用它。當用戶在設備上有活動訂閱的同時卸載應用程序時,信息將丟失。如果用戶重新安裝應用程序,我無法獲取信息並且無法在註銷時刪除訂閱。無論如何,謝謝你在這件事情上的幫助。 –