Как реализовать собственный IM-сервер для общения текстовыми сообщениями с клиентом для iPhone (push-уведомления обязательны)?
Поставлена задача организовать собственный сервер обмена короткими текстовыми сообщениями. Для этого выделили сервер на Windows 2008. Но есть обязательные условия:
- должен быть клиент для Iphone 4 - 5. Причем обязательное условие Push-уведомления;
- шифрование трафика(SSL, TLS, что-нибудь);
- весь трафик должен идти только от клиентов к серверу и обратно (Не затрагивая какие-либо сторонние ("общественные") сервисы);
Что было сделано:
- установил Openfire на сервер;
- настроил "Do not disconnect clients that are idle";
- ставил как "Send an XMPP Ping request to idle clients", так и "Send an XMPP Ping request to idle clients"
- создал несколько пользователей;
- авторизовался через WindowsPhone через IM+;
- пробовал устанавливать на Iphone'ы "ChatSecure", "Monal" и авторизовался через них(разными пользователями);
- коннект проходит без проблем, общение тоже вобщем - то происходит
НО:
- если сворачиваю приложение на Iphone, то xmpp-сессия через несколько минут завешается, и соответственно юзеры уходят в оффлайн. И если я с IM+ пишу им(на Iphone) сообщения, то push-уведомления не приходит и сообщения они эти видят только когда принудительно заходят в клиент. P.S. на WindowsPhone IM+ висит тоже в фоновом режиме, но сессию не рвёт.
В итоге прошу помощи:
- либо в какой-то хитрой настройке сервера/IPhone клиента;
- в выборе другой схемы (не jabber, а IRC или что-нибудь)
P.S. готов был бы сдаться и списать всё на "закрытость" IOS, НО ведь WhatsApp работает в фоне и сообщения приходят всегда и сессия не рвётся.
Вам нужно понять, что требование наличия пуш нотификаций и "- весь трафик должен идти только от клиентов к серверу и обратно (Не затрагивая какие-либо сторонние ("общественные") сервисы);" в общем случае будут конфликтовать.
Для получения пуш нотификации нужно чтобы кто-то ее вам отправил.
Это может сделать само клиентское приложение в рамках выполнения фоновой задачи или бекенд сервис клиентского приложения. Чаще используется именно 2-й подход, в котором часть трафика проходит собственно через сервер клиента.
Более того, Push Service ( Microsoft или Apple) по сути тоже является сторонним сервисом по отношению к вашему серверу.
Самым простым решением будет принять, что ваш трафик проходит через клиент, бекенд клиента и Пуш сервера Apple.
В этом случае вы можете выбирать из множества клиентов.
К примеру использовать тот же IM+. Для "страшных секретов" в нем есть функция OTR для проведения безопасной переписки, при которой точно только собеседник может прочитать сообщение(Эта функция не работает в режиме пуш).
Иначе вам нужно искать клиент, который может работать в фоне. Далеко не каждое приложение может задекларировать такую возможность. Часто это GPS Traker -ы и, как заметил risik, VOIP.
Даже если вы его найдете, учитывайте то, что пользователь и система может блокировать работу приложения в фоне.
На iOS есть возможность не рвать сессию если Ваше приложение - voip клиент. Тогда с некоторыми ограничениями такими, например, как количество квантов времени CPU за единицу времени, Ваше приложение сможет работать в фоне. В противном случае, нужно отправлять push уведомления. Вы не сможете это сделать с использованием стороннего клиента, но без использования сторонних серверов. Либо делайте свой клиент. Либо ищите клиент, который предоставляет возможность передать push уведомление через свой сервер (я таких не знаю).
Возможно, вам удастся обеспечить все Ваши хотелки, если найдете SIP приложение, умеющее работать с Вашим SIP сервером.
Т.е. если я настрою в asterisk текстовые сообщения(типа как здесь), и найду клиент на IPhone, который эти сообщения умеет, то он будет работать в фоновом режиме нормально?
"...который предоставляет возможность передать push уведомление через свой сервер ". Не совсем понимаю, что значит "передать push уведомление". Если Вы говорите, что в IOS "не voip" приложения в фоне не работают, как сервер может передать туда push уведомления?
Пока работает VOIP клиент все сообщения будут сыпаться прямо ему. Но если он выброшен из памяти (за превышение лимита фоновой работы или пользователь его принудительно выгрузил и т.д.), то тогда начинают работать PUSH уведомления.
Для iOS эта технолия называется APNS - Apple push notification server. Для Android - GCM. и для WinPhone своя.
Суть всех технологий. Клиент на устройстве регистрируется через сервера Google или Apple. В ответ получает некторый ИД для пуш нотификаций. Далее клиентское приложение должно сообщить свой идентификатор для пуш нотификаций Вашему серверу. Ваш SIP сервер, после того как не смог передать сообщение по таймауту, формирует уведомление (не обязательно с текстом, например, это может быть только имя отправителя сообщения). Это сообщение подписывается сертификатом, уникальным для каждого приложения, отправляется через API на сервера Apple (Google, Microsoft), те доставляют это сообщение операционной системе клиента, а уже она доставляет это сообщение приложению. На последнем шаге есть отличия - в iOS нотификация сперва отображается пользователю, а затем, если он тапнул по нотификации оно передается приложению (и приложение стартуется, если оно было не было стартовано). В Android в обратном порядке: сперва нотификация доставляется приложению, а затем, приложение отображает нотификацию на экране, если считает нужным.
Таким образом, если Вы используете сторонний клиент со своим сервером Вы или теряете возможность доставки push уведомлений вообще или должны будете передать его через сервера этого стороннего приложения. И все равно остается вопрос, как Вы идентифицируете экземпляр этого приложения для данного стороннего сервера. Обычно используют свой сервер, в дополнение к VOIP серверу.
Присоединяюсь
"hypertonyc, скажите, а отправки push-уведомлений со стороны openfire добиться удалось, и дело только в клиенте?"
Реально ли вообще openfire заставить push слать ?
Сейчас пробую так: поставил BeejiveIM (думаю, другие тоже могут), подключил к ней аккаунт на моем сервере XMPP и одновременно подключил аккаунт Google+ (чтобы приложение не уходило в даун, а было бы активно). Прошло 5 минут - телефон просто лежит неактивно - отправляю сообщение - приходит уведомление! Т.е. вроде как работает )) Посмотрим, что дальше будет. Подожду минут 15-20, потом отправлю снова.
Работает. ChatSecure - не работает, но у них на сайте так прямо и написано. А вот BeejiveIM работает. Он, правда, платный для iPhone, зато все ок. Минус только один - не шифрует. Но в конце концов, можно всегда взять и запустить ChatSecure, поболтать от души и свернуть его. Вот.
Работать-то работает, но только что получил ответ от разработчика Prosody: говрит, в данном случае все коммуникации идут по пути Phone <---> Beejive <---> Prosody, т.е., как по мне, ничем не отличаются от WhatsApp, по крайней мере, формально.
Итоговый ответ: не работает (напрямую сервер-клиент, без прослоек).