webentwicklung-frage-antwort-db.com.de

Neue APNS Provider API und PHP

Ich habe angefangen, Code basierend auf this zu erstellen, um Push-Benachrichtigungen von PHP zu senden.

Nun, da ich verstanden habe, gibt es eine neue API, die HTTP/2 verwendet und in der Antwort Feedback gibt. Ich versuche herauszufinden, was ich tun muss, um dieses Feedback zu erhalten.

Ich konnte keine Tutorials oder Beispielcodes finden, um mir Anweisungen zu geben (ich denke, weil es so neu ist).

Kann die stream_socket_client()-Methode zum Herstellen einer Verbindung mit APNS mit der neuen Provider-API verwendet werden? Wie bekomme ich die Rückmeldung? Alles, was ich jetzt von fwrite($fp, $msg, strlen($msg)) bekomme, ist eine Nummer. Für alle Absichten und Zwecke können Sie meinen Code als den Code aus der der SO - Frage betrachten, auf der ich meinen Code auf stützte.

Vielen Dank!

17
Ben Holness

Mit der neuen HTTP/2-APNS-Provider-API können Sie mit curl Push-Benachrichtigungen senden.

[~ # ~] edit [~ # ~]

Bevor Sie fortfahren (wie von @Madox angegeben), sollten Sie openssl> = 1.0.2e von installieren (vorzugsweise aus dem Paket). Überprüfen Sie mit dem Befehl

openssl version

a) Ihre Version von PHP sollte> = 5.5.24 sein, damit die Konstante CURL_HTTP_VERSION_2_0 definiert wird.

b) Stellen Sie sicher, dass auf Ihrem System die Curl-Version 7.46+ mit installiert ist

curl --version

c) Für Curl sollte die http/2-Unterstützung aktiviert sein. Wenn Sie den vorherigen Befehl eingeben, sollten Sie in der Ausgabe eine Zeile wie die folgende sehen:

Features: IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets 

wenn HTTP2 nicht angezeigt wird, können Sie dieses hervorragende Tutorial befolgen, um http/2 für curl https://serversforhackers.com/video/curl-with-http2-support zu installieren

Stellen Sie sicher, dass die Locke "openssl> = 1.0.2e" erkannt wurde. Wenn Sie "curl --version" ausführen, sollte dies etwa so aussehen:

curl 7.47.1 (x86_64-pc-linux-gnu) libcurl/7.47.1 OpenSSL/1.0.2f zlib/1.2.8 libidn/1.28 nghttp2/1.8.0-DEV librtmp/2.3

e) Sobald Sie alles installiert haben, können Sie es in der Befehlszeile testen:

curl -d '{"aps":{"alert":"hi","sound":"default"}}' \ 
--cert <your-certificate.pem>:<certificate-password> \ 
-H "apns-topic: <your-app-bundle-id>" \ 
--http2  \ 
https://api.development.Push.Apple.com/3/device/<device-token>

f) Hier ist ein Beispielcode in PHP, den ich erfolgreich ausprobiert habe:

if(defined('CURL_HTTP_VERSION_2_0')){

    $device_token   = '...';
    $pem_file       = 'path to your pem file';
    $pem_secret     = 'your pem secret';
    $apns_topic     = 'your apns topic. Can be your app bundle ID';


    $sample_alert = '{"aps":{"alert":"hi","sound":"default"}}';
    $url = "https://api.development.Push.Apple.com/3/device/$device_token";

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $sample_alert);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("apns-topic: $apns_topic"));
    curl_setopt($ch, CURLOPT_SSLCERT, $pem_file);
    curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $pem_secret);
    $response = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    //On successful response you should get true in the response and a status code of 200
    //A list of responses and status codes is available at 
    //https://developer.Apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/TheNotificationPayload.html#//Apple_ref/doc/uid/TP40008194-CH107-SW1

    var_dump($response);
    var_dump($httpcode);

}
33
tiempor3al

Ich benutze CentOS 6 und der Weg zu lösen war die Installation von Source cURL und OpenSSL.

Es mag sehr einfach aussehen, aber ich habe 3 Tage gebraucht, um die richtige Konfiguration für die Pakete herauszufinden. Ich denke, ich kann jemandem helfen, indem ich hier posten werde.

Es erwies sich als etwas schwierig, da ich nicht gewohnt bin, Pakete aus dem Quellcode zu installieren, aber ich kann jetzt über HTTPS über HTTP/2 eine Verbindung zu APNs herstellen.

Die Details von dem, was ich getan habe, ist hier:

  1. CURL und OpenSSL herunterladen und dekomprimieren:

    wget https://curl.haxx.se/download/curl-7.47.1.tar.gz
    wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz
    
  2. Konfigurieren Sie OpenSSL mit den folgenden Flags (Ich bin nicht sicher, was sie tun, aber was hat bei mir funktioniert):

    export CXXFLAGS="$CXXFLAGS -fPIC"
    ./config zlib enable-ssl3 enable-shared
    
  3. machen Sie OpenSSL und installieren Sie es

  4. Konfigurieren Sie cURL mit dem folgenden Flag:

    ./configure --with-ssl=/usr/local/ssl/
    
  5. Erstellen und installieren Sie cURL

  6. setze LD_LIBRARY_PATH auf/usr/local/ssl/lib /

    export LD_LIBRARY_PATH=/usr/local/ssl/lib/                  
    
  7. Prüfung

    /usr/local/bin/curl -v -d '{"aps":{"alert":"hi","sound":"default"}}' --cert cert.crt --key cert.key -H "apns-topic: topics" --http2 https://api.development.Push.Apple.com:443/3/device/00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0
    

Das Ergebnis:

*   Trying 17.172.238.203...
* Connected to api.development.Push.Apple.com (17.172.238.203) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Request CERT (13):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS handshake, CERT verify (15):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=api.development.Push.Apple.com; OU=management:idms.group.533599; O=Apple Inc.; ST=California; C=US
*  start date: Jun 19 01:49:43 2015 GMT
*  expire date: Jul 18 01:49:43 2017 GMT
*  subjectAltName: Host "api.development.Push.Apple.com" matched cert's "api.development.Push.Apple.com"
*  issuer: CN=Apple IST CA 2 - G1; OU=Certification Authority; O=Apple Inc.; C=US
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* TCP_NODELAY set
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x1091110)
> POST /3/device/00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0 HTTP/1.1
> Host: api.development.Push.Apple.com
> User-Agent: curl/7.48.0
> Accept: */*
> apns-topic: topics
> Content-Length: 40
> Content-Type: application/x-www-form-urlencoded
>
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
* We are completely uploaded and fine
< HTTP/2.0 400
<
* Connection #0 to Host api.development.Push.Apple.com left intact
{"reason":"BadDeviceToken"}

Wie Sie sehen können, habe ich das Hässliche los

▒@@▒HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 504f5354202f332f6465766963652f746573742048545450
4
Samo

Ich möchte einige Informationen zu tiempor3al Antwort hinzufügen.

1) curl muss mit openssl version> = 1.0.2 kompiliert werden, um http/2 vollständig zu unterstützen. Ich erhalte die Fehlermeldung "? @@? HTTP/2-Client-Vorwort-Zeichenfolge fehlt oder ist beschädigt ...", wenn ich sie mit CentOS-Aktie openssl-1.0.1e kompiliere.

2) Wenn Ihre Version des PHP-Moduls mod_curl.so ohne die Konstante CURL_HTTP_VERSION_2_0 kompiliert wurde, können Sie sie durch die Ganzzahl 3 ersetzen:

curl_setopt($ch, CURLOPT_HTTP_VERSION, 3);

4
Madox

Ich konnte Push per HTTP2 erfolgreich mit PHP-CURL senden und das Feedback direkt im Antworttext lesen (hier habe ich ein kurzes Tutorial geschrieben, wie das geht: Senden von Push-Benachrichtigungen mit HTTP2 (und PHP) ) . Ich denke, dass Sie die Antwortanzeige des Sockels überprüfen können (ich erinnere mich nicht genau an die PHP-Funktion, vielleicht "Fgets").

4
valfer

Um HTTP/2 client preface string missing or corrupt-Fehler in PHP 5.6 zu beheben, habe ich ein Apache und CLI PHP Docker-Image erstellt, auf das Sie sich vielleicht verlassen möchten, oder einfach nachsehen, was ich im gemacht habe Dockerfile zum Selbstbau. Gleiches kann wahrscheinlich auf PHP 7.0 zutreffen, obwohl ich es nicht versucht habe.

1
Norbert

Folgen Sie dieser Anleitung [ http://cloudfields.net/blog/ios-Push-notifications-encryption/([1] , um Ihr Zertifikat und Ihren privaten Schlüssel zu generieren und zusammenzuführen Wenn Sie die in der Anleitung beschriebene Datei mit den gleichen Dateinamen verwenden, probieren Sie einfach den Befehl curl aus.

curl -X POST -H 'apns-topic: com.mycompany.ios.BadassApp' -d '{"aps":{"content-available":1,"alert":"hi","sound":"default"}}' --cert apns_cert.pem:yourCertPassword --http2 'https://api.development.Push.Apple.com:443/3/device/b8de1sf067effefc398d792205146fc67dn0e96b0ff21ds81cabe384bbe71353'
1
KeranMarinov