2014-01-20 8 views
6

ich auf einem iOS-App bin arbeiten, die iOS Push-Benachrichtigungen verwenden. Ich möchte die Benachrichtigung von einem PHP-Skript auf meinem Server senden. Der Code in meiner App funktioniert wirklich gut für die Registrierung für die Remote-Benachrichtigung und erhalten sie. Ich benutze diese PHP-Skript-Benachrichtigung zu senden und es funktioniert zu gut:senden iOS Push-Benachrichtigung von PHP

<?php 

// My device token here (without spaces): 
$deviceToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; 

// My private key's passphrase here: 
$passphrase = 'myPrivateKey'; 

// My alert message here: 
$message = 'New Push Notification!'; 

//badge 
$badge = 1; 

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); 
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

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

if (!$fp) 
exit("Failed to connect: $err $errstr" . PHP_EOL); 

echo 'Connected to APNS' . PHP_EOL; 

// Create the payload body 
$body['aps'] = array(
    'alert' => $message, 
    'badge' => $badge, 
    'sound' => 'newMessage.wav' 
); 

// Encode the payload as JSON 
$payload = json_encode($body); 

// Build the binary notification 
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 

// Send it to the server 
$result = fwrite($fp, $msg, strlen($msg)); 

if (!$result) 
    echo 'Error, notification not sent' . PHP_EOL; 
else 
    echo 'notification sent!' . PHP_EOL; 

// Close the connection to the server 
fclose($fp); 

Mein Problem ist, dass, wenn ich dieses Skript auf meinem imac von Terminal läuft, funktioniert alles gut und Benachrichtigungen gesendet werden, aber wenn ich es lade auf Mein Server funktioniert nicht. Mein Zertifikat ist gültig und befindet sich im selben Ordner des Skripts. Wenn ich versuche, das Skript auf dem Server ausgeführt werden, füge ich diese Zeile die Zertifikatsdatei zu schließen und den Variable $ cerificate verwenden:

Dies ist der Fehler der PHP-Server-Seite:

Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Connection timed out) in script.php on line 29 
Failed to connect: 110 Connection timed out 

Warum passiert das? Muss ich etwas auf meinem Server hinzufügen, um die PAN-Verbindung zu aktivieren?

----- UPDATE FRAGE -----

Mein erstes Problem war, dass ich nicht über die Privilegien Verbindung auf Port 2195 senden und Antwort auf Port empfangen 2196. Nun, mein Server-Admin ermöglicht diese Verbindung, und ich habe verschiedene Fehler:

Warning: stream_socket_client() [function.stream-socket-client]: SSL operation failed with code 1. OpenSSL Error messages: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure in script.php on line 28 

Warning: stream_socket_client() [function.stream-socket-client]: Failed to enable crypto in script.php on line 28 

Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in script.php on line 28 

Es konnte keine Verbindung: 0

+0

können Sie eine Telnet-Verbindung von Ihrem Server APNS Server machen (von Server-Konsole)? –

+1

Irgendein Zeitserver lässt nicht zu, dass Sie Port verwenden, der erforderlich ist ... fragen Sie besser Ihren Serveradministrator und bestätigen Sie, wenn Sie Privilegien erhielten ... benutzen Sie shared hosting ...? Dies geschieht in Shared Hosting ... –

+1

Ja, ich benutze Shared Hosting und ich habe nur auf meinem Server admin schreiben. @rokjarc leid, aber ich bin nicht in der Lage eine Telnet-Verbindung zu testen, weil nicht wissen, wie kann ich das tun, sorry, aber ich bin ein neuer Programmierer :( – lubilis

Antwort

5

Es passiert, wenn Sie Hosting werden gemeinsam genutzt verwenden und Hosting-Provider haben Sie Privilegien nicht geben, um ausgehende Verbindungen auf Port 2195 zu verwenden und 2196. Sie sollten VPS verwenden oder einen anderen pr oviders wie urbanAirship und parse.com dafür. Oder auch können Sie Ihre eigenen lokalen Server laufen ... für diese

+0

Ok, ich Verwenden Sie Shared Hosting, das ist mein Problem. Kann mir mein Serveradministrator nicht die Rechte geben, diese Ports zu benutzen? Und was passiert, wenn ich die Portnummer ändere, wenn ich versuche, die Verbindung herzustellen? – lubilis

+0

Sie benötigen diese Ports, da die APNS-Dienste über diese Ports 2195 zum Senden und 2196 zum Feedback-Dienst kommunizieren, die Firewall jedoch normalerweise blockiert. Sie müssen dazu Ihren Hosting-Provider kontaktieren. –

+0

Ich habe meine Frage aktualisiert, nachdem ich meine Rechte an den Ports aktiviert habe – lubilis