私は何が問題なのかはっきりしませんが、小規模なコードは私のために働いています。少なくとも、これを使用して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);
?>
注:この小さなコードは長い時間前に書いてあり、うまくいきました。私はソースを覚えていませんが、チュートリアルがありました。最近テストしたことがないので、修正する必要があります。 ヒント:
- オープン接続して閉じ、サーバーへのすべての通知を書き込みます。
- サーバーの応答を読み取ると機能は低下しますが、トラブルシューティングや起動には効果的です。したがって、必要に応じてその部分を使用してください。
- あなたがログに何かを持っていますより多くのエラー説明APNs Provider API
については、このドキュメントを見てみましょうか?また、 '$ appName'はどこに設定されていますか? appNameを持つ – tftd
は、プッシュ通知に使用する証明書を決定するために使用する1つの変数です。 appNameを使用すると、携帯電話で使用しているアプリケーションユーザーのバージョンを知ることができます。 setAPNSPemAsString関数を使用すると、他のファーストプッシュ通知で1回だけ動作します。send関数は私たちにfalseを返します。 – Gasper
IOSの場合、バンドルにはフィードバックサービスが含まれています。多分あなたはここで答えを見つけることができます。あなたはそれを見ましたか? https://github.com/richsage/RMSPushNotificationsBundle#ios-feedback-service –