Non sono sicuro di quale sia il problema, ma il seguente codice funzionante ha funzionato per me. Almeno puoi usarlo per testare la connessione al server APNS.
<?php
// your private key's passphrase
$passphrase = $_POST('passphrase');
$pemFilesPath = 'path/to/pem/folder/';
// path to pem file
$appCert = $_POST('pemfile');
$pemFile = $pemFilePath.$appCert;
$notifications = $_POST('notifications');
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $pemFile);
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;
$records = 0;
foreach ($notifications as $deviceToken => $message)
{
// Create the payload body
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
// 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;
if (!$fp) {
exit("Connection intruptted " . E_USER_ERROR . PHP_EOL);
}
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
if(!$result) {
print_r("Failed writing to stream.", E_USER_ERROR);
fclose($fp);
die;
}
/* uncomment this part for troubleshooting
else {
$tv_sec = 1;
$tv_usec = null; // Timeout. 1 million micro seconds = 1 second
$read = array($fp); $we = null; // Temporaries. "Only variables can be passed as reference."
$numChanged = stream_select($read, $we, $we, $tv_sec, $tv_usec);
if(false===$numChanged) {
print_r("Failed selecting stream to read.", E_USER_ERROR);
fclose($fp);
die;
}
else if($numChanged>0) {
$command = ord(fread($fp, 1));
$status = ord(fread($fp, 1));
$identifier = implode('', unpack("N", fread($fp, 4)));
$statusDesc = array(
0 => 'No errors encountered',
1 => 'Processing error',
2 => 'Missing device token',
3 => 'Missing topic',
4 => 'Missing payload',
5 => 'Invalid token size',
6 => 'Invalid topic size',
7 => 'Invalid payload size',
8 => 'Invalid token',
255 => 'None (unknown)',
);
print_r("APNS responded with command($command) status($status) pid($identifier).", E_USER_NOTICE);
if($status>0) {
$desc = isset($statusDesc[$status])?$statusDesc[$status]: 'Unknown';
print_r("APNS responded with error for pid($identifier). status($status: $desc)", E_USER_ERROR);
// The socket has also been closed. Cause reopening in the loop outside.
fclose($fp);
die;
}
else {
// Apple docs state that it doesn't return anything on success though
$records++;
}
} else {
$records++;
}
}
*/
$records++;
}
echo "Send notifications to $records devices";
// Close the connection to the server
fclose($fp);
?>
Nota: ha scritto questo piccolo codice molto tempo fa e ha funzionato correttamente. Non ricordo la fonte ora ma c'era un tutorial. Non sono stati testati di recente, quindi potrebbe essere necessario rivederlo. Alcuni suggerimenti:
- Aprire la connessione e scrivere sul server tutte le notifiche quindi chiuderlo.
- La risposta del server di lettura riduce la funzionalità ma è utile per la risoluzione dei problemi e per l'avvio. Quindi usa quella parte se necessario.
- Date un'occhiata a questa documentazione per più errori spiegazione APNs Provider API
hai qualcosa nei log? Inoltre, dove viene impostato '$ appName'? – tftd
con appName è solo una variabile che usiamo per decidere quale certificato utilizziamo per le notifiche push. Con appName sappiamo quale versione del nostro utente dell'applicazione utilizza sul suo telefono. L'uso della funzione setAPNSPemAsString funziona una sola volta con la notifica del primo push su altri, la funzione send ci restituisce false .. – Gasper
Per IOS il pacchetto include un servizio di feedback. Forse puoi trovare una risposta qui. L'hai visto? https://github.com/richsage/RMSPushNotificationsBundle#ios-feedback-service –