2016-10-09 9 views
23

Apple ostatnio dodał nową metodę uwierzytelniania do APNS (Apple Push Notification Authentication Key (Sandbox & Production)).Jak wysyłać wiadomości APN za pomocą APNs Auth Key i standardowych narzędzi CLI?

enter image description here

Pobrany klucz jest plikiem .p8 z kluczem prywatnym:

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

Używam wiadomości APNS pomocą starej metody - dodając je do pęku kluczy z prośbą o wydanie świadectwa i przy użyciu OpenSSL aby wysyłać wiadomości do gateway.production.push.apple.com:2195.

Jak wysłać powiadomienia wypychane za pomocą standardowych narzędzi CLI Linux (OpenSSL, Python itp.) Przy użyciu nowego formatu?

Odpowiedz

32

Jeśli masz curl z HTTP/2 wsparcia i OpenSSL ze wsparciem ECDSA zainstalowany na komputerze, można użyć poniższy skrypt do testowania powiadomień push stosując APN Auth Key:

#!/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 

UWAGA: używam lekką odmianę tego skryptu do testów na MacOS z homebrew wersje curl i openssl: http://thrysoee.dk/apns/

+0

Wielkie dzięki. Działa: – Sakthimuthiah

+1

@JessThrysoee Twoja "delikatna odmiana" działa jak ** CHAMP **. Dziękujemy za opublikowanie ciężkiej pracy, aby wszyscy mogli ją zobaczyć. To ludzie tacy jak Ty utrzymują społeczność juiced +1 – Jacksonkr

+1

Dziękuję za ten bardzo pomocny skrypt. Na moim Macu musiałem dodać opcję "--with-nghttp2", aby zainstalować curl z obsługą http2 (ponieważ domyślnie curl do home-brew nie ma domyślnie obsługi http2): brew install curl - z-nghttp2. (lub jak miałem już zainstalowane curl: napar ponowna curl --with-nghttp2) Następnie na zwinięcie polecenia w skrypcie dodałem opcję: --http2 i skrypt działa dobrze. Dziękuję Ci. –

8

Możesz wysyłać powiadomienia push przez NODE JS przy użyciu klucza uwierzytelniania powiadomień Push (Sandbox & Produkcja). Firma Apple przedstawiła samouczek w dokumencie this link

Ten samouczek obejmuje wszystkie etapy tworzenia klucza uwierzytelniania powiadomień Apple Push i konfigurowania lokalnego serwera do uruchamiania kodu JS węzła do wysyłania powiadomień push. Możesz uruchomić kod na swoim komputerze lokalnym i przetestować powiadomienie push.

Mam nadzieję, że to pomoże.

+0

To jest ratownik! To takie eleganckie! –

0

voilà w PHP, jak to wygląda. Ten skrypt zwraca kod stanu ok ok 200 wraz z wygenerowanym identyfikatorem tokena.

// 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); 
Powiązane problemy