2016-10-09 3 views
23

ऐप्पल ने हाल ही में एपीएनएस (Apple Push Notification Authentication Key (Sandbox & Production)) के लिए एक नई प्रमाणीकरण विधि जोड़ा। - उन्हें जोड़ने कीचेन पर, एक प्रमाण पत्र के लिए पूछ रहा है और का उपयोग कर OpenSSLएपीएन एथ कुंजी और मानक सीएलआई उपकरण का उपयोग करके एपीएन पुश संदेश कैसे भेजें?

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

मैं पुरानी विधि के उपयोग APN के संदेशों का उपयोग कर रहा:

enter image description here

डाउनलोड किया कुंजी एक निजी कुंजी से एक .p8 फ़ाइल है gateway.production.push.apple.com:2195 पर संदेश भेजने के लिए।

मैं नए प्रारूप का उपयोग कर मानक सीएलआई लिनक्स टूल (ओपनएसएसएल, पायथन इत्यादि) का उपयोग करके पुश नोटिफिकेशन कैसे भेजूं?

उत्तर

32

आप HTTP/2 का समर्थन और ECDSA समर्थन आपकी मशीन पर इंस्टॉल साथ openssl साथ कर्ल है, तो आप एक 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 

नोट:http://thrysoee.dk/apns/ Php में

+0

बहुत बहुत धन्यवाद। इसका काम – Sakthimuthiah

+1

@ जेस थ्रीसोसी आपका "मामूली बदलाव" ** CHAMP ** की तरह काम करता है। सभी को देखने के लिए अपने कड़ी मेहनत को पोस्ट करने के लिए धन्यवाद, यह आपके जैसे लोग हैं जो समुदाय को रसदार रखते हैं +1 – Jacksonkr

+1

इस बहुत उपयोगी लिपि के लिए धन्यवाद। मेरे मैक पर, मुझे http2 समर्थन के साथ कर्ल स्थापित करने के लिए "--with-nghttp2" विकल्प जोड़ना पड़ा था (क्योंकि होम-ब्रू कर्ल वर्तमान में डिफ़ॉल्ट रूप से http2 समर्थन नहीं प्रतीत होता है): ब्रू इंस्टॉल कर्ल - साथ-nghttp2। --http2 और स्क्रिप्ट अच्छी तरह से काम करता है: (या के रूप में मैं पहले से ही कर्ल स्थापित किया था: काढ़ा कर्ल --with-nghttp2 को पुनर्स्थापित) फिर स्क्रिप्ट में कर्ल आदेश पर, मैं विकल्प जोड़ा। धन्यवाद। –

8

आप ऐप्पल पुश अधिसूचना प्रमाणीकरण कुंजी (सैंडबॉक्स & उत्पादन) का उपयोग करके NODE जेएस द्वारा पुश अधिसूचना भेज सकते हैं। ऐप्पल ने this link

में इस ट्यूटोरियल में एक ट्यूटोरियल प्रदान किया है इस ट्यूटोरियल में ऐप्पल पुश अधिसूचना प्रमाणीकरण कुंजी बनाने और पुश अधिसूचना भेजने के लिए नोड जेएस कोड चलाने के लिए स्थानीय सर्वर स्थापित करने के सभी कदम हैं। आप कोड को अपनी स्थानीय मशीन में चला सकते हैं और पुश अधिसूचना का परीक्षण कर सकते हैं।

आशा है कि इससे मदद मिलेगी।

+0

यह जीवन बचतकर्ता है! यह बहुत सुरुचिपूर्ण है! –

0

Voilà यह कैसा दिखता है: मैं कर्ल और openssl की संस्करणों homebrew साथ पर MacOS के परीक्षण के लिए इस स्क्रिप्ट का एक मामूली बदलाव का उपयोग करें। यह स्क्रिप्ट जनरेटेड टोकन आईडी के साथ 200 ओके स्टेटस कोड लौटाती है।

// 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); 
संबंधित मुद्दे