0

I am trying to send push notifications using http2 api from my node backend.

I have the following with me from the IOS team .

  1. .p8 AuthKey
  2. Team ID
  3. Key ID

We have generated the build from the production environment. Key is generated using the AppStore selection.

I dont see any environment mismatch in the key, Device token and the build.

But still I get

:status: 400 apns-id: 91XXXX-XXXX-XXXX-XXXX-3E8XXXXXX7EC

{"reason":"BadDeviceToken"}

Code from Node backend :

const jwt = require('jsonwebtoken');
const http2 = require('http2');
const fs = require('fs');

const key = fs.readFileSync(__dirname + "/AuthKey_XXXXXXXXXX.p8", 'utf8')
    
    const unix_epoch = Math.round(new Date().getTime() / 1000);
    const token = jwt.sign(
        {
            iss: "XXXXXXXXXX", //"team ID" of developer account
            iat: unix_epoch 
        },
        key,
        {
            header: {
                alg: "ES256",
                kid: "XXXXXXXXXX", //issuer key "key ID" of p8 file
            }
        }
    )
    
    
    
    const host = 'https://api.push.apple.com'
    const path = '/3/device/<device_token>'
    
    const client = http2.connect(host);
    
    client.on('error', (err) => console.error(err));
    
    const body = {
        "aps": {
            "alert": "hello",
            "content-available": 1
        }
    }
    
    const headers = {
        ':method': 'POST',
        'apns-topic': 'com.xxxxxx.xxxxxx', //your application bundle ID
        ':scheme': 'https',
        ':path': path,
        'authorization': `bearer ${token}`
    }
    
    const request = client.request(headers);
    
    
    // request.on('response', response => {
    //     console.log("apnresponse",JSON.stringify(response));
    // });

    request.on('response', (headers, flags) => {
        for (const name in headers) {
            console.log(`${name}: ${headers[name]}`);
        }
    });
    
    request.setEncoding('utf8');
    let data = ''
    request.on('data', (chunk) => { data += chunk; });
    request.write(JSON.stringify(body))
    request.on('end', () => {
        console.log(`\n${data}`);
        client.close();
    });
    request.end();    

IOS team is able to successfully send notifications to the device using the firebase console. PUsh notifications fail only when I try from the node backend.

According to the Apple documentation, neither the device token is invalid, nor I am using production certificate for the development server or vice versa; neither of which are the case here.

How can I make this work?

swaths
  • 3
  • 3

0 Answers0