Я думаю, что здесь есть 3 потенциальных проблемы:
1) Вы подключаетесь слишком часто (возможно, чаще, чем вы думаете), и Apple отказывается / разрывает соединение, потому что считает вас слишком спамом. Это было бы довольно очевидно, если честно - ваш fwrite потерпит неудачу, потому что поток пропал бы.
В идеале APNS - это соединение, которое удерживается открытым как можно дольше (10 минут - это время бездействия, которое мы используем), а не восстанавливать его каждую минуту. SSL-согласование стоит ЦП, но соединение остается открытым относительно дешево. Поэтому я буду держать это соединение открытым между запусками, если вы можете, и автоматически восстанавливать его, если оно было разорвано по любой причине.
2) Вы не проверяете ошибки. См. Руководство APNS, но оно может отвечать по тому же соединению сообщениями об ошибках, и вы просто игнорируете это. Я думаю, что каждый раз в цикле вы должны проверять, есть ли какие-либо данные для чтения, читать их и интерпретировать как пакет с ошибкой. По крайней мере, вы должны записывать ответы об ошибках.
3) Это длинный выстрел. Возможно ли, что вы на самом деле удалили этих пользователей, возможно, из-за того, что служба обратной связи сказала вам об этом? Если пользователь был отключен в течение длительного времени, служба не сможет доставлять уведомления, и он может сказать вам, чтобы удалить эти устройства из вашего списка. Если вы не переподписываете этих пользователей (или хотя бы подтверждаете, что они все еще подписаны) при запуске приложения, тогда они будут думать, что они подписаны на уведомления, хотя на самом деле вы уже решили забыть о них.