我设置了推送通知服务,以根据RSS源向客户发送通知。我有一个每分钟运行一次的服务,看看是否有新帖子添加到Feed中。如果是这样,该服务将向所有客户发送通知。但是,有些人一直在抱怨说他们没有收到任何推送通知。这是我用来发送消息的功能:
function _sendMessages($tokens, $message) {
$payload['aps'] = array('alert' => $message, 'sound' => 'default');
$payload = json_encode($payload);
$context = stream_context_create();
stream_context_set_option($context, 'ssl', 'local_cert', $this->certificate);
stream_context_set_option($context, 'ssl', 'passphrase', '*********');
$apns = stream_socket_client('ssl://' . $this->server . ':' . $this->port, $error, $errorString,60, STREAM_CLIENT_CONNECT, $context);
foreach($tokens as $row) {
$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $row->device_token)) . chr(0) . chr(strlen($payload)) . $payload;
$fwrite = fwrite($apns, $apnsMessage);
if (!$fwrite) echo 'push error';
else echo 'push success';
}
fclose($apns);
}
我做错了吗? PHP无法处理数千次循环并通过连接传输消息吗?
答案 0 :(得分:5)
除了其他人已经提出的建议外,这里还有一个清单,列出了推送不起作用时要考虑的事项。
希望这有帮助。
答案 1 :(得分:1)
我认为这里存在3个潜在问题:
1)你经常连接(可能比你想象的更频繁),Apple拒绝/放弃连接,因为它认为你太垃圾了。说实话,这很明显 - 你的fwrite会因为流已经死了而失败。
APNS理想情况下,连接尽可能长时间保持打开状态(10分钟是我们使用的非活动超时),而不是每分钟重新建立一次。 SSL协商会耗费CPU,但保持打开的连接相对便宜。因此,如果可以的话,我会在运行之间保持连接打开,如果因任何原因被丢弃,我会自动重新建立连接。
2)您没有进行任何错误检查。请参阅APNS指南,但它可能会在错误响应的同一连接上回复,而您只是忽略了这一点。我认为每次循环你应该检查是否有任何数据要读取,读取它并将其解释为错误响应数据包。至少你应该记录错误响应。
3)这是一个很长的镜头。您是否有可能实际删除了这些用户,可能是因为反馈服务告诉您?如果用户长时间断开连接,服务将无法发送通知,并且可能会告诉您从列表中删除这些设备。如果您在应用程序启动时没有重新订阅这些用户(或者至少确认他们仍在订阅),那么他们会认为他们订阅了通知,而实际上您已经选择忘记这些通知。
答案 2 :(得分:0)