2013-02-22 2 views
0

Я реализовал клиент чата facebook, который соединяется с помощью API Smack. В настоящий момент основные функции хорошо работают. Я отправляю, получаю сообщения, получаю печатные уведомления ... Но у меня есть проблема. Если я говорю с кем-то, использующим моего клиента, я получаю сообщения, которые я отправил контакту в чате facebook. Но если отправить сообщение контакту через чат facebook, мой клиент не получит это сообщение. Если контакт отвечает на меня, я получаю его сообщение, но диалог становится неполным, так как он просто показывает сообщения, отправленные контактом, но не показывает сообщение, отправленное в другом клиенте XMPP.XMPP - Facebook - Как моя клиентская реализация может получать сообщения, отправленные другими реализациями клиента?

Поскольку на facebook отображаются сообщения, отправленные моим клиентом, я думаю, что можно сделать то же самое. Я действительно новичок в XMPP, и мне нужна помощь, чтобы выяснить, как я могу это сделать.

Мой код выглядит следующим образом прямо сейчас:

Прием сообщений:

connection.getChatManager().addChatListener(
    new ChatManagerListener(){ 

     @Override 
     void chatCreated(Chat chat, boolean createdLocally) { 
      if(!createdLocally){ 
       chat.addMessageListener(messageListener) 
      } 
     } 
    } 
) 

Слушатель сообщение просто передать сообщение через толчок к моему клиенту Javascript.

Отправка сообщения:

public boolean sendMessage(String jid, String message){ 
    FacebookContact contact = mapJIDContact.get(jid) 

    try{ 
     if (contact != null && (connection != null) && (connection.isConnected())) { 
      ChatManager chatManager = connection.getChatManager(); 
      if(contact.chat == null){ 
       contact.chat = chatManager.createChat(jid, messageListener); 
      } 
      contact.chat.sendMessage(message); 
      return true 
     } 
     return false 
    } 
    catch (XMPPException e){ 
     return false 
    } 
} 

FacebookContact является класс, созданный мной. Он хранит некоторую контактную информацию и Чат, если он уже открыт.

EDIT:

Я обнаружил, что эта особенность, которую я хочу, обеспечивается этим расширением XMPP: http://xmpp.org/extensions/xep-0280.html. Я пытаюсь найти, если чат facebook реализует это расширение.

ответ

1

Если вы отправляете IQ, чтобы включить функцию сервер отвечает с < функционально не реализованной/> ошибкой IQ, который, как указано here означает, что он не поддерживает XEP 0280. Я только что проверил себя через консоль XML Audium ,

IQ:

<iq xmlns='jabber:client' 
from='[email protected]/Mac-Pro-di-Michele_65563c5f_4D689E59FB8A5' 
to='chat.facebook.com' 
type='set' 
id='enable1'> 
    <enable xmlns='urn:xmpp:carbons:2'/> 
</iq> 

Ответ:

<iq xmlns='jabber:client' 
from='chat.facebook.com' 
to='[email protected]/Mac-Pro-di-Michele_65563c5f_4D689E59FB8A5' type='error' 
id='enable1'> 
    <enable xmlns='urn:xmpp:carbons:2'/> 
    <error code='501' type='cancel'> 
    <feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> 
    </error> 
</iq> 
+0

Спасибо за ответ. Вы все равно знаете, что я хочу? Я начинаю думать, что это какая-то внутренняя особенность facebook. Но андроидное приложение facebook также синхронизирует весь разговор. –

+0

Насколько я знаю, в чате XMPP-сервера Facebook не реализовано много XEP, и я думаю, что приложения-бренды используют некоторый частный API, поскольку публичный не позволяет разработчику отправлять сообщения _send_. Я пытаюсь создать клиент чата Mac OS, и я думаю, что использование XMPP и Graph API - единственный способ получать сообщения, синхронизировать их и отправлять их. Тем не менее у нас нет возможности получать уведомления о полученных сообщениях, когда клиент находится в автономном режиме (это означает отсутствие push-уведомлений), кроме как из бесконечного бесконечного цикла, запущенного на выделенном сервере. –

+0

Еще раз спасибо. :) –