hpopp
After just over two years in development, this latest version of Pigeon is what I finally consider done in regards to my original vision for the project. v1.1 brings several needed API-breaking changes that should have been rolled into v1.0, but were otherwise overshadowed by the complexity of the FCM http2 implementation. Special thanks to @talklittle for his help on this release.
What is Pigeon? It’s a library for sending iOS, Android, and Amazon Android push notifications. Check out the project: https://github.com/codedge-llc/pigeon
What’s New
Kadabra Bumped to v0.3.2
Kadabra is an HTTP/2 client I wrote from scratch specifically to support Pigeon. v0.3+ brings significant stability improvements (and might actually run a bit faster). This bumps the minimum requirements to Elixir v1.4 and OTP 19.2
Runtime Worker Configs
APNS/FCM/ADM worker connections are now started with custom structs. The old config style is still valid, but it is recommended to use the new style.
# config.exs
config :pigeon, workers: [
{YourApp.Pigeon, :apns_config},
...
]
# your_app_pigeon.ex
defmodule YourApp.Pigeon do
def apns_config do
Pigeon.APNS.Config.new(
name: :apns_default,
mode: :prod,
cert: System.get_env("APNS_CERT"),
key: System.get_env("APNS_KEY"),
reconnect: false,
port: 2197,
ping_period: 300_000
)
end
end
Note: :apns_default, :fcm_default, and :adm_default still need to be specified as names in your config if you want pigeon to push to them by default.
Standardized Notification Responses
Notifications now contain the push response on the notification itself. This makes sending batches of notifications more straightforward. APNS and ADM now have a :response key indicating success or failure.
FCM.NotificationResponse has been done away in favor of this new style, though the syntax is a bit different. :response is a keyword list of [{response, "reg id"}] for per-regID responses. There is a second :status key on the notification that indicates whether the whole batch was successful.
Example usage for async response handling on FCM
def handle_response(%FCM.Notification{status: :success, response: responses}) do
Enum.map(responses, & handle_regid(&1))
end
def handle_response(_else) do
# some sort of error
end
def handle_regid({:update, {old, new}), do: #update
def handle_regid({:invalid_registration, regid), do: #remove
def handle_regid({:not_registered, regid}), do: #remove
def handle_regid({:unavailable, regid), do: #retry
...
FCM.push(notif, on_response: &handle_response/1)
Roadmap Ahead
Forcus is now going to shift to tackling some of the smaller features that have been on the backburner. Among these:
- JWT token support for APNS
- Topic subscriptions for FCM
- Better onboarding for contributors (mock APNS servers anyone?)
Thanks to everyone who has contributed to the project over the past couple years. As someone who was previously never very involved with open source, I feel like I’ve learned a lot in the process.
Trending in Announcing
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #ai
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
talklittle
Congratulations @hpopp! Just wanted to say you’re doing a great job as the maintainer of Pigeon, and collaborating with you on pull requests and issues has been a pleasure.
Also I’ve been running Pigeon in production for nearly a year, and it’s been pretty stable, not to mention a breeze to set up. Thanks for your contributions to the Elixir ecosystem!
kokolegorille
Does pigeon implement the full IPoAC Protocol?
hpopp
Maybe in a future release. I hear supervision is a bit complicated when they die.
hpopp
v1.2.0 Released
Now with support for APNS JWT configuration! Special thanks to @Lankester for the feature.
It’s very simple to configure! Pigeon can auto-detect whether you are using a certificate or token config.
:keyis configured just like:cert, which can be a file path, file contents, string or tuple.Kadabra Updates
Pigeon now uses Kadabra
0.4.2, which brings more http2 stability improvements. Various race condition errors during connection shutdown should now be fixed!Roadmap Ahead
The only remaining major feature is FCM web push encryption support. Once implemented, focus will shift to improving the reliability of error handling for failed push notifications. There are certain Kadabra API changes in the works that will make this task much easier. It’s finally starting to mature into a more general purpose http2 client. Take a look at the repo if you haven’t already.
joe
I’m not sure how I am to understand this library. If I have a phoenix “app” which is installed with the “add to home screen” feature of the mobile devices, can I use this library to send the push notifications to those people?
If yes, I need to create this certificate stuff and can then just use it? It’s gonna be creating a service worker and such stuff automatically? Or is this a different thing from this kinda stuff? Add push notifications to a web app | Google Codelabs
I have browsed through the documentation but I feel now more confused than before. So a quick real world example on when I am to use this library would be cool. The how is well described already.
hpopp
I can see why you might be confused, web push notifications were never implemented
. Pigeon is used for delivering notifications to native mobile apps (iOS and Android). These are only apps deployed through their respective app stores, and use the standard configuration determined by each mobile platform.
Web push support is still on the eventual list, but it has a different flow from typical mobile push notifications.
tfwright
I had a similar confusion and ended up using this small library to send web push notifications:
https://github.com/danhper/elixir-web-push-encryption
It’s been working well for me sending notifications to browsers (and broswer based phone apps).
joe
Okay, cool. Thanks to both of you.
hpopp
Pigeon 2.0.0-rc.0 Released
It’s been a long time coming, but it’s here! A lot of significant updates and new features, including the FCM v1 API with web-push support and better runtime configuration of push workers.
This will serve as an unofficial migration guide until I’ve written one. Feedback is welcome!
Hexdocs available here.
Using the New Worker Setup
Pigeon 1.x uses default expected atom names for workers and supervised all of them independent from your application. This has been done away with for more of an Ecto-style setup in your supervision tree. The following example is for APNS, but it’s a similar strategy for all of your other push workers.
config.exs. Note the:adapterkey, which tells Pigeon what kind of worker you are setting up.If you skipped step two, include your configuration.
Pigeon.APNS.Using this strategy should make it far more flexible for worker setup, including things like loading dynamic push configurations from a database. See Pigeon.Dispatcher for more instructions.
FCM v1.0 API
All legacy
Pigeon.FCMfunctionality has been renamed toPigeon.LegacyFCM. You will need to do a project-wide rename, or else update to the new configuration and notification structure.The new
Pigeon.FCM.Notificationexposes all of the v1 notification attributes you might expect to use, but makes no guarantees about structure and typing, apart from the top-level keys. This gets you maximum flexibility to use the API how you need, including things like custom APNS options or web push.Notification targets replace the typical RegID string. You now pass a tuple for what you want, such as
{:token, "regid"},{:topic, "yourtopic"}, or{:condition, "yourcondition"}.Notification moduledocs here. You also might want to reference the Firebase v1 Message API as well.
Custom Adapters
Probably the coolest feature of this update is the new
Pigeon.Adapterbehaviour, which all Pigeon workers implement. What does this mean long term? Anybody can write a push adapter for Pigeon, whether that’s a third party push service, SMS, webhooks, or anything else. Expect better documentation on this soon, but in the meantime if you’re interested in writing an adapter, reach out to me and I can help!Here is an example of the
Pigeon.Sandboxadapter, which is useful for tests and local development. It will mark any push as:successand return it.Worker Pooling By Default
Now that APNS allows multiple persistent connections, worker pooling has been enabled by default. The default value is
5for all services, but this can be overridden on a per-dispatcher basis or globally.Next Steps
This release removes a lot of the cruft from design choices that were made in the early days of Pigeon. It is highly encouraged to adopt the new FCM v1 API. Many users of Pigeon jumped through hoops to get dynamic runtime workers started. Feedback is welcome on the new style-- hopefully it’s far more pleasant!
So what’s next feature-wise? Telemetry metrics. Expect it in a 2.1 release!
edisonywh
Awesome! Any plans to add support for other HTTP adapters like Finch?