PyAPNs выбрасывает операцию IOError, не поддерживаемую устройством
Я пытаюсь реализовать APNS
для моего приложения iOS push из этого урока raywenderlich.
Согласно описанию я все сделал. После запуска этой команды openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem
Я получил большое сообщение, показывающее, что все связано, как ожидалось.
У меня сейчас два файла PushChatCert.pem
а также PushChatKey.pem
а также token_hex = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
Так что для отправки push-уведомлений с сервера я следил за PyAPN.
После всего этого в моей оболочке Python IOError: [Errno 19] Operation not supported by device
import time
from apns import APNs, Frame, Payload
apns = APNs(use_sandbox=True, cert_file='PushChatCert.pem', key_file='PushChatKey.pem')
# Send a notification
token_hex = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
payload = Payload(alert="Hello World!", sound="default", badge=1)
apns.gateway_server.send_notification(token_hex, payload)
ошибка
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
apns.gateway_server.send_notification(token_hex, payload)
File "/Library/Python/2.7/site-packages/apns.py", line 544, in send_notification
self.write(self._get_notification(token_hex, payload))
File "/Library/Python/2.7/site-packages/apns.py", line 273, in write
return self._connection().write(string)
File "/Library/Python/2.7/site-packages/apns.py", line 254, in _connection
self._connect()
File "/Library/Python/2.7/site-packages/apns.py", line 230, in _connect
self._ssl = wrap_socket(self._socket, self.key_file, self.cert_file)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 891, in wrap_socket
ciphers=ciphers)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 509, in __init__
self._context.load_cert_chain(certfile, keyfile)
IOError: [Errno 19] Operation not supported by device
Редактировать:
После запуска этого комментария в моем терминале openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem
Я получил вопрос о доверии следующим
depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
verify error:num=20:unable to get local issuer certificate
Итак, я скачал entrust_2048_ca.cer
файл и хранится в той же папке, то из терминала я работаю как
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -CAfile entrust_2048_ca.cer -cert PushChatCert.pem -key PushChatKey.pem
Тогда эта проблема была решена, но как выполнить это в PyAPNs
?
1 ответ
Проблема была решена. Это была некоторая проблема безопасности SSL для этого питона, который не мог получить доступ к файлам из этого каталога.
Я следовал этому уроку Apple-Push-Notification Services. Как описано в этом уроке после создания aps_development.cer
файл, который я делал, чтобы получить файлы.pem
$ openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem
Convert the private key’s .p12 file into a .pem file:
$ openssl pkcs12 -nocerts -out PushChatKey.pem -in PushChatKey.p12
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
После всего, что у меня было PushChatKey.pem
а также PushChatCert.pem
файлы и с помощью этих файлов я не смог отправить push-уведомления на мое устройство PyAPNs
apns = APNs(use_sandbox=True, cert_file='PushChatKey.pem', key_file='PushChatCert.pem')
Как я решил?
Наконец, я попытался создать сертификат с самого начала, но на этот раз, следуя другому руководству
Создайте свои сертификаты APNS.
После создания сертификата SSL, который вы загружаете как aps_developer_identity.cer
, Дважды щелкните по нему, чтобы установить его в приложении Keychain Access. Сертификат SSL будет использоваться приложением вашего провайдера, чтобы он мог связаться с APN для отправки push-уведомлений вашим приложениям.
Запустите Keychain Assistant с вашего локального Mac и из цепочки для ключей 'login', отфильтруйте по категории 'Certificates'. Вы увидите расширяемую опцию под названием "Apple Development iOS Push Services":
Разверните эту опцию, затем щелкните правой кнопкой мыши "Apple Development iOS Push Services" -> "Экспорт Apple Development iOS Push Services ...". Сохранить это как apns-dev-cert.p12
файл где-то вы можете получить к нему доступ.
Теперь из apns-dev-cert.p12
вы делаете.pem, используя эти команды из вашего терминала
openssl pkcs12 -in apns-dev-cert.p12 -out apns.crt.pem -clcerts -nokeys
openssl pkcs12 -in apns-dev-cert.p12 -out apns.key.pem -nocerts -nodes
Если вы хотите создать single .pem
openssl pkcs12 -in apns-dev-cert.p12 -out apns_development.pem -nodes -clcerts
Теперь используйте эти apns.crt.pem
а также apns.key.pem
файлы с PyAPNs, и это работает как по волшебству.
Создайте свой provision profile
внимательно.
Благодарю.