QuickBlox REST API无法获取推送通知订阅列表
我一直在使用QuickBlox在iOS和Android上向我们的应用程序发送推送通知。我使用果酱C++ SDK来开发应用程序。获取登录用户的活动推送通知订阅时遇到问题 我已经从QB管理面板检查了我使用的用户是否有活动推送通知订阅,但是请求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令牌。令牌间接地指定了登录用户,因此这就是它所需要的一切 但是,对该方
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,如下所述)
/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时,我将订阅信息保存在本地