苹果推送通知新协议无法正常工作
我正在测试苹果的推送通知。
我发现,苹果的推送通知服务(APNs)只接受旧的协议格式。用新的格式发送数据是行不通的。
这里有一个使用旧格式(可以工作的)的例子。
import struct
import socket
import json
payload = {
'aps': {
'alert': '123!',
'sound': 'default'
}
}
payload = json.dumps(payload)
payload_len = len(payload)
notification = struct.pack('>bh32sh{payload_len}s'.format(payload_len=len(payload)),
0, 32, token.decode('hex'),
len(payload), payload)
而这里是一个不工作的例子:
import struct
import socket
import json
payload = {
'aps': {
'alert': '123!',
'sound': 'default'
}
}
payload = json.dumps(payload)
payload_len = len(payload)
struct_format = '>bibh32sbh{payload_len}sbhb'.format(payload_len=payload_len)
notification = struct.pack(struct_format,
2, struct.calcsize('bh32sbh{payload_len}sbhb'.format(payload_len=payload_len)),
1, 32, token.decode('hex'),
2, len(payload), payload,
5, 1, 10)
有没有人尝试过用新协议发送推送通知?
如果有,我到底哪里做错了呢?
谢谢。
1 个回答
0
你可以考虑使用一个支持更丰富消息功能的库,这样可以减轻你的负担。
- https://github.com/djacobs/PyAPNs
- 或者使用一个分支版本 https://github.com/jimhorng/PyAPNs,它在处理错误方面更可靠。
这个库会捕捉到失败消息的错误响应,并重新发送那些被APNS丢弃的消息。(当发送失败的消息后,且在收到错误响应之前,消息会被丢弃)
功能:
- 非阻塞的SSL套接字连接,可以发送通知而不需要等待响应。
- 一个单独的线程,用于不断检查从读取连接中收到的错误响应。
- 一个发送通知的缓冲区,用于重新发送那些在失败通知后发送的通知,或者由于APNS的任意连接关闭而丢失的通知。
- 在最坏的情况下,如果第一次发送的通知失败,错误响应在1秒后返回,而同时有999条通知被APNS丢弃,这999条被丢弃的通知会在不丢失任何一条的情况下重新发送。按照同样的逻辑,如果重新发送的通知失败,它会在失败的通知后继续重新发送其余的通知。
性能:
- 每秒可以发送1000条通知。