Nur von PHP: es konnte keine Verbindung APNS gateway.push.apple.com:2195

Es ist ein spät in die Nacht. Ich verbrachte 10 Stunden im google/stackoverflow suchen und Experimente. Und scheint, ich hasse Apple Push-Benachrichtigungen. Ich bin Total frustriert und werde für jede Hilfe dankbar.

Danke.

Das problem:

Den PHP code für das senden von Apple Push-Benachrichtigungen, die Sie erfolgreich gearbeitet, vor zwei Wochen aufgehört zu arbeiten, jetzt und wirft folgenden Fehler:

PHP Warning:  stream_socket_client(): Failed to enable crypto in /home/...
PHP Warning:  stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195 (Unknown error) in /home/...

Es aufgehört zu arbeiten auf zwei getrennten Servern, die mit separater scripts für den APNs zu senden.

Umgebung:

Server: CentOS 6.5 mit PHP 5.4.32 und Ubuntu 14.04.3 mit PHP 5.5.9

APN: Im Produktionsmodus

Zertifikate: getestet mit 700+ push-Benachrichtigungen.

Einer der Server ist mit https://github.com/immobiliare/ApnsPHP, andere - https://github.com/antongorodezkiy/wp-apn, auf localhost getestet habe ich Sie einfach Datei ohne Verwendung jeglicher third-party-code.

Untersuchung:

Für alle nachstehend aufgeführten Fällen habe ich die gleichen aktiven Geräte-token und der gleichen Produktions-PEM-Zertifikat.

php

Aber selbst dieser einfache code nicht funktioniert auf beide Server und localhost und wieder den gleichen Fehler wie oben:

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', '/absolute/path/to/apn_prod.pem');

//Open a connection to the APNS server
$fp = stream_socket_client(
    'ssl://gateway.push.apple.com:2195', $err,
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

Ich auch versucht zu spielen mit stream_context_set_option() Optionen, gehören entrust_2048_ca.cer etc, und auch einige Optionen aus dieser Artikel. Obwohl der code funktioniert ohne änderungen, bevor August 2015.

openssl

Verbindung gearbeitet mit openssl (link):

openssl s_client -connect gateway.push.apple.com:2195 -cert /absolute/path/to/apn_prod.pem -debug -showcerts -CAfile /absolute/path/to/server-ca-cert.pem

Und bekam mit CONNECTED(00000003) und Verify return code: 0 ( ok ).

telnet

Verbindung gearbeitet mit telnet:

-sh-4.1$ telnet gateway.push.apple.com 2195
Trying 17.172.233.150...
Connected to gateway.push.apple.com.

pecl apn

Es nicht senden push-Benachrichtigung. Ich habe gerade versucht die Anpassung von Beispiel-code, aber habe den Fehler Invalid token. Der token ist aktiv und gleichen token, die ich überall eingesetzt und für Houston und Ruby auch.

houston

Es funktionierte mit Houston

apn push "0346a53f...231d9d6abe11" -c /absolute/path/to/apn_prod.pem -m "Hello from the command line!" -e "production"

ruby

Ich bin nicht ein Ruby-Programmierer (noch zumindest), aber nach dem Erfolg mit Houston, die ich gefunden und angepasst Ruby-code, ohne Houston Abhängigkeit.

Und es funktionierte:

#!/usr/bin/env ruby

require 'openssl'
require 'socket'
require 'json'

token = "0346a53f...231d9d6abe11"
cert = File.read("/absolute/path/to/apn_prod.pem")
ctx = OpenSSL::SSL::SSLContext.new
ctx.key = OpenSSL::PKey::RSA.new(cert, '') #set passphrase here, if any
ctx.cert = OpenSSL::X509::Certificate.new(cert)

sock = TCPSocket.new('gateway.push.apple.com', 2195) #development gateway
ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
ssl.connect

payload = {"aps" => {"alert" => "Oh hai!", "badge" => 1, "sound" => 'default'}}
json = payload.to_json()
token =  [token.delete(' ')].pack('H*') #something like 2c0cad 01d1465 346786a9 3a07613f2 b03f0b94b6 8dde3993 d9017224 ad068d36
apnsMessage = "\0\0 #{token}\0#{json.length.chr}#{json}"
ssl.write(apnsMessage)

ssl.close
sock.close

puts "End"

Fragen:

  1. Was ist falsch mit PHP? Gibt es einige Fehler im Zusammenhang mit diesem Thema? (Empfinde ich nicht als bug-report)
  2. Irgendwelche Ideen wie man dieses Problem lösen?
  3. Irgendwelche Ideen, was könnte der Unterschied in PHP und Ruby-Fällen (ich gehe davon aus, dass Python oder Perl arbeiten konnte, auch in Ordnung)? Ich habe sogar versucht zu Lesen, PHP-Quellen, aber ohne Erfolg, zu verstehen, wie stream_socket_client() umgesetzt werden.

Bitte helfen.

Hast du APNS-Benachrichtigungen arbeiten? Ich habe das gleiche Problem auf PHP-dev-server mit dem production server wie erwartet ausgeführt mit gemeinsamen Codebasis.
ja, ich habe es behoben. Überprüfen Sie bitte meine Antwort ( stackoverflow.com/a/33015070/741782 ) und danke für die Erinnerung mich über dieses ticket

InformationsquelleAutor antongorodezkiy | 2015-08-13

Schreibe einen Kommentar