2017-01-13 1 views
3

Apple hat ihren Push-Benachrichtigungsdienst aktualisiert und die Zertifikatsdatei ist nun eine .p8-Datei. Es gibt viele Beispiele online, wie man eine Push-Benachrichtigung mit der .pem-Datei sendet, aber ich kann nichts für eine .p8-Datei finden. Hat jemand Code, der mit der .p8-Datei funktioniert?Senden iOS Push-Benachrichtigung in PHP mit. P8-Datei

Antwort

0

Ich habe versucht, Push-Benachrichtigung mit neuen JWT based push notification service mit PHP zu senden. Es war definitiv keine leichte Aufgabe.

Ich habe Projekt auf GitHub hochgeladen. Sie können von dort herunterladen und stellen Sie sicher, dass Sie Ihre .p8-Datei durch vorhandene .p8-Datei ersetzen.

dann in push.php Datei benötigen Sie kid, iss(Team ID), token und app_bundle_id zu ersetzen.

Gehen Sie in das Verzeichnis und führen Sie vom Terminal aus den Befehl php push.php aus. Wenn alles gut läuft, sollten Sie eine Push-Benachrichtigung erhalten.

Diese Lösung funktioniert gut für mich. Stellen Sie nur sicher, dass Sie im Terminal keine Fehler bekommen.

Ich hoffe, das hilft.

+0

Ich versuche haben, aber arbeiten nicht in php5 .6 Version geben Fehler. –

1

Mit dem folgenden Skript bin ich in der Lage, tokenbasierte Push-Benachrichtigungen mit der .p8-Datei zu senden.

Die Mindestversion von curl diese Unterstützung ist 7.38.0, und es muss mit der Flagge kompiliert werden --with-nghttp2 und OpenSSL> = 1.0.2

<?php 

    $keyfile = 'AuthKey_AABBCC1234.p8';    # <- Your AuthKey file 
    $keyid = 'AABBCC1234';       # <- Your Key ID 
    $teamid = 'AB12CD34EF';       # <- Your Team ID (see Developer Portal) 
    $bundleid = 'com.company.YourApp';    # <- Your Bundle ID 
    $url = 'https://api.development.push.apple.com'; # <- development url, or use http://api.push.apple.com for production environment 
    $token = 'e2c48ed32ef9b018........';    # <- Device Token 

    $message = '{"aps":{"alert":"Hi there!","sound":"default"}}'; 

    $key = openssl_pkey_get_private('file://'.$keyfile); 

    $header = ['alg'=>'ES256','kid'=>$keyid]; 
    $claims = ['iss'=>$teamid,'iat'=>time()]; 

    $header_encoded = base64($header); 
    $claims_encoded = base64($claims); 

    $signature = ''; 
    openssl_sign($header_encoded . '.' . $claims_encoded, $signature, $key, 'sha256'); 
    $jwt = $header_encoded . '.' . $claims_encoded . '.' . base64_encode($signature); 

    // only needed for PHP prior to 5.5.24 
    if (!defined('CURL_HTTP_VERSION_2_0')) { 
     define('CURL_HTTP_VERSION_2_0', 3); 
    } 

    $http2ch = curl_init(); 
    curl_setopt_array($http2ch, array(
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0, 
    CURLOPT_URL => "$url/3/device/$token", 
    CURLOPT_PORT => 443, 
    CURLOPT_HTTPHEADER => array(
     "apns-topic: {$bundleid}", 
     "authorization: bearer $jwt" 
    ), 
    CURLOPT_POST => TRUE, 
    CURLOPT_POSTFIELDS => $message, 
    CURLOPT_RETURNTRANSFER => TRUE, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_HEADER => 1 
)); 

    $result = curl_exec($http2ch); 
    if ($result === FALSE) { 
    throw new Exception("Curl failed: ".curl_error($http2ch)); 
    } 

    $status = curl_getinfo($http2ch, CURLINFO_HTTP_CODE); 
    echo $status; 

    function base64($data) { 
    return rtrim(strtr(base64_encode(json_encode($data)), '+/', '-_'), '='); 
    } 

?> 
+0

Ich bekomme einen Fehler als 'Unerwartete HTTP/1.x Anfrage: POST/3/device/5cba9501b6b6b3d6xxxxxxxxxxxxx'. Können Sie eine Lösung vorschlagen? –

+0

Können Sie versuchen, den Webserver neu zu starten, wie in dieser Antwort vorgeschlagen: https://stackoverflow.com/a/48007808/1833495? –