Вам нужно понять, что требование наличия пуш нотификаций и "- весь трафик должен идти только от клиентов к серверу и обратно (Не затрагивая какие-либо сторонние ("общественные") сервисы);" в общем случае будут конфликтовать.
Для получения пуш нотификации нужно чтобы кто-то ее вам отправил.
Это может сделать само клиентское приложение в рамках выполнения фоновой задачи или бекенд сервис клиентского приложения. Чаще используется именно 2-й подход, в котором часть трафика проходит собственно через сервер клиента.
Более того, Push Service ( Microsoft или Apple) по сути тоже является сторонним сервисом по отношению к вашему серверу.
Самым простым решением будет принять, что ваш трафик проходит через клиент, бекенд клиента и Пуш сервера Apple.
В этом случае вы можете выбирать из множества клиентов.
К примеру использовать тот же IM+. Для "страшных секретов" в нем есть функция OTR для проведения безопасной переписки, при которой точно только собеседник может прочитать сообщение(Эта функция не работает в режиме пуш).
Иначе вам нужно искать клиент, который может работать в фоне. Далеко не каждое приложение может задекларировать такую возможность. Часто это GPS Traker -ы и, как заметил risik, VOIP.
Даже если вы его найдете, учитывайте то, что пользователь и система может блокировать работу приложения в фоне.