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!
Ç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. –
Bravo à vous .. :) – Aparna