43 votes

Comment envoyer des messages push APN à l'aide de la clé d'authentification APN et des outils CLI standard?

Apple a récemment ajouté une nouvelle méthode d'authentification à l'APN ( Apple Push Notification de la Clé d'Authentification (bac à sable et de la Production)).

enter image description here

Le téléchargement de la clé est un .p8 le fichier avec une clé privée:

$ cat APNSAuthKey_3HHEB343FX.p8
-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBH...Already.Revoked...lHEjCX1v51W
-----END PRIVATE KEY-----

Je suis à l'aide de l'Apn messages à l'aide de la méthode historique - les ajouter au trousseau, demandant un certificat et d'utiliser OpenSSL pour envoyer des messages à d' gateway.production.push.apple.com:2195.

Comment puis-je envoyer des notifications push à l'aide de la norme de la CLI outils Linux (OpenSSL, Python, etc) en utilisant le nouveau format?

70voto

Jess Thrysoee Points 486

Si vous avez curl avec le support HTTP / 2 et openssl avec le support ECDSA installé sur votre ordinateur, vous pouvez utiliser le script suivant pour tester les notifications push à l'aide d'une clé d'authentification APN:

 #!/bin/bash

deviceToken=b27371497b85611baf9052b4ccfb9641ab7fea1d01c91732149c99cc3ed9342f

authKey="./APNSAuthKey_ABC1234DEF.p8"
authKeyId=ABC1234DEF
teamId=TEAM123456
bundleId=com.example.myapp
endpoint=https://api.development.push.apple.com

read -r -d '' payload <<-'EOF'
{
   "aps": {
      "badge": 2,
      "category": "mycategory",
      "alert": {
         "title": "my title",
         "subtitle": "my subtitle",
         "body": "my body text message"
      }
   },
   "custom": {
      "mykey": "myvalue"
   }
}
EOF

# --------------------------------------------------------------------------

base64() {
   openssl base64 -e -A | tr -- '+/' '-_' | tr -d =
}

sign() {
   printf "$1"| openssl dgst -binary -sha256 -sign "$authKey" | base64
}

time=$(date +%s)
header=$(printf '{ "alg": "ES256", "kid": "%s" }' "$authKeyId" | base64)
claims=$(printf '{ "iss": "%s", "iat": %d }' "$teamId" "$time" | base64)
jwt="$header.$claims.$(sign $header.$claims)"

curl --verbose \
   --header "content-type: application/json" \
   --header "authorization: bearer $jwt" \
   --header "apns-topic: $bundleId" \
   --data "$payload" \
   $endpoint/3/device/$deviceToken
 

NOTE: J'utilise une légère variante de ce script pour tester sur macOS avec les versions homebrew de curl et openssl: http://thrysoee.dk/apns/

13voto

Teena nath Paul Points 161

Vous pouvez envoyer des notifications push par NODE JS à l'aide de Notification Push d'Apple Clé d'Authentification (bac à sable et Production). Apple a fourni un tutoriel dans ce lien

Ce tutoriel a toutes les étapes de la création d'Apple Push Notification des Clés d'Authentification et de configuration d'un serveur local pour exécuter Nœud du code JS pour l'envoi de notifications push. Vous pouvez exécuter le code dans votre machine locale et le test de la notification push.

Espérons que cela aidera.

6voto

Nicolas Manzini Points 2205

Voilà en Php à quoi ça ressemble. Ce script renvoie le code d'état 200 ok avec l'identifiant de jeton généré.

 // THE FINAL SCRIPT WITHOUT DEPENDENCIES!!! ...except curl with http2
$device_token = "a0abd886etc...";
//echo $key;
$kid      = "YOURKEYID";
$teamId   = "YOURTEAMID";
$app_bundle_id = "your.app.bundle";
$base_url = "https://api.development.push.apple.com";

$header = ["alg" => "ES256", "kid" => $kid];
$header = base64_encode(json_encode($header));

$claim = ["iss" => $teamId, "iat" => time()];
$claim = base64_encode(json_encode($claim));

$token = $header.".".$claim;
// key in same folder as the script
$filename = "KeyFromApple.p8";
$pkey     = openssl_pkey_get_private("file://{$filename}");
$signature;
openssl_sign($token, $signature, $pkey, 'sha256');
$sign = base64_encode($signature);

$jws = $token.".".$sign;

$message = '{"aps":{"alert":"You are welcome.","sound":"default"}}';

function sendHTTP2Push($curl, $base_url, $app_bundle_id, $message, $device_token, $jws) {

    $url = "{$base_url}/3/device/{$device_token}";
    // headers
    $headers = array(
        "apns-topic: {$app_bundle_id}",
        'Authorization: bearer ' . $jws
    );
    // other curl options
    curl_setopt_array($curl, array(
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
        CURLOPT_URL => $url,
        CURLOPT_PORT => 443,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_POST => TRUE,
        CURLOPT_POSTFIELDS => $message,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_SSL_VERIFYPEER => FALSE,
        CURLOPT_HEADER => 1
    ));
    // go...
    $result = curl_exec($curl);
    if ($result === FALSE) {
        throw new Exception("Curl failed: " .  curl_error($curl));
    }
    print_r($result."\n");
    // get response
    $status = curl_getinfo($curl);
    return $status;
}
// open connection
$curl = curl_init();
sendHTTP2Push($curl, $base_url, $app_bundle_id, $message, $device_token, $jws);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X