Постоянный XMPP MUC (XEP-45), такой как WhatsApp groupchats

Из spec -

7.14 Выход из комнаты

Чтобы выйти из многопользовательской комнаты чата, пассажир отправляет присутствие строфа типа "недоступна" для услуги "номер @службы/ник"; это в настоящее время используется в комнате.

Пример 80. Оккупант выходит из комнаты

<presence
    from='[email protected]/pda'
    to='[email protected]/thirdwitch'
    type='unavailable'/>

Это означает, что, как только пользователь отключится от сервера XMPP, он будет удален из группы на стороне сервера. Проблема проста - я не хочу этого поведения; Я хочу, чтобы поведение было похоже на то, что делает Whatsapp, то есть, даже если пользователь переходит в автономный режим, он все еще является частью комнаты MUC (которая настроена на постоянство на стороне сервера) и будет получать сообщения от других пользователей.

Учитывая спецификацию и документацию для XEP-0045 и XMPPFramework для iOS, я не знаю, как это сделать, или если это возможно сделать на традиционном сервере ejabberd.

Ответ 1

XEP-45 был разработан более 10 лет назад. Тогда дизайнеры имели в виду что-то вроде каналов IRC. Все из XEP-45 спроектировано исходя из предположения, что пользователь входит и выходит из комнаты, когда он запускает/завершает работу своего клиента.

WhatsApp Groupchats разные: пользователь присоединяется к группе, которая имеет возможность просматривать (полную) историю этого чата. Даже если клиент пользователя находится в автономном режиме/недоступен, он по-прежнему считается частью группового.

Сообщество XMPP в настоящее время работает над новым XEP, который обеспечивает такую ​​функциональность. Он называется XEP-0369: опосредованный информационный обмен. Это духовный преемник XEP-0045, предоставляющий функции, которые можно было бы ожидать от современных групповых занятий.

Ответ 2

Вы можете эмулировать что-то подобное, используя историю сервера MUC (Управление архивами сообщений, XEP-0313), так что, когда клиент входит в систему, они могут запрашивать историю MUC, когда они weren 't в нем.

Если вы также хотите показывать офлайн-псевдонимов в комнате, самый простой способ сделать это - это, вероятно, сопоставить pubsub node для каждой комнаты, чтобы сохранить список этих псевдожителей, которые могли бы читать в дополнение к обычному списку занятости.

Здесь, вероятно, есть и другие решения, но те, которые приходят мне в голову, включают в себя изменение поведения сервера нестандартными способами, например, позволяя обычным жильцам запрашивать список членов, который обычно могут выполнять только администраторы.

Ответ 3

Модель Whatsapp намного проще, чем вы себе представляете, - они просто поддерживают сеанс пользователя онлайн, даже если пользователь отключается и повторно отправляет сообщения, когда он "повторно подключается" к сеансу. XEP-0198 представляет аналогичную концепцию для традиционных сеансов XMPP. Вам нужно только настроить более длительный период бездействия (обычно XEP-0198 предполагает 300 секунд, но whatsapp-подобные мессенджеры проводят сеанс 24 часа)

Ответ 4

Да, вы можете сделать свою группу постоянной, установив ее конфигурации следующим образом:

NSString *var = [field attributeStringValueForName:@"var"];
if ([var isEqualToString:@"muc#roomconfig_persistentroom"])
{
    [field removeChildAtIndex:0];
    [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]];
}