Search code examples
iosnode.jsapn

Sending an APN returns BadDeviceToken, what should DeviceToken format be?


My backend uses Node.js with Express.js, handling APN using the npm apn package, which uses Apple's new Provider Authentication Tokens. The iOS app got permission and sent the received 32 bytes device token received to the backend, encoded as a base64 string.

But when trying to send a push notification with the device token (encoded as ascii, utf8 or base64), the APN server returns -

{"sent":[],"failed":[{"device":"....token....","status":"400","response":{"reason":"BadDeviceToken"}}]}

What should be the token format when sent to APN servers?


Solution

  • After hours searching the internet, camp across APNs Provider API, under APNs Notification API it was mentioned that -

    For the device-token parameter, specify the hexadecimal bytes of the device token for the target device.

    Which worked. Device token should be encoded as hexadecimal bytes.

    // Node.js snippet
    let deviceToken = Buffer.from(base64Token, 'base64').toString('hex');