prefijo notification clave autenticación apple app apns apple-push-notifications

apple push notifications - notification - ¿Cómo enviar mensajes de inserción de APN utilizando la clave de autenticación de APN y las herramientas CLI estándar?



firebase push notification ios (3)

Puede enviar notificaciones push por NODE JS usando la clave de autenticación de notificaciones push de Apple (Sandbox & Production). Apple ha proporcionado un tutorial en este enlace.

Este tutorial tiene todos los pasos para crear la clave de autenticación de notificaciones push de Apple y configurar un servidor local para ejecutar el código Node JS para enviar notificaciones push. Puede ejecutar el código en su máquina local y probar la notificación de inserción.

Espero que esto ayude.

Apple agregó recientemente un nuevo método de autenticación a APNS ( Clave de autenticación de notificación push de Apple (Sandbox & Production) ).

La clave descargada es un archivo .p8 con una clave privada:

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

Estoy usando mensajes APN usando el método anterior: los agrego a keychain, gateway.production.push.apple.com:2195 un certificado y gateway.production.push.apple.com:2195 OpenSSL para enviar mensajes a gateway.production.push.apple.com:2195 .

¿Cómo envío notificaciones automáticas utilizando las herramientas estándar de CLI para Linux (OpenSSL, Python, etc.) utilizando el nuevo formato?


Si tiene curl con soporte HTTP / 2 y openssl con soporte ECDSA instalado en su máquina, puede usar el siguiente script para probar las notificaciones push usando una clave de autenticación de 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

NOTA: utilizo una ligera variación de este script para probar en macOS con versiones caseras de curl y openssl: http://thrysoee.dk/apns/


Voilà en php lo que parece. Esta secuencia de comandos devuelve el código de estado 200 ok junto con el ID de token generado.

// 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);