我正在尝试实现一个服务器端脚本,用于向苹果推送通知服务器发送推送通知。我创建了ssl连接,发送了有效负载-但无法从APNs获得响应。这是我的代码:
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()
运行此脚本时,我生成以下输出:
^{pr2}$有什么问题吗?(我正在发送增强的推送通知,因此我期待苹果推送通知服务器的响应)
您可以考虑https://github.com/djacobs/PyAPNs包装了许多有用的功能,包括:
苹果推送通知服务器没有给出响应,它是一个单向二进制套接字。 您可以尝试apns-python-wrapper或{a2},而不是自己推出解决方案
需要注意的关键是read()没有返回任何数据。在Python中,read()应该阻塞,直到数据可用或连接关闭。苹果正在关闭你的连接。
为什么?嗯,可能是因为你发了一个错误的请求。
command=0
是一个普通的推送通知;command=1
得到了增强。big-endian1987
将被解释为0字节的设备令牌和1987字节的有效负载,这两个都是无效的。在(和FWIW,我将使用
B
代替c
作为命令ID;这似乎更有意义。)相关问题 更多 >
编程相关推荐