2016-11-05 5 views
2

Мы используем сервер ejabberd для нашего приложения для мобильных чатов. И мы используем IOS XMPP-Framework для нашего приложения IOS (https://github.com/robbiehanson/XMPPFramework)Получите автономные сообщения от XMPP без участия в сети

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

В то время как наше приложение находится на фоне, наш сервер ejabberd отправляет нам push-уведомления, чтобы сообщить нам об автономных сообщениях. (Только отправляет уведомление для сообщений в автономном режиме)

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

Но проблема в том, что мы должны стать онлайн (отправить присутствие), чтобы получать сообщения в автономном режиме. Но когда мы делаем что создает 2 нежелательные последствия:

  1. Сторона, которая посылает сообщение видел наше присутствие в Online (хотя мы на заднем плане)
  2. Просто потому, что мы становимся онлайн в то время как приложение на нашем сервере, наш сервер не может отправлять push-уведомления для сообщений других людей, потому что мы в сети, и сервер может отправлять уведомления только для автономных сообщений.

Для решения этой проблемы, я могу думать только об этом, если есть способ получить автономные сообщения с сервера xmpp, не выходя из сети. Кто-нибудь знает, если Есть ли способ сделать это с XMPP-Framework для ИОС

[EDIT] Позвольте мне прояснить этот вопрос немного больше:

Проблемы больше, чем просто один:

задача 1 - Толчок проблема уведомления:

1.1 - Server check if the message is sending to an online or offline user. If the user is offline server sends push notification to inform user but if the user is online server doesnt send anything. 
1.2 - When the application is in background and receive notification for offline messages, application become alive(still in background) and become online in order to get offline messages 
1.3 - Because the client became online, server doesnt send the push notifications anymore but the application is still in background so the user cannot be informed about the message he/she received. 

Так для того, чтобы исправить эти проблемы, мне нужно найти способ, чтобы получить сообщения в автономном режиме, не посылая онлайн присутствие на сервере

Задача 2 - Сообщение Присылать проблемы

2.1 - Server check if the message is sending to an online or offline user. If the user is offline server sends push notification to inform user but if the user is online server doesnt send anything. 
2.2 - When the application is in background and receive notification for offline messages, application become alive(still in background) and become online in order to get offline messages 
2.3 - When the application became online server sends all offline messages to client but doesnt send the total count of offline messages(At least I cannot get it with IOS XMPPFramework) 
2.4 - So I dont know how much longer the client should stay alive in the background because I dont know the total count of offline messages, so after getting 2-3 messages I have to suspend the application in the background. But in that case there might be buggy situations such as XMPP Framework receive the offline message but I suspend the client application before writing it to database etc... 

Для того, чтобы найти решение этих проблем:

  1. мне нужно найти способ, чтобы получить только 1 автономном сообщение когда я хочу с сервера
  2. Если возможно, мне также необходимо получить эти сообщения в автономном режиме, не становясь онлайн
+0

любое представление о проблеме? – tolgatanriverdi

ответ

0

Посмотрите в ejabberd_mod_offline_post

  1. первой конфигурации Помещение должно быть членом только для комнаты, и добавить всех пользователей в качестве членов сразу же после того, как вы создали его, чтобы быть в состоянии получить в общей сложности.
  2. Добавить модуль выше в модули ejabberd.
  3. Внедрение службы обратного вызова для обработки сообщения обратного вызова.

Идея заключается в том, когда пользователь перейти в автономный режим:

  • В один-к-одному делу, offline_message_hook будет увеличен
  • В MUC случае muc_filter_message будет поднят, и любой не сетевого присутствия Доступен в автономном режиме.

[Изменено]:

Я использовал его на 16.06. И там была ошибка в исходном коде в строках:

... 

Body = xml:get_path_s(Stanza, [{elem, list_to_binary("body")}, cdata]), 

... 

Type = xml:get_tag_attr_s(list_to_binary("type"), Packet), 

Body = xml:get_path_s(Packet, [{elem, list_to_binary("body")}, cdata]), 

... 

Я установил их, добавляя f к xml:, например, тела = F XML: get_path_s (Стихира, [{эль, list_to_binary ("тело")}, CDATA]),

И MUC, автономные пользователи в поле 'Offline' в этом формате, 'user1..user2..user3 ..', что вам нужно сделать, чтобы разделить их на строку.

+0

Я уже пользуюсь модулем mod_offline_post (mod_interact), однако я не понял, что вы на самом деле имеете в виду. После того, как я создаю группу, я приглашаю пользователей к вновь созданной группе, но кроме этого, я не знаю, как добавить их в качестве участников (можете ли вы выслать мне ссылку?). Также я не знаю, что вы подразумеваете, добавив выше модель в модели ejabberd и реализуя службу обратного вызова. Можете ли вы быть более конкретным. Спасибо – tolgatanriverdi

+0

mod_interact поддерживает только одно-одно-одно сообщение. Поскольку вы его использовали, вы знаете, как это работает. Этот я тоже поддерживал MUC. Вместо того, чтобы приглашать пользователей присоединиться, вы добавляете пользователей непосредственно в список участников. http://xmpp.org/extensions/xep-0045.html#modifymember – dichen

+0

Работает ли она с последней версией ejabberd 16.08.Потому что я попытался использовать mod_offline_post, но даже если я успешно его сконфигурирую, он не работает (не передает сообщения) – tolgatanriverdi

0

Я предлагаю вам добавить пользовательский элемент расширения для вашего «фонового» присутствия в Интернете, например

<presence ...> 
<source xmlns:="com.foo#background"/> 
</presence> 

затем, на сторону клиента, когда вы получаете присутствие, не уведомляет, если элемент расширения «source» с xmlns "com.foo#background" существует.

+0

На самом деле, не важно добавить элемент расширения, поскольку клиенты не отправляют уведомление. Сторона сервера проверяет, является ли сообщение автономным, оно автоматически отправляет уведомление на устройство, и когда IOS получает уведомление, оно автоматически показывает его на устройстве. Поэтому мне нужно найти решение для получения автономных сообщений, не выходя из сети или найти способ получить только одно сообщение в автономном режиме (не получая все из них) – tolgatanriverdi

+0

Я не понял, извините. Проблема в том, что «другие люди у меня онлайн, даже если я нахожусь на заднем плане» или что-то еще? По последнему комментарию кажется, что вы получаете слишком много сообщений «офлайн», и вы не хотите получать больше одного. Поэтому просто удалите слушателя в групповой/чат после первого в автономном режиме, он будет восстановлен или реализует «режим ожидания» (true | false), который хранит сообщения, но отображает только первый. Он позволяет себя в первый раз в фоновом режиме, отключить отображение после первой очереди приема и включения, а затем, когда краснет отправляет все полученные сообщения вашему объекту GUI – MrPk

+0

Я отредактировал свой вопрос, потому что часть комментария не содержит столько строк – tolgatanriverdi