QuickBlox REST API无法获取推送通知订阅列表

QuickBlox REST API无法获取推送通知订阅列表,rest,push-notification,quickblox,Rest,Push Notification,Quickblox,我一直在使用QuickBlox在iOS和Android上向我们的应用程序发送推送通知。我使用果酱C++ SDK来开发应用程序。获取登录用户的活动推送通知订阅时遇到问题 我已经从QB管理面板检查了我使用的用户是否有活动推送通知订阅,但是请求GET api.quickblox.com/subscriptions.json返回404 not found API方法的文档说明没有需要随请求传递的参数。它需要的唯一信息是在头中传递的QB令牌。令牌间接地指定了登录用户,因此这就是它所需要的一切 但是,对该方

我一直在使用QuickBlox在iOS和Android上向我们的应用程序发送推送通知。我使用果酱C++ SDK来开发应用程序。获取登录用户的活动推送通知订阅时遇到问题

我已经从QB管理面板检查了我使用的用户是否有活动推送通知订阅,但是请求
GET api.quickblox.com/subscriptions.json
返回404 not found

API方法的文档说明没有需要随请求传递的参数。它需要的唯一信息是在头中传递的QB令牌。令牌间接地指定了登录用户,因此这就是它所需要的一切

但是,对该方法的描述是

检索授权令牌中指定的设备的订阅

但这不可能完全正确,因为无法知道是哪个设备发出请求。我假设这意味着为用户检索订阅

在我们的应用程序中,检索订阅请求是在登录用户之后执行的。我已确认登录成功,其他API方法功能正常

在我得到404之后,我尝试为用户查找当前设备。如果设备已存在订阅,则
POST-api.quickblox.com/subscriptions.json
返回201表示成功,但响应正文仅为
[]
。如果之前没有设备订阅,则请求返回201,但响应正文包含创建的订阅的信息


我可以很好地创建和删除通知事件,它们可以很好地传递到设备。我的问题是,我无法轻松确认设备是否有有效的订阅,我也不知道该订阅的ID是什么,因此我可以在用户注销时将其删除。

好的,我已经设法解决了这个问题,我也被文档弄糊涂了,它没有清楚地解释它的含义

检索中指定的设备的订阅 授权令牌

由于此文档的措辞含糊不清,我在让用户注册订阅时也遇到了问题

为了获得Quickblox的授权令牌(用于会话或用户会话),您必须事先使用文档中描述的参数生成HMAC SHA1签名:

  • 应用程序id(API应用程序标识符)
  • 身份验证密钥(AuthenticationKey)
  • 时间戳(Unix时间戳)
  • nonce(Unix时间戳)
  • 用户[登录]
  • 用户[密码]
  • 签名(HMAC SHA1,如下所述)
使用这些参数及其值,您应该创建一个如下所示的字符串:

'application_id=22&auth_key=wJHd4cQSxpQGWx5&nonce=33432×tamp=1326966962&user[登录]=test@test.com&用户[密码]=test123'

然后HMAC SHA1这个值,使用你的应用程序密码作为HMAC密码,来获取请求的签名,例如C#

拥有此签名后,可以将请求发送到Quickblox以获取授权令牌,例如,它是用户会话的令牌

您需要在请求正文中发送用于生成签名的所有参数,包括生成的签名,并将其发送到端点
/session.json

{  
   "application_id":"2",
   "auth_key":"DtF9cZPqTF8Wy9Q",
   "timestamp":"1333630392",
   "nonce":"1236221330",
   "user":
   {
     login: "test@test.com",
     password: "test123"
   },
   "signature":"eb0ec2d8c8184a3e62b41da2afb6e8d690577fa4"
}
{  
   "application_id":"2",
   "auth_key":"DtF9cZPqTF8Wy9Q",
   "timestamp":"1333630392",
   "nonce":"1236221330",
   "user":
   {
     login:"test@test.com",
     password:"test123"
   },
   "device":
   {
     "platform":"android",
     "udid":"2374682h23780239j"
   }
   "signature":"5t4d2d8c81848b6c4s41da2afb6e8d690889bc4"
}
例如。
POST
/session.json

{  
   "application_id":"2",
   "auth_key":"DtF9cZPqTF8Wy9Q",
   "timestamp":"1333630392",
   "nonce":"1236221330",
   "user":
   {
     login: "test@test.com",
     password: "test123"
   },
   "signature":"eb0ec2d8c8184a3e62b41da2afb6e8d690577fa4"
}
{  
   "application_id":"2",
   "auth_key":"DtF9cZPqTF8Wy9Q",
   "timestamp":"1333630392",
   "nonce":"1236221330",
   "user":
   {
     login:"test@test.com",
     password:"test123"
   },
   "device":
   {
     "platform":"android",
     "udid":"2374682h23780239j"
   }
   "signature":"5t4d2d8c81848b6c4s41da2afb6e8d690889bc4"
}
您得到的响应应该具有用户会话请求所需的授权令牌

解决您的问题

正如您所提到的,尽管推送通知的订阅已经存在并链接到用户,但此令牌不适用于检索用户订阅,并返回not found

发生这种情况的原因是,用户与设备有1:M关系,Quickblox不会返回所有订阅,只返回与发起请求的特定设备相关的订阅,但您必须告诉它这一点

我们缺少的元素是将设备参数添加到授权令牌中,这在文档中描述得非常糟糕(如果有的话)

为了使其正常工作,我们需要在授权请求中添加
device[udid]
device[platform]
。这将标识用户以及他们用于Quickblox的特定设备

要执行此操作,请执行与上述完全相同的操作,但HMAC SHA1的值现在应该如下所示

'application_id=22&auth_key=wJHd4cQSxpQGWx5&device[platform]=android&device[udid]=2374682h23780239j&nonce=33432×tamp=1326966962&user[login]=test@test.com&用户[密码]=test123'

请注意,如果您以不同的顺序放置密钥,您将收到“意外签名”错误,设备[平台]必须位于验证密钥之后等。

使用此字符串生成签名,然后使用与上述类似的请求发送签名:

例如。
POST
/session.json

{  
   "application_id":"2",
   "auth_key":"DtF9cZPqTF8Wy9Q",
   "timestamp":"1333630392",
   "nonce":"1236221330",
   "user":
   {
     login: "test@test.com",
     password: "test123"
   },
   "signature":"eb0ec2d8c8184a3e62b41da2afb6e8d690577fa4"
}
{  
   "application_id":"2",
   "auth_key":"DtF9cZPqTF8Wy9Q",
   "timestamp":"1333630392",
   "nonce":"1236221330",
   "user":
   {
     login:"test@test.com",
     password:"test123"
   },
   "device":
   {
     "platform":"android",
     "udid":"2374682h23780239j"
   }
   "signature":"5t4d2d8c81848b6c4s41da2afb6e8d690889bc4"
}
然后,当使用以下方法请求订阅时,您从Quickblox返回的令牌应用作
QB令牌
头值:
GET
/subscriptions.json

{  
   "application_id":"2",
   "auth_key":"DtF9cZPqTF8Wy9Q",
   "timestamp":"1333630392",
   "nonce":"1236221330",
   "user":
   {
     login: "test@test.com",
     password: "test123"
   },
   "signature":"eb0ec2d8c8184a3e62b41da2afb6e8d690577fa4"
}
{  
   "application_id":"2",
   "auth_key":"DtF9cZPqTF8Wy9Q",
   "timestamp":"1333630392",
   "nonce":"1236221330",
   "user":
   {
     login:"test@test.com",
     password:"test123"
   },
   "device":
   {
     "platform":"android",
     "udid":"2374682h23780239j"
   }
   "signature":"5t4d2d8c81848b6c4s41da2afb6e8d690889bc4"
}
在筹集门票和浏览互联网之后,我偶然发现了这个代码并研究了一会儿,终于找到了这个解决方案


我希望这能帮助其他陷入困境的人,因为我认为Aleksi Grön在两个月后就解决了这个问题。

我也有同样的问题,你有没有解决过这个问题?我以前没有找到解决我问题的方法,但看起来可能就是这样。我选择了一个不理想的解决方案,但在大多数情况下都应该有效。第一次使用c时,我将订阅信息保存在本地