- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用中,我实现了创建 XMPPRoom 和邀请用户。现在,我正在寻找一种方法来存储这些组(我创建的组或我受邀加入的组),以便我可以在需要时轻松地将其检索回我的应用程序。我遇到了 XEP-0048 书签,但是,我找不到任何在线使用它的示例。有人用过这个吗?能否分享一些示例?
艾哈迈德
最佳答案
根据 XEP-0048: Bookmarks , 要将书签上传到服务器,您必须像这样发送一个 iq
请求:
<iq from='juliet@capulet.lit/balcony' type='set' id='pip1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<publish node='storage:bookmarks'>
<item id='current'>
<storage xmlns='storage:bookmarks'>
<conference name='The Play's the Thing'
autojoin='true'
jid='theplay@conference.shakespeare.lit'>
<nick>JC</nick>
</conference>
</storage>
</item>
</publish>
<publish-options>
<x xmlns='jabber:x:data' type='submit'>
<field var='FORM_TYPE' type='hidden'>
<value>http://jabber.org/protocol/pubsub#publish-options</value>
</field>
<field var='pubsub#persist_items'>
<value>true</value>
</field>
<field var='pubsub#access_model'>
<value>whitelist</value>
</field>
</x>
</publish-options>
</pubsub>
</iq>
在使用 NSXMLElement 类的 Objective-C 中,上面的 XML 可以这样写:
NSXMLElement *pubsub = [[NSXMLElement alloc] initWithName:@"pubsub" xmlns:@"http://jabber.org/protocol/pubsub"];
NSXMLElement *publish = [[NSXMLElement alloc] initWithName:@"publish"];
[publish addAttributeWithName:@"node" stringValue:@"storage:bookmarks"];
NSXMLElement *item = [[NSXMLElement alloc] initWithName:@"item"];
[item addAttributeWithName:@"id" stringValue:@"current"];
NSXMLElement *storage = [[NSXMLElement alloc] initWithName:@"storage" xmlns:@"storage:bookmarks"];
NSXMLElement *conference = [[NSXMLElement alloc] initWithName:@"conference"];
[conference addAttributeWithName:@"name" stringValue:@"The Play's the Thing"];
[conference addAttributeWithName:@"autojoin" stringValue:@"true"];
[conference addAttributeWithName:@"jid" stringValue:@"theplay@conference.shakespeare.lit"];
NSXMLElement *nick = [[NSXMLElement alloc] initWithName:@"nick" stringValue:@"JC"];
[conference addChild:nick];
[storage addChild:conference];
[item addChild:storage];
[publish addChild:item];
NSXMLElement *publish_options = [[NSXMLElement alloc] initWithName:@"publish-options"];
NSXMLElement *x = [[NSXMLElement alloc] initWithName:@"x" xmlns:@"jabber:x:data"];
[x addAttributeWithName:@"type" stringValue:@"submit"];
NSXMLElement *field1 = [[NSXMLElement alloc] initWithName:@"field"];
[field1 addAttributeWithName:@"var" stringValue:@"FORM_TYPE"];
[field1 addAttributeWithName:@"type" stringValue:@"hidden"];
NSXMLElement *value1 = [[NSXMLElement alloc] initWithName:@"value" stringValue:@"http://jabber.org/protocol/pubsub#publish-options"];
[field1 addChild:value1];
[x addChild:field1];
NSXMLElement *field2 = [[NSXMLElement alloc] initWithName:@"field"];
[field2 addAttributeWithName:@"var" stringValue:@"pubsub#persist_items"];
NSXMLElement *value2 = [[NSXMLElement alloc] initWithName:@"value" stringValue:@"whitelist"];
[field2 addChild:value2];
[x addChild:field2];
[publish_options addChild:x];
[pubsub addChild:publish];
[pubsub addChild:publish_options];
XMPPIQ *iq = [[XMPPIQ alloc] initWithType:@"set" child:pubsub];
[iq addAttributeWithName:@"from" stringValue:@"juliet@capulet.lit/balcony"];
[iq addAttributeWithName:@"id" stringValue:@"pip1"];
当然也可以只用一个NSXMLElement来写,比如
NSXMLElement *iq = [NSXMLElement alloc] initWithName:@"iq" stringValue:[NSString stringWithFormat:@"all xml code from first paragraph with %@ to add your dynamic data...", data1, data2, ...];
[iq addAttributeWithName:@"from" stringValue:@"juliet@capulet.lit/balcony"];
[iq addAttributeWithName:@"id" stringValue:@"pip1"];
创建 iq 后,是时候将它发送到服务器了
[xmppStream sendElement:iq];
这是将书签发送到服务器的方式。您在 XMPPStream 委托(delegate) - (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
中监听服务器响应,服务器响应应该是这样的:
<iq to='juliet@capulet.lit/balcony' type='result' id='pip1'/>
或者在 objective-c 代码中:
- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
{
if([iq isResultIQ])
{
if([[iq attributeStringValueForName:@"id"] isEqualToString:@"pip1"])
{
NSLog(@"Bookmarks with id %@ succesfully uploaded", [iq attributeStringValueForName:@"id"]);
}
}
}
现在,基于上面的示例,为 clinet 从服务器(XEP-0048: Bookmarks 3.3 Retrieving Data)请求书签的 xml 创建 objective-c 代码:
<iq from='juliet@capulet.lit/randomID' type='get' id='retrieve1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<items node='storage:bookmarks'/>
</pubsub>
</iq>
objective-c 代码:
NSXMLElement *pubsub = [[NSXMLElement alloc] initWithName:@"pubsub" xmlns:@"http://jabber.org/protocol/pubsub"];
NSXMLElement *items = [[NSXMLElement alloc] initWithName:@"items"];
[items addAttributeWithName:@"node" stringValue:@"storage:bookmarks"];
[pubsub addChild:items];
XMPPIQ *iq = [[XMPPIQ alloc] initWithType:@"get" child:pubsub];
[iq addAttributeWithName:@"from" stringValue:@"juliet@capulet.lit/balcony"];
[iq addAttributeWithName:@"id" stringValue:@"retrive1"];
像以前一样发送到服务器:
[xmppStream sendElement:iq];
并像以前一样监听服务器响应:
<iq type='result'
to='juliet@capulet.lit/randomID'
id='retrieve1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<items node='storage:bookmarks'>
<item id='current'>
<storage xmlns='storage:bookmarks'>
<conference name='The Play's the Thing'
autojoin='true'
jid='theplay@conference.shakespeare.lit'>
<nick>JC</nick>
</conference>
</storage>
</item>
</items>
</pubsub>
</iq>
或 objective-c 代码:
- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
{
if([iq isResultIQ])
{
if([[iq attributeStringValueForName:@"id"] isEqualToString:@"retrive1"])
{
NSXMLElement *pubsub = [iq elementForName:@"pubsub"];
NSArray *items = [pubsub elementsForName:@"items"];
NSLog(@"Bookmarks for id %@ are: %@", [iq attributeStringValueForName:@"id"], items);
}
}
}
关于ios - XMPPFramework - XEP-0048 : Bookmark Storage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20792739/
我使用 ejabberd 18 作为 xmpp 服务器,要使用实现 mod_push 的推送通知,我们需要将 ejabberd 服务器连接到扩展 ejabberd 18 的应用服务器,是否有可用的插件
我正在尝试使用 XMPPFramework 和 OpenFire 在 iOS 上通过 XMPP 传输文件。我的代码基础来自以下 tutorial .我有一个成功的 TurnSocket (XEP-00
我有点困惑 XEP-0114作品。使用组件为域提供服务是否意味着服务器将不再代表该域执行任何操作,还是仅仅意味着该组件也将被允许为该域上的所有用户提供服务。 更具体地说,是否可以让多个组件服务于同一个
我正在开发一个移动消息应用程序 (ios),我支持注销功能。当用户再次登录时,我想保留最新的对话列表。因为一旦注销,应用程序的本地存储就会被清理。 我正在成功使用 MAM XEP-0313,但我还没有
我正在寻找一种如何通过使用 XEP-0136 标准从谷歌服务器检索聊天消息存档的方法,但我得到这些结果只是试图请求该功能。 要求: 回复:
我知道 DelayInformationManager 类,我知道这是实现此目的的类。但是,我不知道如何使用它,如何指定 Jid 目的地,如何实际发送等等。 谁能给我一个简短的例子来说明它的用法? 最
我正在 iOS 中开发聊天应用程序并使用 openfire xmpp 服务器?我正在尝试使用 XEP-0191 阻止用户:阻止命令但结果出错。 错误 xmlns="jabber:client"type
我想用 java 创建一个简单的 XMPP 客户端,与其他客户端共享他的位置 (XEP-0080)。我已经知道我可以使用 XMPP 的 smack 库并且它支持 XEP-0080 所需的 PEP。有没
需要附上一个0313 XEP (0.2) http://xmpp.org/extensions/attic/xep-0313-0.2.html#sect-idp616432进入 SMACK/ASMAC
我正在尝试使用 Openfire 制作聊天应用程序和 Strophe.js . 我总是阅读有关 XEP 等的信息,它总是将我重定向到 XMPP Extensions我什至不知道如何使用这些扩展。这似乎
libjingle's developer guide相当含糊地提到了 libjingle 的 Jingle 实现与 XEP-0166 规范之间的不兼容性。它还提到它与 XEP-0167、XEP-01
我无法接收 XMPP 消息,我正在使用以下代码: Message mess = new Message() { @Override public S
我正在研究 MUC,为此我想为已加入的房间添加书签。为此,我使用了 xep-0048 扩展名,并且服务器文档显示我创建了相同的 iq 请求,但书签似乎不起作用。 以下是我的智商要求
我从我的服务器获得了可能的字段: You need an x:data capable client to search Search users in vjud.company.com Fill
在我的应用中,我实现了创建 XMPPRoom 和邀请用户。现在,我正在寻找一种方法来存储这些组(我创建的组或我受邀加入的组),以便我可以在需要时轻松地将其检索回我的应用程序。我遇到了 XEP-0048
我正在使用 aSmack。我的应用程序监听聊天室并对消息使用react,但它从不发送消息。如果聊天室保持沉默一段时间然后发送新消息,则该应用程序不会收到更多消息。我研究过,我认为 XEP-0199是这
我想为用户提供使用长按/选择操作一次删除一条或多条消息的功能。 我知道你想知道到目前为止我尝试了什么。但问题是我还没有找到任何关于删除消息的实现。 感谢任何形式的帮助! 最佳答案 您必须从 xmpp
我正在使用 robbiehanson/XMPPFramework对于我当前的项目,我可以向名册中的人发送和接收消息,但现在我必须实现消息传递状态。我知道 xep 是 0184,我也包含在我的项目中,但
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
一旦我有了花名册,我就可以循环遍历所有成员并使用 MamManager 进行查询mamManager.mostRecentPage(jid, QUERY_META_DATA_PAGE_SIZE) 但是
我是一名优秀的程序员,十分优秀!