I'm currently implementing push notifications from our backend server to our app (macOS Catalina & iOS - same code base), using Apple Push Notifications & the token based way of authentication (generating JWT from keyId, teamId, ... & signing it with the private key generated in the Apple developer console) to send pushes to APN service.
The problem I am facing is that I can successfully send "alert" notifications (status 200, with header apns-push-type: alert
) and receive them on my iOS and MacOS device (the push notifications appear successfully in production and sandbox mode) but for some reason, "silent" pushes (with header apns-push-type: background
) are only received on my iOS device (iPhone), but not on my Mac (didReceiveRemoteNotification(...)
in AppDelegate
is never called).
What I have done so far:
- Made sure APN request header is correctly configured for silent push:
apns-push-type: background
- Made sure to have the correct APN topic header:
apns-topic: my.bundle.id
(this is different for sandbox/production) - Added the "semi-required" priority header:
apns-priority: 5
(only when delivering background pushes) - Verified that the created JWT is valid and used in the APN auth header:
authorization: mytoken
(this must be the case, otherwise APN service would not respond with status 200) - Confirmed that my application has the correct entitlements & capabilities defined in Xcode (my reasoning: this must be the case, otherwise 'alert' push notifications would also not work)
- Double checked that push notifications for the Mac app are allowed/enabled (checked system settings)
- Made sure the device token im sending the push to is actually from the device intended to receive the push (e.g. my MacBook)
- Checked that the private key I'm using to sign the JWT has the APN capability
- Tested while the Mac app is running but not in focus & also when in focus
The APNs requests I am performing to send the push are:
- Sandbox: POST https://api.sandbox.push.apple.com/3/device/{deviceToken}
- Production: POST https://api.push.apple.com/3/device/{deviceToken}
The payload (JSON) I'm sending to APN service in the request body looks as follows:
{
"aps": {
"content-available": 1 # defines push as "silent"
},
"data": { #some key-value pairs here }
}
In any case (both production & sandbox, both with the device token of iOS and macOS), my request to APN returns with a status code 200. My MacBook is running Catalina 10.15.3. What am I possibly doing wrong here or is that something that is simply not supported for Catalyst apps?