苹果推送通知新协议无法正常工作

1 投票
1 回答
858 浏览
提问于 2025-04-18 18:03

我正在测试苹果的推送通知。
我发现,苹果的推送通知服务(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

你可以考虑使用一个支持更丰富消息功能的库,这样可以减轻你的负担。

这个库会捕捉到失败消息的错误响应,并重新发送那些被APNS丢弃的消息。(当发送失败的消息后,且在收到错误响应之前,消息会被丢弃)

功能:

  • 非阻塞的SSL套接字连接,可以发送通知而不需要等待响应。
  • 一个单独的线程,用于不断检查从读取连接中收到的错误响应。
  • 一个发送通知的缓冲区,用于重新发送那些在失败通知后发送的通知,或者由于APNS的任意连接关闭而丢失的通知。
  • 在最坏的情况下,如果第一次发送的通知失败,错误响应在1秒后返回,而同时有999条通知被APNS丢弃,这999条被丢弃的通知会在不丢失任何一条的情况下重新发送。按照同样的逻辑,如果重新发送的通知失败,它会在失败的通知后继续重新发送其余的通知。

性能:

  • 每秒可以发送1000条通知。

撰写回答