24 releases

0.5.3 May 14, 2020
0.5.1 Dec 17, 2019
0.5.0-alpha.7 Nov 5, 2019
0.4.0 Mar 15, 2019
0.3.3 Jun 26, 2018

#170 in Network programming

Download history 47/week @ 2020-10-31 43/week @ 2020-11-07 18/week @ 2020-11-14 54/week @ 2020-11-21 25/week @ 2020-11-28 73/week @ 2020-12-05 22/week @ 2020-12-12 29/week @ 2020-12-19 14/week @ 2020-12-26 9/week @ 2021-01-02 58/week @ 2021-01-09 35/week @ 2021-01-16 41/week @ 2021-01-23 49/week @ 2021-01-30 113/week @ 2021-02-06 137/week @ 2021-02-13

147 downloads per month
Used in xorc-notifications

MIT license

1.5K SLoC


Travis Build Status MIT licensed crates.io

HTTP/2 Apple Push Notification Service for Rust using Tokio and async sending.

Help needed

The main author is not currently owning any Apple phones, so would be nice to have some help from a co-author with needed devices and an Apple developer account. If you happen to have them and are willing to help, please contact!


Needs a Tokio executor version 0.2 or later and Rust compiler version 1.39.0 or later.



  • Fast asynchronous sending, based on h2 and hyper crates.
  • Payload serialization/deserialization with serde.
  • Provides a type-safe way of constructing different types of payloads. Custom data through Serialize, allowing use of structs or dynamic hashmaps.
  • Supports .p12 certificate databases to connect using a custom certificate.
  • Supports .p8 private keys to connect using authentication tokens.
  • If using authentication tokens, handles signature renewing for Apple's guidelines and caching for maximum performance.


The library supports connecting to Apple Push Notification service either using a certificate with a password or a private key with a team id and key id. Both are available from your Apple account and with both it is possible to send push notifications to one application.

To see it used in a real project, take a look to the XORC Notifications, which is a full-fledged consumer for sending push notifications.


We've been pushing some millions of notifications daily through this library and are quite happy with it. Some things to know, if you're evaluating the library for production use:

  • Do not open new connections for every request. Apple will treat it as Denial of Service attack and block the sending IP address. When using the same Client for multiple requests, the Client keeps the connection alive if pushing steady traffic through it.

  • For one app, one connection is quite enough already for certain kind of loads. With http2 protocol, the events are asynchronous and the pipeline can hold several outgoing requests at the same time. The biggest reason to open several connections is for redundancy, running your sender service on different machines.

  • It seems to be Apple doesn't like when sending tons of notifications with faulty device tokens and it might lead to ConnectionErrors. Do not send more notifications with tokens that return Unregistered, BadDeviceToken or DeviceTokenNotForTopic.


cargo test


oh_lawd @ IRC (Freenode, Mozilla)


~372K SLoC