Sorun nedir ama küçük kodun benim için çalıştığından emin değilim. En azından APNS sunucusuna bağlantıyı test etmek için bunu kullanabilirsiniz.
<?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);
?>
Not: Bu küçük kodu uzun süre önce yazdı ve iyi çalıştı. Kaynağını şimdi hatırlamıyorum ama bir öğretici vardı. Son zamanlarda test etmediniz, bu yüzden gözden geçirmeniz gerekebilir. Bazı öneriler:
- Bağlantıyı açın ve tüm bildirimlerinize yazın, ardından kapatın.
- Sunucu yanıtının okunması işlevselliği azaltır, ancak sorun giderme ve başlangıç için iyidir. Bu kısmı gerektiği gibi kullanın.
- APNs Provider API
Günlüklerde şey var mı daha fazla hata açıklaması için bu belgelere bir göz atın? Ayrıca, "$ appName" ayarlandı? – tftd
with appName, push bildirimleri için hangi sertifikayı kullandığımıza karar vermek için kullandığımız yalnızca bir değişken. AppName ile, uygulama kullanıcımızın hangi sürümünün telefonunda kullandığını biliyoruz. SetAPNSPemAsString işlevinin kullanılması, yalnızca başkalarının ilk push bildirimi ile işlev gönderir, işlev bize false döndürür .. – Gasper
IOS için paket bir Geri Bildirim hizmeti içerir. Belki bir cevap bulabilirsin. Bunu gördün mü? https://github.com/richsage/RMSPushNotificationsBundle#ios-feedback-service –