奇妙な問題があります。Apple プッシュ通知を Python で動作させようとしています。問題なく接続して個々のメッセージを送信できます。複数のメッセージを送信し始めると問題が発生しますが、それよりも奇妙です。
複数のデバイスでテストしています...いくつかのiPhoneといくつかのiPod Touch。問題なく複数のメッセージを iPhone に送信できますが、リストに iPod Touch デバイス ID がある場合、その後に続くメッセージはすべて失敗します。
したがって、次のように 4 つのメッセージを順番に送信すると:
1 - iPhone
2 - iPhone
3 - iPod Touch
4 - iPhone
1と2は配達され、3と4は失敗します。
同じデバイス ID を使用して、iPod Touch デバイス ID のいずれかを最初のメッセージに移動すると、すべてのメッセージが失敗します。同様に、iPhone のみに送信すると、すべてのメッセージが成功します。
これが私がテストしているコードです。現在の状態では、最初の2つのメッセージしか取得できず、最後の2つは毎回失敗します。
import struct, ssl, json, sys, time, socket, binascii
from optparse import OptionParser
class PushSender(object):
def __init__(self, host, cert, key):
self.apnhost = (host, 2195)
self.sock = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM),
keyfile = key,
certfile = cert,
do_handshake_on_connect=False)
self.sock.connect(self.apnhost)
while True:
try:
self.sock.do_handshake()
break
except ssl.SSLError, err:
if err.args[0] == ssl.SSL_ERROR_WANT_READ:
select.select([self.sock], [], [])
elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE:
select.select([], [self.sock], [])
else:
raise
def send_message(self, token, message):
payload = {'aps':{'alert':message}}
token = binascii.unhexlify(token)
payloadstr = json.dumps(payload, separators=(',',':'))
payloadLen = len(payloadstr)
fmt = "!BH32sH%ds" % payloadLen
notification = struct.pack(fmt, 0, 32, token, payloadLen, payloadstr)
self.sock.write(notification)
self.sock.
def close(self):
self.sock.close()
def main():
parser = OptionParser()
parser.add_option("-c", "--certificate", dest="cert",
metavar="FILE",
help="Certificate file", )
parser.add_option("-p", "--privatekey", dest="key",
metavar="FILE",
help="Key file", )
parser.add_option("--host", help="apn host", dest='host')
(options, args) = parser.parse_args()
sender = PushSender(options.host, options.cert, options.key)
iphone1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
print 'Sending iPhone #1 a message.'
print sender.send_message(iphone1,'Hey iPhone #1.')
iphone2 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
print 'Sending iPhone #2 a message.'
print sender.send_message(iphone2,'Hey iPhone #2.')
ipod1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
print 'Sending iPod #1 a message.'
print sender.send_message(ipod1,'Hey iPod #1.')
iphone3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
print 'Sending iPhone #3 a message.'
print sender.send_message(iphone3,'Hey iPhone #3.')
sender.close()
if __name__=="__main__":
main()
どんな助けでも大歓迎です...