iOS中的XMPPStreamManagement无法发送/接收确认和节标识

我能够发送消息给用户,这意味着我有一个工作和authentication的xmppStream。

但我无法发送和接收来自服务器的确认。 我想知道服务器成功接收了哪些消息。 我search了一下,发现XEP-0198应该实现这个。 我使用ejabberd作为XMPP服务器,它支持XEP-0198。

我试过了,但是我不知道我是否正确。

首先我包含头文件并添加了XMPPStreamManagementDelegate。

#import "XMPPStreamManagement.h" @interface AppDelegate : UIResponder <UIApplicationDelegate,XMPPStreamManagementDelegate> 

在实现文件中,这是我如何定义stream。

 XMPPStream *xmppS = [[XMPPStream alloc] init]; [xmppS addDelegate:self delegateQueue:dispatch_get_main_queue()]; XMPPStreamManagement *xsm = [[XMPPStreamManagement alloc] init]; [xsm addDelegate:self delegateQueue:dispatch_get_main_queue()]; [xsm activate:xmppS]; 

之后,我连接到服务器。 连接成功后,我发送一个启用节。

 NSXMLElement *enable = [NSXMLElement elementWithName:@"enable" xmlns:@"urn:xmpp:sm:3"]; [xsm.xmppStream sendElement:enable]; 

然后我发送一条消息

 NSXMLElement *a = [NSXMLElement elementWithName:@"request" xmlns:@"urn:xmpp:receipts"]; XMPPElement *e = [[XMPPElement alloc] initWithName:@"message"]; [e addAttributeWithName:@"id" stringValue:@"123456"]; [e addAttributeWithName:@"type" stringValue:@"chat"]; [e addAttributeWithName:@"to" stringValue:@"testuser@myxmppserver.com"]; [e addAttributeWithName:@"from" stringValue:@"testuser2@myxmppserver.com"]; [e addChild:a]; [xsm.xmppStream sendElement:e]; 

testing用户收到消息,testing用户2获取收到的节。

 <received xmlns="urn:xmpp:receipts" id="123456"/> 

我的问题是如果我发送下面的节,我收到没有消息。

 NSXMLElement *r = [NSXMLElement elementWithName:@"r"]; [xsm.xmppStream sendElement:r]; 

我已经实现了以下function

 -(void)xmppStreamManagementDidRequestAck:(XMPPStreamManagement *)sender { NSLog(@"ACK"); } 

但还是没有打印。 请帮忙。 另外,我怎么知道服务器何时收到发送的消息。

让我知道是否有人想知道我身边的任何其他代码部分。

您可以使用xmppStreamManagement中的函数发送请求并获取收到的ID:

 [xmppStreamManagement requestAck]; 

 - (void)xmppStreamManagement:(XMPPStreamManagement *)sender wasEnabled:(NSXMLElement *)enabled - (void)xmppStreamManagement:(XMPPStreamManagement *)sender didReceiveAckForStanzaIds:(NSArray *)stanzaIds 

确保通过以下方式启用streampipe理:

 [self.xmppStreamManagement enableStreamManagementWithResumption:YES maxTimeout:0];