Python client for Apple Push Notification service (APNs)
Python client for Apple Push Notification service (APNs).
This project is forked from apns-client, as there was a tiny but severe problem with SSL handshake rendering the package to be unusable. For the time being please check for apns-client’s documentation .
- six - Python 2 and 3 compatibility library.
- pyOpenSSL - OpenSSL wrapper. Required by standard networking back-end.
Standard library has support for SSL transport. However, it is impossible to use it with certificates provided as a string. We store certificates in database, because we handle different apps on many Celery worker machines. A dirty solution would be to create temporary files, but it is insecure and slow. So, we have decided to use a better OpenSSL wrapper and pyOpenSSL was the easiest to handle. pyOpenSSL is loaded on demand by standard networking back-end. If you use your own back-end, based on some other SSL implementation, then you don’t have to install pyOpenSSL.
- Added support for sending multiple pushes with varying payload during one APNs connection, thanks Jon Snyder!
- Removed not needed non ascii character which was causing problems with python < 3
- Imported changes from open apns-client pull requests. Thanks Jason Spafford, zhe li and neetu jain.
- Forked from apns-client and fixed SSL handshake error caused by Apple’s SSLv3 deprecation
There are many alternatives available. This library differs in the following design decisions:
- Support certificates from strings. We do not distribute certificate files on worker machines, they fetch it from the database when needed. This approach simplifies deployment, upgrades and maintenance.
- Keep connections persistent. An SSL handshaking round is slow. Once connection is established, it should remain open for at least few minutes, waiting for the next batch.
- Support enhanced format. Apple developers have designed a notoriously bad push protocol. They have upgraded it to enhanced version, which makes it possible to detect which messages in the batch have failed.
- Clean pythonic API. No need for lots of classes, long lists of exceptions etc.
- Do not hard-code validation, let APNs fail. This decision makes library a little bit more future proof.
- [TODO] own documentation for apns-clerk
- [TODO] proper attributions for previous work