2016-03-30 1 views
1

J'ai des problèmes de dépannage lorsque j'essaie d'envoyer une notification à mon iPhone en utilisant les APN. J'utilise un code PHP que je continue à voir plus et plus sur Internet, donc je ne pense pas que le problème est à ce sujet:Accès interdit lors de la connexion au service Apple Push Notification

<?php 

// Put your device token here (without spaces): 
$deviceToken = 'mytoken'; // Of course this is my correct token here 

// Put your private key's passphrase here: 
$passphrase = 'mypassphrase'; // Same here 

$message = $argv[1]; 
$url = $argv[2]; 

if (!$message || !$url) 
    exit('Example Usage: $php newspush.php \'Breaking News!\' \'https://raywenderlich.com\'' . "\n"); 

//////////////////////////////////////////////////////////////////////////////// 

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', __DIR__.'/cert.pem'); 
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

// Open a connection to the APNS server 
$fp = stream_socket_client(
    '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, 
    'sound' => 'default', 
    'link_url' => $url, 
); 

// 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; 

stream_set_blocking($fp, 0); 

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

if (!$result) 
    echo 'Message not delivered' . PHP_EOL; 
else { 
    echo 'Message successfully delivered' . PHP_EOL; 
} 

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

J'ai la sortie « message livré avec succès », de sorte que la connexion a été avec succès établi, idem pour le message envoyé. Cependant, l'appareil ne reçoit rien.

J'utilisé la fonction de rétroaction pour essayer de savoir ce qui ne va pas, mais le résultat est vide (le tableau est littéralement vide):

<?php 

function send_feedback_request() { 
    //connect to the APNS feedback servers 
    //make sure you're using the right dev/production server & cert combo! 
    $stream_context = stream_context_create(); 
    stream_context_set_option($stream_context, 'ssl', 'local_cert', __DIR__.'/cert3.pem'); 
    stream_context_set_option($stream_context, 'ssl', 'passphrase', 'meteor0405'); 

    $apns = stream_socket_client('ssl://feedback.sandbox.push.apple.com:2196', $errcode, $errstr, 60, STREAM_CLIENT_CONNECT, $stream_context); 
    if(!$apns) { 
     echo "ERROR $errcode: $errstr\n"; 
     return; 
    } 


    $feedback_tokens = array(); 
    //and read the data on the connection: 
    while(!feof($apns)) { 
     $data = fread($apns, 38); 
     if(strlen($data)) { 
      $feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data); 
     } 
    } 
    fclose($apns); 
    return $feedback_tokens; 
} 

var_dump(send_feedback_request()); 

Auriez-vous une idée sur ce que je peux faire pour comprendre ce qui faux? Cela peut-il être dû au certificat? Un fichier .cer a été généré à partir du site Web Apple et importé dans Keychain Access pour créer un fichier .p12. Ensuite, je l'ai converti en format .pem grâce à une commande openssl, et c'est celle que j'utilise dans les fichiers ci-dessous.

Merci!

Répondre

0

Si vous obtenez le message réussi, cela signifie que votre code PHP est correct, mais quelque chose manque dans le fichier pem.
Vérifiez les étapes de création du fichier pem ici https://www.digicert.com/ssl-support/pem-ssl-creation.htm et réessayez.
J'espère que ça va aider.

+0

Ça m'a vraiment aidé, merci! Le problème venait en effet du fichier PEM. J'ai posté la réponse au problème pour quiconque ayant le même problème. –

+0

Bravo à vous .. :) – Aparna

0

Le problème venait en effet de mon fichier PEM. Pour tous ceux qui ont le même problème, voici ce que j'ai fait. Après avoir téléchargé le certificat et la clé privée du Portail iPhone Developper Connection au format .p12, j'ai dû les convertir au format .pem. Après cela, j'ai dû fusionner les deux fichiers (mettre d'abord le contenu du certificat, puis la clé privée). Cette fusion doit être placée dans un nouveau fichier .pem, et c'est le fichier à utiliser dans le script PHP.

Voici le tutoriel complet j'ai suivi: https://blog.serverdensity.com/how-to-build-an-apple-push-notification-provider-server-tutorial/

En outre, le code PHP est pas exactement la même chose. Celui que j'ai utilisé dans le premier post n'était pas correct, utilisez plutôt celui du tutoriel.