過去 3 日間、私は自分の php コードと apns をうまく機能させようとしてきました。
これまでのところ、通知を配信できます (デバイスが 1 つしかないため、これが複数のデバイスで機能しているかどうかはわかりません)。
最初の通知が無効なデバイス トークン (私が発明したもの) で、2 番目の通知がデバイス トークンである 2 つのデバイスに 1 つの通知を送信するテストをしようとすると、デバイスに通知を配信できません... 私が読んだことから、いつ通知が判読不能またはエラーである場合、apns は接続をシャットダウンし、6 バイト長のエラーを送信します。2 番目のバイト (status_code) はエラーの種類です。エラーが発生しない場合でも、apns が status_code 0 (エラーは発生しません) を送信するのか、それとも何も送信しないのかを理解できません。
これまでのところ、インターネットで見つかったいくつかのコードに従っているにもかかわらず、この status_code を見つけることができませんでした。
コード
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', '.\certif\ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Create the payload body
//file_put_contents('logs/debug_not.log', 'body'. "\n", FILE_APPEND);
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
// Encode the payload as JSON
//file_put_contents('logs/debug_not.log', 'json body'. "\n", FILE_APPEND);
$payload = json_encode($body);
$open = true;
foreach ($devices as $device) {
//file_put_contents('logs/debug_not.log', 'inicio ciclo'. "\n", FILE_APPEND);
if($open == true){
//file_put_contents('logs/debug_not.log', 'abrir ligacao'. "\n", FILE_APPEND);
// 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){
//file_put_contents('logs/debug_not.log', 'erro abrir ligacao'. "\n", FILE_APPEND);
throw new \Exception;
}
}
// Build the binary notification
//file_put_contents('logs/debug_not.log', 'criar payload'. "\n", FILE_APPEND);
$msg = chr(0) . pack('n', 32) . pack('H*', str_replace(' ', '', $device['token'])) . pack('n', strlen($payload)) . $payload;
// Send it to the server
//file_put_contents('logs/debug_not.log', 'enviar payload'. "\n", FILE_APPEND);
$result = fwrite($fp, $msg, strlen($msg));
stream_set_blocking ($fp, 0);
$errorResponse = @fread($apns, 6);
//if i var_dump($errorResponse) it gives me null/false all the time, no matter what
//this is my workaround for invalid device tokens-- its not working or at least is not send the valid tokens
if(!$result || !$fp)
{
//file_put_contents('logs/debug_not.log', 'erro na not '. chr($data["status_code"]). "\n", FILE_APPEND);
fclose($fp);
$open = true;
} else{
//file_put_contents('logs/debug_not.log', 'suc na not'. "\n", FILE_APPEND);
$open = false;
}
//file_put_contents('logs/debug_not.log', 'fim ciclo'. "\n", FILE_APPEND);
}
// Close the connection to the server
if($fp){
//file_put_contents('logs/debug_not.log', 'fechar connection'. "\n", FILE_APPEND);
fclose($fp);
}
接続の fread は、通知を受け取った場合や間違ったトークンを使用しようとしている場合でも、常に null/false を返します。
エラー後の接続のロジックが機能していないようです。
誰か助けてください??? 私は 3 番目のクラスまたはコードを使用するつもりはありません。たとえ apns がエラーを出すものがあっても、デバイス トークンの配列に対して機能する単純で基本的なものを持ちたいと思います。
みんな、ありがとう。