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