Socket
Socket
Sign inDemoInstall

pyapns-client3

Package Overview
Dependencies
7
Maintainers
1
Alerts
File Explorer

Install Socket

Detect and block malicious and high-risk dependencies

Install

    pyapns-client3

Simple, flexible and fast Apple Push Notifications on iOS, OSX and Safari using the HTTP/2 Push provider API with async support.


Maintainers
1

Readme


pyapns_client3


|version| |license|

Simple, flexible and fast Apple Push Notifications on iOS, OSX and Safari using the HTTP/2 Push provider API.

Features

  • Uses the new Apple APNs HTTP/2 protocol with persistent connections
  • Supports token-based authentication (no need to renew your certificates anymore) and certificate-based authentication
  • Uses the httpx HTTP client library
  • Supports the new iOS 10 features such as Collapse IDs, Subtitles and Mutable Notifications
  • Makes the integration and error handling really simple with auto-retry on APNs errors
  • Supports asynchronous sending of notifications

Cautions

  • Works only with Python 3.6 and higher

Installation

Install using pip:

.. code-block:: bash

pip install pyapns_client3

Usage

Sync

.. code-block:: python

from pyapns_client import APNSClient, TokenBasedAuth, IOSPayloadAlert, IOSPayload, IOSNotification, APNSDeviceException, APNSServerException, APNSProgrammingException, UnregisteredException


device_tokens = ['device_token_1', 'device_token_2']
alert = IOSPayloadAlert(title='Title', subtitle='Subtitle', body='Some message.')
payload = IOSPayload(alert=alert)
notification = IOSNotification(payload=payload, topic='domain.organization.app')

# `root_cert_path` is for the AAACertificateServices root cert (https://apple.co/3mZ5rB6)
# with token-based auth you don't need to create / renew your APNS SSL certificates anymore
# you can pass `None` to `root_cert_path` if you have the cert included in your trust store
# httpx uses 'SSL_CERT_FILE' and 'SSL_CERT_DIR' from `os.environ` to find your trust store
with APNSClient(
    mode=APNSClient.MODE_DEV, 
    authentificator=TokenBasedAuth(
        auth_key_path='/path/to/auth_key.p8', 
        auth_key_id='AUTHKEY123', 
        team_id='TEAMID1234'
    ),
    root_cert_path='/path/to/root_cert.pem', 
) as client:
    for device_token in device_tokens:
        try:
            client.push(notification=notification, device_token=device_token)
        except UnregisteredException as e:
            print(f'device is unregistered, compare timestamp {e.timestamp_datetime} and remove from db')
        except APNSDeviceException:
            print('flag the device as potentially invalid and remove from db after a few tries')
        except APNSServerException:
            print('try again later')
        except APNSProgrammingException:
            print('check your code and try again later')
        else:
            print('everything is ok')

Async

.. code-block:: python

from pyapns_client import AsyncAPNSClient, TokenBasedAuth, IOSPayloadAlert, IOSPayload, IOSNotification, APNSDeviceException, APNSServerException, APNSProgrammingException, UnregisteredException


device_tokens = ['device_token_1', 'device_token_2']
alert = IOSPayloadAlert(title='Title', subtitle='Subtitle', body='Some message.')
payload = IOSPayload(alert=alert)
notification = IOSNotification(payload=payload, topic='domain.organization.app')

# `root_cert_path` is for the AAACertificateServices root cert (https://apple.co/3mZ5rB6)
# with token-based auth you don't need to create / renew your APNS SSL certificates anymore
# you can pass `None` to `root_cert_path` if you have the cert included in your trust store
# httpx uses 'SSL_CERT_FILE' and 'SSL_CERT_DIR' from `os.environ` to find your trust store
async with AsyncAPNSClient(
    mode=APNSClient.MODE_DEV, 
    authentificator=TokenBasedAuth(
        auth_key_path='/path/to/auth_key.p8', 
        auth_key_id='AUTHKEY123', 
        team_id='TEAMID1234'
    ),
    root_cert_path='/path/to/root_cert.pem', 
) as client:
    for device_token in device_tokens:
        try:
            await client.push(notification=notification, device_token=device_token)
        except UnregisteredException as e:
            print(f'device is unregistered, compare timestamp {e.timestamp_datetime} and remove from db')
        except APNSDeviceException:
            print('flag the device as potentially invalid and remove from db after a few tries')
        except APNSServerException:
            print('try again later')
        except APNSProgrammingException:
            print('check your code and try again later')
        else:
            print('everything is ok')

.. |version| image:: https://img.shields.io/pypi/v/pyapns_client3.svg?style=flat-square :target: https://pypi.python.org/pypi/pyapns_client3/

.. |license| image:: https://img.shields.io/pypi/l/pyapns_client3.svg?style=flat-square :target: https://pypi.python.org/pypi/pyapns_client3/

3.0

3.0.6

Changed ^^^^^^^

  • allow to use str as alert for notification payload (by @tartansandal)

Added ^^^^^

  • some tests with Python version 3.6-3.11
  • some payload serialization tests (by @tartansandal)
  • some type annotations
  • some docstrings

3.0.5

Fixed ^^^^^

  • have auth.py use the Dict type hint from the typing module by @tinycogio

3.0.0

Refactored ^^^^^^^^^^

  • extract authentication classes

2.1

2.1.0

Added ^^^^^

  • async/await support with AsyncAPNSClient

2.0

2.0.7

Added ^^^^^

  • usage as context manager
  • certificate-based authentication

Keywords

FAQs


Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc