【问题标题】:Xmpp + openfire + server acknowledgement to the senderXmpp + openfire + 服务器对发件人的确认
【发布时间】:2018-01-30 13:40:28
【问题描述】:

我正在开发 IM 应用程序。 我想在

时得到确认

Openfire 服务器收到消息时

我在gradles下面用过

//XMPP Gradles
compile 'org.igniterealtime.smack:smack-android:4.1.0'
compile 'org.igniterealtime.smack:smack-tcp:4.1.0'
compile 'org.igniterealtime.smack:smack-im:4.1.0'
compile 'org.igniterealtime.smack:smack-extensions:4.1.0'

注意:我已经浏览了每个 StackOverflow 链接并得出结论,Openfire 不支持 XEP-0184,并且它描述了 的机制仅限送货收据。

我也尝试过 DeliveryReceiptManager 并设置了他们的 addReceiptReceivedListener,但它不起作用。

我们将不胜感激任何解决方法或建议。

【问题讨论】:

  • 连接成功后输入DeliveryReceiptManager.getInstanceFor(connection).enableAutoReceipts();
  • 让我试试@Maddy。

标签: android xmpp openfire smack


【解决方案1】:

发送消息时附上DeliveryReceiptRequest.addTo(msg);

喜欢这个

Message msg = new Message(oppositeUserId, Message.Type.chat);
msg.setBody(mMessageBody);
msg.setStanzaId(messageId);
msg.setFrom(loginUserId);

DeliveryReceiptRequest.addTo(msg);

mXMPPTCPConnection.sendStanza(msg);

XmppDeliveryReceiptManager.java

public class XmppDeliveryReceiptManager implements ReceiptReceivedListener {


    private static final String TAG = XmppDeliveryReceiptManager.class.getSimpleName();

    Context mContext;


    public XmppDeliveryReceiptManager(Context mContext) {
       this.mContext = mContext;
       Log.d(TAG, "XmppDeliveryReceiptManager : initialized ");
    }

    @Override
    public void onReceiptReceived(String fromJid, String toJid, String receiptId, Stanza receipt) {
        Log.d(TAG, "onReceiptReceived : receiptId = " + receiptId);
        // do need full with "receiptId"         
    }
}

将此添加到您的 XMPP 配置中

/*  Add XMPP DeliveryReceiptManager */
ProviderManager.addExtensionProvider(DeliveryReceipt.ELEMENT,
            DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider());
ProviderManager.addExtensionProvider(DeliveryReceiptRequest.ELEMENT,
            new DeliveryReceiptRequest().getNamespace(), new DeliveryReceiptRequest.Provider());

mXmppDeliveryReceiptManager = new XmppDeliveryReceiptManager(mContext);
mDeliveryReceiptManager = DeliveryReceiptManager.getInstanceFor(mXMPPTCPConnection);
mDeliveryReceiptManager.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
        mDeliveryReceiptManager.addReceiptReceivedListener(mXmppDeliveryReceiptManager);

【讨论】:

  • 正是我想要的!
【解决方案2】:

最好为每条发送的消息附加一个通用侦听器,并相应地更新您的数据库(以及您的 UI)。

为每条传出消息定义一个随机 UUID:

String stanzaId = UUID.randomUUID().toString()

将监听器附加到您的消息中:

xmppTcpConnection.addStanzaIdAcknowledgedListener(stanzaId , new StanzaListener()
{
    @Override
    public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException
    {
     // You can match your stanzaId here!
     // packet.getStanzaId()   
    }
});

添加:

compile "org.igniterealtime.smack:smack-tcp:4.2.0"

获取XMPPTCPConnection对象。

更新:尝试在 xmppTcpConnection 对象上调用 connect() 之前添加侦听器。

【讨论】:

  • 没有让你@Sarthak,这是否添加了StanzaIdAcknowledgedListener,让我们确认来自服务器端的发件人消息(例如:此消息被服务器接收)?
  • 我也面临消息跳过问题!有什么解决办法吗?
  • @Radhey 是的,当您在 processStanza 方法中收到回调时,这意味着服务器已成功接收到特定消息。
  • @Radhey 消息跳过?
  • 谢谢@SarthakMittal,你为我节省了很多时间。
猜你喜欢
  • 2013-10-07
  • 2019-01-29
  • 1970-01-01
  • 2016-02-09
  • 2016-04-16
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多