Я настроил службу push-уведомлений для отправки уведомлений клиентам на основе RSS-канала. У меня есть служба, которая запускается каждую минуту, чтобы узнать, добавлено ли новое сообщение в фид. Если это так, служба отправит уведомление всем клиентам. Однако некоторые люди жалуются, говоря, что они не получают никаких push-уведомлений. Вот функция, которую я использую для отправки сообщений:
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 не обрабатывать это через цикл в тысячу раз и передавать потоки через соединение?
Помимо предложений, уже сделанных другими, вот контрольный список вещей, которые следует учитывать, когда толчки не работают.
Надеюсь это поможет.
Я думаю, что здесь есть 3 потенциальные проблемы:
1) Вы слишком часто подключаетесь (возможно, чаще, чем считаете себя), и Apple отказывается / отказывается от соединения, потому что считает, что вы слишком спам. Это было бы очевидно, если честно – ваш флетт потерпит неудачу, потому что поток исчезнет.
APNS в идеале, как соединение, которое должно быть открыто как можно дольше (10 минут – это время бездействия, которое мы используем), а не восстанавливать его каждую минуту. Расходы на переговоры по протоколу SSL связаны с ЦП, но соединение, находящееся в открытом доступе, относительно дешево. Таким образом, я бы держал это соединение открытым между запусками, если это возможно, и автоматически восстанавливать его, если он по какой-либо причине был сброшен.
2) Вы не проверяете ошибки. См. Руководство APNS, но оно может отвечать на одно и то же соединение с ответами об ошибках, и вы просто игнорируете это. Я думаю, что каждый раз в цикле вы должны проверять, есть ли какие-либо данные для чтения, чтения и интерпретации его как пакета ответов об ошибках. По крайней мере, вы должны регистрировать ответы об ошибках.
3) Это длинный выстрел. Возможно ли, что вы действительно удалили этих пользователей, возможно, потому, что вам сообщили об услуге обратной связи? Если пользователь отключен в течение длительного времени, уведомления не будут доставлены службой, и он может сообщить вам удалить эти устройства из вашего списка. Если вы не будете повторно подписывать этих пользователей (или хотя бы подтвердить, что они все еще подписаны), когда приложение запустится, тогда они подумают, что они подписались на уведомления, когда на самом деле вы уже решили забыть о них.
Хм … Я не вижу в этом ничего плохого. Действительно ли клиенты активировали push-уведомления для вашего приложения?