我一直在使用QuickBlox将推送通知发送到我们在iOS和Android上的应用程序。我正在使用Marmalade C ++ SDK开发应用程序。我在获取登录用户的活动推送通知订阅时遇到问题。
我已经从QB管理控制台中检查到我正在使用的用户具有活动的推送通知订阅,但是该请求GET api.quickblox.com/subscriptions.json
返回404找不到。
API方法“检索订阅”的文档指出,不需要随请求传递任何参数。它需要的唯一信息是在标头中传递的QB-Token。该令牌间接指定了已登录的用户,因此这就是它所需要的全部。
但是,该方法的说明是
检索授权令牌中指定的设备的预订。
但这不能完全正确,因为无法知道哪个设备正在发出请求。我假设这意味着为用户检索订阅。
在我们的应用程序中,检索订阅请求是在登录用户后立即执行的。我已经确认登录成功并且其他API方法正常运行。
获取404之后,我尝试为用户为当前设备创建一个新订阅。如果设备已经存在订阅,则POST api.quickblox.com/subscriptions.json
返回201表示成功,但响应正文为[]
。如果以前没有该设备的订阅,则请求返回201,但是响应正文包含创建的订阅的信息。
我能够正常创建和删除通知事件,并将它们传递到设备。我的问题是,我无法轻松确认设备是否具有有效的订阅,并且我不知道该订阅的ID是什么,因此我可以在用户注销时将其删除。
好的,我已经设法解决了这个问题,我也对文档感到困惑,它并不能清楚地解释其含义。
检索授权令牌中指定的设备的预订。
由于本文档措辞含糊,我在让用户注册订阅方面也遇到了问题。
为了获得Quickblox(用于会话或用户会话)的授权令牌,您必须事先使用文档中描述的参数生成了HMAC SHA1签名:
使用这些参数及其值,您应该创建了一个类似于以下内容的字符串:
'application_id = 22&auth_key = wJHd4cQSxpQGWx5&nonce = 33432&timestamp = 1326966962&user [登录] [email protected]&user [密码] = 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&device [platform] = android&device [udid] = 2374682h23780239j&nonce = 33432&timestamp = 1326966962&user [login] [email protected]&user [password] = test123'
请注意,如果以不同的顺序放置密钥,则会收到“意外签名”错误,device [platform]必须在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"
}
QB-Token
使用以下命令请求订阅时,将从Quickblox获取的令牌用作标头值:GET
/subscriptions.json
在获得票证并搜寻互联网之后,我设法跌倒了这段代码并研究了一会儿,从而找到了这个解决方案。
使用Quickblox的Blackberry PushAuth的源代码
我希望这对其他坚持下去的人有所帮助,因为我认为AleksiGrön在2个月后已经解决了这个问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句