昨日から一部の端末でプッシュ通知が届かない不具合が発生しております。デバイスは昨日までプッシュ通知を正常に受信していたため、証明書/デバイス トークンは正しいようです。
サーバー側では、エラーや接続拒否はなく、プッシュ通知も毎回正常に送信されているようです。
それでも、デバイスがプッシュを正しく受信しない場合が多くあります。
いくつかの周辺情報:
- 私は本番環境でこれを行っています。
- サーバー側でのエラー/接続拒否なし
- 毎回まったく同じ JSON を送信しています。
- 昨日から 2 台のデバイスでプッシュ通知がまったく受信されません
- 私たちのデバイスの 1 つは、昨日よりも低い成功率 (約 70%) でプッシュ通知を受信します
- 1~2 台のデバイスは、今でもプッシュ通知を正常に受信しています。
- 上記のデバイスはすべて、昨日までの本番環境で正常にプッシュ通知を受信できていました。
プッシュが成功した場合と、デバイスが受信しなかった場合のサーバー側の結果に違いはありません...したがって、問題を特定することは事実上不可能です。
これは、私が使用しているサーバー側の PHP コードです。
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $this->apnsData[$development]['certificate']);
$fp = stream_socket_client($this->apnsData[$development]['ssl'], $error, $errorString, 100, (STREAM_CLIENT_C ONNECT|STREAM_CLIENT_PERSISTENT), $ctx);
if(!$fp){
$this->_pushFailed($pid);
$this->_triggerError("Failed to connect to APNS: {$error} {$errorString}.");
}
else {
$msg = chr(0).pack("n",32).pack('H*',$token).pack("n",strlen($message)).$message;
$fwrite = fwrite($fp, $msg);
if(!$fwrite) {
error_log("[APNS] push failed...");
$this->_pushFailed($pid);
$this->_triggerError("Failed writing to stream.", E_USER_ERROR);
}
else {
error_log("[APNS] push successful! ::: $token -> $message ($fwrite bytes)");
}
}
fclose($fp);
ログは、プッシュが成功したことを示しています (プライバシーのためにトークンを切り取っています):
[Wed Dec 12 11:42:00 2012] [error] [client 10.161.6.177] [APNS] push successful! ::: aa4f******44 -> {"aps":{"alert":{"body":"\\u300casdfasdf\\u300d","action-loc-key":"OK"},"badge":4,"sound":"chime"}} (134 bytes)
これを解決するにはどうすればよいですか?