2010-11-25 3 views
1

J'ai rencontré un gros problème lorsque je faisais du développement sur Apple Push Notification Service.Pourquoi ne puis-je pas me connecter au service de notification push Apple?

j'ai écrit un script PHP (apns.php) qui utilisera un fichier PEM (de ck.pem) comme certificat de sécurité et établir une connexion SSL pour APNS quand je poste une requête HTTP, mais il a toujours échoué quand il a essayé de connecter le port de service (ssl://gateway.sandbox.push.apple.com:2195). Le script PHP est déployé sur un Linux Hosting de GoDaddy (il devrait supporter SSL).

Je me suis déjà inscrit pour devenir membre du programme développeur iOS et j'ai enregistré le service de notification push Apple pour mon application. Et j'ai généré un fichier de certificat et un key file (cert.p12 and key.p12) à partir Keychain Access et les traduire en PEM files(cert.pem and key.pem) et les joindre en un (ck.pem) et le mettre dans le même répertoire de script PHP.

Je veux savoir s'il y a quelque chose qui ne va pas! Pourriez-vous vous référer à la pièce jointe des fichiers dont vous pourriez avoir besoin?

Merci beaucoup!

La requête HTTP est quelque chose comme ci-dessous.

http://www.insidertracker.net/apns/apns.php?message=&badge=2&sound=received5.caf 

Le message de réponse de ma demande est ci-dessous:

Attention: stream_socket_client() [function.stream-socket-client]: incapable de se connecter à ssl: // passerelle. sandbox.push.apple.com:2195 (Connexion refusée) dans /home/content/40/6967940/html/apns/apns.php sur ligne 25 Echec de la connexion 111 Connexion refusée

Le script PHP:

<?php 
$deviceToken = '0535dda1 6fd04e87 ed0a8194 d418a6c1 99eec462 8a871891 d062018d c6af4f99'; 
$pass = 'Php1234'; // Passphrase for the private key (ck.pem file) 

// Get the parameters from http get or from command line 
$message = $_GET['message'] or $message = $argv[1] or $message = 'You have an important message from InsiderTracker'; 
$badge = (int)$_GET['badge'] or $badge = (int)$argv[2]; 
$sound = $_GET['sound'] or $sound = $argv[3]; 

// Construct the notification payload 
$body = array(); 
$body['aps'] = array('alert' => $message); 
if ($badge) 
    $body['aps']['badge'] = $badge; 
if ($sound) 
    $body['aps']['sound'] = $sound; 

/* End of Configurable Items */ 
$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); 
// assume the private key passphase was removed. 
stream_context_set_option($ctx, 'ssl', 'passphrase', $pass); 

// connect to apns 
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); 
// $fp = fsockopen('ssl://gateway.sandbox.push.apple.com:2195', 2195, $err, $errstr, 30); 
if (!$fp) { 
    print "Failed to connect $err $errstr\n"; 
    return; 
} 
else { 
    print "Connection OK\n<br/>"; 
} 

// send message 
$payload = json_encode($body); 
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack ("n",strlen($payload)) . $payload; 
print "Sending message :" . $payload . "\n"; 
fwrite($fp, $msg); 
fclose($fp); 
?> 

Répondre

2

Il est entendu que ma GoDaddy interdit les connexions sortantes sur les ports exotiques (autre chose que 80 a peut-être quelques autres). Vous n'avez probablement pas de chance d'essayer de lancer votre propre service push hébergé sur GoDaddy. J'ai eu de la chance en faisant ce que vous essayez avec bluehost.

Pour des conseils généraux sur le développement d'un service push en PHP, ces deux articles ont été précieux: OneTwo

Questions connexes