Python APNs не обрабатывает запрос

1

Я пытаюсь реализовать серверную часть script для отправки push-уведомлений на сервер уведомлений Apple push. Я создаю соединение 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()

Запустив этот script, я создаю следующий вывод:

('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

Любые идеи о том, что может пойти не так? (Я отправляю расширенные push-уведомления, поэтому ожидаю ответа от сервера уведомлений Apple push)

Теги:
iphone
apple-push-notifications

3 ответа

4
Лучший ответ

Главное отметить, что read() не возвращает никаких данных. В Python функция read() должна блокироваться до тех пор, пока данные не будут доступны или соединение не будет закрыто. Apple закрывает ваше соединение.

Почему? Вероятно, потому, что вы отправили неверный запрос. command=0 - обычное push-уведомление; command=1. Большой-endian 1987 будет интерпретироваться как маркер устройства 0 байтов и полезная нагрузка в размере 1987 байта, ни одна из которых не действительна.

(И FWIW, я использовал бы B вместо c для идентификатора команды, кажется, имеет смысл.)

0

вы можете рассмотреть https://github.com/djacobs/PyAPNs, который включает множество полезных функций, в том числе:

  • обработка ошибок
  • поддерживать расширенный формат сообщения и автоматически пересылать сообщения, которые отправляются перед ответом на ошибку
  • неблокируемое соединение сокетов ssl с отличной производительностью
-3

Сервер уведомлений Apple Push не дает ответа, это односторонний двоичный сокет. Вместо того, чтобы катить свое решение, вы можете попробовать apns-python-wrapper или apns

Ещё вопросы

Сообщество Overcoder
Наверх
Меню