How to send APNs push messages using APNs Auth Key and standard CLI tools?

后端 未结 4 636
北荒
北荒 2021-01-30 10:29

Apple recently added a new authentication method to APNS ( Apple Push Notification Authentication Key (Sandbox & Production)).

The downloaded key is a

4条回答
  •  孤街浪徒
    2021-01-30 11:07

    The answer provided by Nicolas Manzini, while helpful, did not fully work for me. I also wanted to use command line curl. In particular, reading in the .p8 file was causing some problems. A modified version:

     'ES256', 'kid' => $keyid];
    $header = base64_encode(json_encode($header));
    
    $claim = ['iss' => $teamid, 'iat' => time()];
    $claim = base64_encode(json_encode($claim));
    
    $tok = $header . '.' . $claim;
    
    // pass in empty $signature, 2nd line below fills it
    $signature = '';
    $result = openssl_sign($tok, $signature, $privateKey, OPENSSL_ALGO_SHA256);      //  'sha256'
    if (! $result) {
        die('unable to create signature');
    }
    
    $sign = base64_encode($signature);
    
    openssl_free_key($privateKey);
    
    $jwt = $tok . '.' . $sign;
    
    foreach($tokens as $token) {
        $cmd = '\
        /usr/local/bin/curl -v \
        -d \'{"aps":{"alert":{"title":"Notification Title","body":"You are being notified!"},"sound":"default"}}\' \
        -H "apns-topic: com.app.bundle.id" \
        -H "authorization: bearer ' . $jwt . '" \
        -H "content-type:application/json" \
        --http2 \
        https://api.push.apple.com/3/device/' . $token . ' 2>&1';    // ending w/ 2>&1, sends output to $output
    
        exec($cmd, $output, $return);
    
        if ($return != 0) {
            // be notified of error
        }
        else {
            foreach($output as $line) {
                if (strpos($line, 'apns-id')) {
                    $apns = $line;
                }
            }
        }
    }
    
    ?>
    

提交回复
热议问题