Skip to main content

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:

pip install pyapns_client3

Usage

Sync

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

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

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

Release files for pyapns-client3 3.0.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyapns-client3 3.0.6
File Size Uploaded
pyapns_client3-3.0.6.tar.gz 13.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyapns-client3 3.0.6
File Interpreter ABI Platform
pyapns_client3-3.0.6-py3-none-any.whl Python 3 none any Details

Total release size: 28.3 kB

Release files / pyapns_client3-3.0.6.tar.gz

Download URL pyapns_client3-3.0.6.tar.gz
Size 13.7 kB
Tags Source
SHA-256 checksum
How to use checksums
9acea0356043e6c01fa7642e0ddc3671259927476cd9a0601749c509f7b59b0d
BLAKE2b-256 checksum
How to use checksums
79b1b0fe33d6d130f4fd4ed39f08b06102de32ac361c331fa71f63a315382bf2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.11.3

Release files / pyapns_client3-3.0.6-py3-none-any.whl

Download URL pyapns_client3-3.0.6-py3-none-any.whl
Size 14.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
efc0fd4bfb5188bc92443876ee4c6cb8f0174110abb76dff651663b46e65efcd
BLAKE2b-256 checksum
How to use checksums
749f44f681b2c8d1b380d8a070963750a6fcf2673225d7e46f174ec551adc42e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.11.3

Release history Release notifications | RSS feed

This release

3.0.6 This release

2 release files

3.0.5

2 release files

3.0.2

2 release files

3.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page