2015-07-20 171 views
1

我正在開發Android聊天應用程序。XMPP中的多設備支持Smack聊天應用程序

我的要求是將消息傳遞給多個設備。

考慮兩個用戶的用戶A和用戶B之間這樣的場景:

User A logs in and sends message to User B. 
User B logs in from Device 1 and receives message from User A. 
User B logs in from Device 2 but does not get message from User A. 

根據我的要求,用戶B應設備2獲得消息從用戶A爲好。

我該如何做到這一點?

謝謝。

回答

1

在XMPP,該消息在單隻交付會有兩種:

  • 到網上資源共享的優先級最高,
  • 於通過離線消息發送連接第一客戶端。

但是,如果您希望其他客戶端重新同步,則應該依賴XEP-0313: Message Archive Management。此規範描述了客戶端如何訪問消息歷史記錄並重新同步其狀態。您可以例如query the message archive for all messages after a given time。這將允許連接到讓所有它錯過了自上次在線消息客戶端:

<iq type='set' id='juliet1'> 
    <query xmlns='urn:xmpp:mam:0'> 
    <x xmlns='jabber:x:data'> 
     <field var='FORM_TYPE'> 
     <value>urn:xmpp:mam:0</value> 
     </field> 
     <field var='start'> 
     <value>2010-08-07T00:00:00Z</value> 
     </field> 
    </x> 
    </query> 
</iq> 
+0

如果你能給我一些例子,這將是非常有幫助的。謝謝 –

+0

什麼的一些例子? XEP已包含有關如何啓用查詢消息歸檔的示例節。你可以通過例如時間:http://xmpp.org/extensions/xep-0313.html#filter-time不知道我可以提供什麼,因爲你可以清楚地詢問你收到的最後一封郵件後的所有郵件。編輯消息,以便更明確地瞭解如何在設備連接上重新同步消息。 –

+0

我正在使用Smack API庫與ejabberd SaaS進行通信,但我無法找到如何通過Smack獲取消息歸檔。您提到的鏈接僅解釋協議。 –

0

除了邁克爾的答案,你應該知道的一些事情。如果您指定完整的JID作爲您的地址,則該消息將僅傳遞到該單個端點。

消息遞送到多個資源對於同一用戶將只發生如果

  • 地址是裸JID
  • 所有連接具有相同的優先級
  • 服務器被配置成輸送到多個端點。

最後一點是至關重要的。根據規範,服務器可以通過兩種方式處理髮送給裸JID的消息。

  • 發送到其中一個具有最高優先級的連接。哪一個是由服務器決定的,它可以是第一個連接的,最後一個,或者如果存在具有相同優先級的多個連接,則是隨機選擇。
  • 發送到所有具有最高優先級的連接。

所以,除非你知道你的服務器支持並被配置爲允許第二選擇,否則你無法完成你正在嘗試做的事情。