This is a simple service to relay WebPush notifications to Apple's push notification service. It was designed for Metatext, an iOS Mastodon client, but could theoretically be used for other purposes.
metatext-apns uses a token-based connection. You will need to set the following environment variables based on a key generated in the Apple developer portal:
APNS_KEY_IDAPNS_AUTH_KEY
You will also need to set these:
APPLE_TEAM_IDTOPIC
Finally, you will need to specify the size of the connection pool:
CONNECTION_POOL_SIZE
The service sets { "loc-key" : "apns-default-message" } for the alert key of the aps payload dictionary. If decrypting the notification on the client fails, the value for "apns-default-message" in your Localizable.strings file is what will be displayed.
Register your push subscription to call the endpoint /push/:device_token/:id (adding ?sandbox=true for debug builds) on the domain you are hosting the service, where device_token is the device token received in application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) in the client as a Base16 string and id is an identifier for which account on the client the notification belongs to. The service will deliver notifications with the mutable-content key set to 1 so a notification service extension can decrypt them. The notifications will have these keys in their custom payload:
i: Theidpath component of the subscription URLm: The encrypted message as a URL-safe Base64 strings: The salt as a URL-safe Base64 stringk: The server's public key as a URL-safe Base64 string
See Metatext's notification service extension and push notification parsing service for an example of how to decrypt the notifications in a notification service extension.
metatext-apns is a Sinatra application, and can be deployed like any other Rack-based application. It is set up to be run using the Puma web server.
Copyright (C) 2021 Metabolist
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along with this program. If not, see https://www.gnu.org/licenses/.