iphone - Python APNs 不处理请求

标签 iphone python apple-push-notifications

我正在尝试实现一个服务器端脚本,用于将推送通知发送到苹果推送通知服务器。我创建了 ssl 连接,发送了有效负载 - 但无法从 APN 获得响应。这是我的代码:

import socket, ssl, pprint, struct, time, binascii

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# require a certificate from the server
ssl_sock = ssl.wrap_socket( s,
                            keyfile="/Users/Jeff/Desktop/pickmeup-key2-noenc.pem",
                            certfile="/Users/Jeff/Desktop/pickmeup-cert2.pem",
                            server_side=False,
                            do_handshake_on_connect=True,
                            cert_reqs=ssl.CERT_REQUIRED,
                            ca_certs="/Users/Jeff/Desktop/entrustrootcert.pem",)
                            #ciphers="ALL")
ssl_sock.connect(('gateway.sandbox.push.apple.com', 2195))

print repr(ssl_sock.getpeername())
print ssl_sock.cipher()
print pprint.pformat(ssl_sock.getpeercert())

command = '\x00'
identifier = 1987
expiry = time.time()
deviceToken = "9858d81caa236a86cc67d01e1a07ba1df0982178dd7c95aae115d033b93cb3f5"
alert = "This is a test message"
sound = "UILocalNotificationDefaultSoundName"
payload = "{\"aps\":{\"alert\":\"%s\",\"sound\":\"%s\"}}" %(alert, sound)

packetFormat = "!cIIH%dsH%ds" %(32, len(payload))

packet = struct.pack(packetFormat, 
                    command, 
                    identifier,
                    int(expiry),
                    32, 
                    binascii.unhexlify(deviceToken), 
                    len(payload), 
                    payload)
nBytesWritten = ssl_sock.write(packet)
print "nBytesWritten = %d" %(nBytesWritten)

data = ssl_sock.read(1024)
print len(data)

ssl_sock.close()

运行此脚本,我生成以下输出:

('17.149.34.132', 2195)
('AES256-SHA', 'TLSv1/SSLv3', 256)
{'notAfter': 'May 31 00:04:27 2012 GMT',
 'subject': ((('countryName', u'US'),),
             (('stateOrProvinceName', u'California'),),
             (('localityName', u'Cupertino'),),
             (('organizationName', u'Apple Inc'),),
             (('organizationalUnitName', u'Internet Services'),),
             (('commonName', u'gateway.sandbox.push.apple.com'),))}
nBytesWritten = 133
0

对于可能出现的问题有什么想法吗? (我正在发送增强的推送通知,因此我期待苹果推送通知服务器的响应)

最佳答案

要注意的关键是 read() 没有返回任何数据。在 Python 中,read() 应该阻塞,直到数据可用或连接关闭。 Apple 正在关闭您的连接。

为什么?嗯,可能是因为您发送了格式错误的请求。 command=0 是普通的推送通知; command=1 得到增强。 big-endian 1987 将被解释为 0 字节设备 token 和 1987 字节有效负载,两者均无效。

(FWIW,我会使用 B 而不是 c 作为命令 ID;它似乎更有意义。)

关于iphone - Python APNs 不处理请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4838770/

相关文章:

python - 是否有一个工具可以在没有实际移动应用程序的情况下测试移动推送通知?

swift - CKQueryNotification.recordID : unrecognized selector sent to instance

php - 通过 PHP 脚本发送推送通知

iphone - 是否可以更改本地化的默认英语语言?

iphone:如何像 NSCalendar 一样混合枚举

iphone - PrepareForSegue 方法将文本从两个不同的 TextView 传递到下一个 View 中的 TextView

python - 每个单词之间的空格数

python - Tensorflow 导入元图占位符未提供

iphone - 类型名称未知Iphone错误

python - 将 numpy 数组类型和值从 Float64 转换为 Float32