在iOS中使用XMPP实现最后看到的功能Stanza没有被发送

时间:2014-10-14 10:05:24

标签: ios objective-c xmpp

我正在使用一个像whatsapp一样聊天的应用程序并且具有上次看到的功能我已经引用了这个答案

How to implement "last seen at" functionality (like whatsapp) in XMPP?

我已经在这样的聊天屏幕上实现了代码

NSXMLElement *queryElement = [NSXMLElement elementWithName: @"query" xmlns: @"jabber:iq:last"];
 NSXMLElement *iqStanza = [NSXMLElement elementWithName: @"iq"];
    [iqStanza addAttributeWithName: @"type" stringValue: @"get"];
    [iqStanza addAttributeWithName:John@192.168.1.100  stringValue: @"from"];
    [iqStanza addAttributeWithName:Jacob@192.168.1.100 stringValue: @"to"];
    [iqStanza addAttributeWithName: @"last1" stringValue: @"id"];
    [iqStanza addChild: queryElement];
    [self.xmppStream sendElement:iqStanza];

但我仍然没有得到最后一次见到Can Any One请帮助我当我做错了? 既没有被送到最后一节也没有收到最后一节的节。 提前谢谢。

3 个答案:

答案 0 :(得分:4)

我认为你得到了你的" addAttributeWithName"价值观混乱。

您使用的是this iOS XMPP Framework吗?

如果您已导入XMPPIQ和XMPPJID,则可以尝试:

XMPPIQ *lastActivity = [[XMPPIQ alloc] initWithType:@"get" to:[XMPPJID jidWithString:@"Jacob@192.168.1.100"]];
[lastActivity addAttributeWithName:@"from" stringValue:@"John@192.168.1.100"];
[lastActivity addAttributeWithName:@"id" stringValue:@"last1"];
[lastActivity addChild:[[XMPPIQ alloc] initWithName:@"query" xmlns:@"jabber:iq:last"]];
[self.xmppStream sendElement:lastActivity];

或者您可以为此导入XMPPLastActivity.h:

[xmppLastActivity sendLastActivityQueryToJID:[XMPPJID jidWithString:@"Jacob@192.168.1.100"]];

如果你想坚持使用NSXMLElement:

NSXMLElement *iqStanza = [NSXMLElement elementWithName: @"iq"];
[iqStanza addAttributeWithName: @"type" stringValue: @"get"];
[iqStanza addAttributeWithName: @"from"  stringValue:@"John@192.168.1.100"];
[iqStanza addAttributeWithName: @"to" stringValue: @"Jacob@192.168.1.100"];
[iqStanza addAttributeWithName: @"id" stringValue: @"last1"];

NSXMLElement *queryElement = [NSXMLElement elementWithName: @"query" xmlns: @"jabber:iq:last"];
[iqStanza addChild: queryElement];

[self.xmppStream sendElement:iqStanza];

您的attributeWithName是"字段名称"并且stringValue是您的参数。哦,不要忘记用@"{STRING HERE}"将字符串括起来。

修改

至于回应,我想你会从以下方面得到:

- (void)xmppLastActivity:(XMPPLastActivity *)sender didReceiveResponse:(XMPPIQ *)response {        
}

如果你设置了委托(如果你在 setUpStream 方法上设置了它):

xmppLastActivity = [[XMPPLastActivity alloc] initWithDispatchQueue:dispatch_get_main_queue()];
[xmppLastActivity addDelegate:self delegateQueue:dispatch_get_main_queue()];
[xmppLastActivity activate:xmppStream];

在XMPPIQ + LastActivity.h中声明了方便方法,但我不确定如何使用它们。只需尝试记录响应。

- (void)xmppLastActivity:(XMPPLastActivity *)sender didReceiveResponse:(XMPPIQ *)response {
    NSLog(@"last activity: %lu", (unsigned long)[response lastActivitySeconds]);
    NSLog(@"response: %@", response);

}

答案 1 :(得分:2)

在AppDelegate.h文件中导入XMPPLastActivity.h并声明此类的属性。

@property (nonatomic, strong, readonly)  XMPPLastActivity *xmppLastActivity;
用于Xmpp的setupStream方法的

和AppDelegate.m文件分配它并设置xmpplastActivity的委托并激活lastActivity模块

 xmppLastActivity = [[XMPPLastActivity alloc] initWithDispatchQueue:dispatch_get_main_queue()];

    [xmppLastActivity addDelegate:self delegateQueue:dispatch_get_main_queue()];
    [xmppLastActivity      activate:xmppStream];

并且您必须为Jid调用您想要Last活动的方法。并像这样打电话

[xmppLastActivity sendLastActivityQueryToJID:[XMPPJID jidWithString:FriendsJID]];

你可以在几秒钟内得到答案

- (void)xmppLastActivity:(XMPPLastActivity *)sender didReceiveResponse:(XMPPIQ *)response
{
    NSLog(@"last seen: %lu", (unsigned long)[response lastActivitySeconds]);
}

希望这将帮助您获得最后看到的用户。  最后,但至少要感谢@hardluckbaby找出这个。

答案 2 :(得分:0)

这些线看起来很奇怪:

[iqStanza addAttributeWithName:John@192.168.1.100  stringValue: @"from"];
[iqStanza addAttributeWithName:Jacob@192.168.1.100 stringValue: @"to"];
[iqStanza addAttributeWithName: @"last1" stringValue: @"id"];

看起来你的名字和价值是错误的 - 名字是fromtoid,价值是{{1 },John@192.168.1.100Jacob@192.168.1.100

此外,作为客户,您不需要添加last1属性;服务器会为你做。但是,如果您确实提供了不正确的from属性,则服务器将拒绝该节。