Envoyer iOS notification push à partir de PHP

Je travaille sur une application iOS qui utilisent iOS Notifications Push. Je veux envoyer la notification à partir d'un script php sur mon serveur. Le code de mon application fonctionne vraiment bien pour l'enregistrement de la notification à distance et de recevoir. J'utilise ce script php pour envoyer une notification et il fonctionne bien aussi:

<?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);

Mon problème est que si je lance ce script par terminal sur mon imac, toutes les bonnes œuvres et les notifications sont envoyées, mais si je le télécharge sur mon serveur, ça ne fonctionne pas. Mon certificat est valide et c'est dans le même répertoire que le script. Lorsque j'essaie d'exécuter le script sur le serveur, j'ai ajouter cette ligne à inclure le fichier de certificat et de l'utilisation de la variable $cerificate:

$certificate = file_get_contents('ck.pem');

C'est l'erreur de php côté serveur:

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

Pourquoi cela se produit? Dois-je ajouter quelque chose sur mon serveur pour activer les casseroles de connexion?

-----MISE À JOUR DE QUESTION-----

Mon premier problème est que je n'ai pas les privilèges pour envoyer connexion sur le port 2195 et d'obtenir des réponses sur le port 2196. Maintenant, mon serveur admin a permis de connexion et j'ai des erreurs différentes:

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

Impossible de se connecter: 0

  • pouvez-vous établir une connexion telnet à partir de votre serveur à l'APN serveur (à partir de la console de serveurs)?
  • Certains serveur de temps ne vous permettra pas d'utiliser le port qui est nécessaire... il vaut mieux demander à votre administrateur de serveur et de vérifier si vous avez les privilèges... êtes-vous à l'aide de l'hébergement mutualisé...? ce qui se passe dans l'hébergement mutualisé...
  • Oui, je suis l'aide de l'hébergement mutualisé et je viens d'écrire à mon admin serveur. @rokjarc désolé, mais je ne suis pas en mesure de tester une connexion telnet parce que ne sais pas comment faire, désolé mais je suis un nouveau programmeur 🙁
  • si vous avez accès à des serveurs de console (pas sûr si vous le souhaitez), vous pouvez taper dans telnet gateway.push.apple.com 2195 et d'observer la réponse
  • Non, je ne crois pas avoir accès. Je peux accéder à la base de données, panneau de contrôle ou FTP
  • J'ai mis à jour ma question après l'activation des privilèges sur les ports
  • Salut, j'ai utilisé votre code pour envoyer des push sur ios. Il fonctionne très bien, seul problème, Comment savons-nous si la notification n'est envoyée que le $result contient un entier, dans tous les cas, soit, le succès ou l'échec. J'ai passé un aléatoire token et retourne un entier tel que 115 ans ou de 65 ans et ça change à chaque fois. Donc !$result l'habitude de travailler. Comment pouvons-nous y parvenir?

InformationsquelleAutor lubilis | 2014-01-20