2016-10-09 32 views
23

Apple geçtiğimiz günlerde APNS'e (Apple Push Notification Authentication Key (Sandbox & Production)) yeni bir kimlik doğrulama yöntemi ekledi. - OpenSSL'yi bir sertifika soran ve kullanma, Anahtarlık ekleyerekAPN'ler APN'ler Auth Key ve standart CLI araçları kullanarak push mesajları nasıl gönderilir?

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

eski yöntemi kullanarak APN mesajları kullanıyorum:

enter image description here

indirilen anahtar bir özel anahtarla bir .p8 dosyasıdır gateway.production.push.apple.com:2195'a mesaj göndermek için

Yeni biçimi kullanarak standart CLI Linux araçlarını (OpenSSL, Python vb.) Kullanarak push bildirimlerini nasıl gönderirim?

cevap

32

, bir APN Auth Anahtar kullanarak push bildirimleri sınamak için aşağıdaki komut dosyasını kullanabilirsiniz:

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

NOT: göründüğü gibi Php http://thrysoee.dk/apns/

+0

Çok teşekkürler. Çalıştığı – Sakthimuthiah

+1

@JessThrysoee "Hafif varyasyonunuz" bir ** CHAMP ** gibi çalışır. Gördüğünüz her şey için sıkı çalışmanızı gönderdiğiniz için teşekkür ederiz, topluluğun sulandığını hissettiren insanlar +1 – Jacksonkr

+1

Bu çok yardımcı senaryo için teşekkür ederiz. Mac'imde, http - destek ile curl'i yüklemek için "--with-nghttp2" seçeneğini eklemem gerekiyordu (ev-demiri kıvrımı şu anda varsayılan olarak http2 desteğine sahip değil gibi): brew install curl - ile-nghttp2. --http2 ve komut dosyası iyi çalışır: (veya zaten bukle yüklü ettiği gibi: demlemek bukle --with-nghttp2 yeniden) Ardından komut bukle komuta, ilgili seçeneği eklendi. Teşekkür ederim. –

8

Apple Push Bildirimi Doğrulama Anahtarını (Sandbox & Üretim) kullanarak NODE JS tarafından push bildirimi gönderebilirsiniz. Apple, this link

'da bir eğitim sağladı. Bu eğiticide, Apple Push Notification Authentication Key (Apple İtme Bildirimi Kimlik Doğrulama Anahtarı) oluşturulmasına ve push bildirimi göndermek için Node JS kodunu çalıştıracak yerel bir sunucu kurmaya yönelik tüm adımlar bulunmaktadır. Kodu yerel makinenizde çalıştırabilir ve push bildirimini test edebilirsiniz.

Bu yardımcı olacaktır umarım. makinenizde yüklü ECDSA desteği ile HTTP/2 desteği ve openssl ile bukle varsa

+0

Bu hayat koruyucu! Çok zarif! –

0

Voilà: Ben homebrew ile MacOS üzerinde kıvrılması ve Openssl ait sürümlerini test için bu senaryo çok hafif bir değişim kullanın. Bu komut dosyası, oluşturulmuş belirteç kimliğiyle birlikte 200 tamam durum kodunu döndürü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);