【问题标题】:Proper way to uniquely identify a message sent via XMPP in delegate method?在委托方法中唯一标识通过 XMPP 发送的消息的正确方法?
【发布时间】:2014-10-02 21:22:45
【问题描述】:

我正在使用 XMPPFramework 编写一个 iOS 聊天应用程序,我想知道创建新消息的最佳方法是什么,以便我可以将在一个委托方法中返回的 XMPPMessage 映射回原始消息,即发送。我想这样做,以便我可以判断何时发送消息成功或不成功(以便我可以缓存并重新发送它)。

当用户点击客户端上的发送键时,会调用以下代码来创建和发送消息:

NSXMLElement *body = [NSXMLElement elementWithName:@"body"];
[body setStringValue:messageText];

NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
[message addAttributeWithName:@"type" stringValue:@"chat"];
[message addAttributeWithName:@"to" stringValue:recipientJID];
[message addChild:body];

[[self xmppStream] sendElement:message];

然后我将内容、收件人、时间戳等存储到数组中的自定义对象(基本上是message 中的所有内容)中。

我希望能够将数组中的对象与以下任一委托方法中返回的 XMPPMessage 对象匹配:

- (void)xmppStream:(XMPPStream *)sender didFailToSendMessage:(XMPPMessage *)message error:(NSError *)error
{

}

- (void)xmppStream:(XMPPStream *)sender didSendMessage:(XMPPMessage *)message
{

}

是否有一个属性,我可以在通过XMPPStream 发送的message 变量中添加某种唯一标识符,然后该属性将显示在传递给这些委托方法的XMPPMessage 中?

【问题讨论】:

    标签: ios objective-c xmpp xmppframework


    【解决方案1】:

    为什么不发送XMPPMessage 而不是NSXMLElement?这样,传入didFailToSendMessagedidSendMessage 的对象将与您发送的对象匹配。此外,您可以设置elementId 来识别节(消息、智商或存在)

    XMPPMessage *message = [XMPPMessage messageWithType:@"chat"
                                                     to:someJid
                                              elementID:elementId];
    
    [[self xmppStream] sendElement:message];
    

    【讨论】:

    • 最初传递 XMPPMessage 的要点。昨晚刚刚通过调试器运行它,我注意到其中一个委托消息中的 XMPPMessage 包含与我最初发送的 NSXMLElement 相同的 name 属性值。据您所知,在客户端使用 name 或 elementID 来唯一标识节之间是否有任何不同的优点/缺点,或者它们都可用于任何类型的客户端使用?
    • 您绝对应该使用 elementId。这是 XMPP 节中的“id”属性,不仅可以由您的客户端使用,也可以由服务器或其他客户端使用。例如丢弃重复的节,或确定哪个 IQ 结果对应于一个 IQ 集/获取。
    • 我看不懂。请提供源代码 谢谢@MatíasR
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多