XMPPFramework – XEP-0048:书签存储

在我的应用程序中,我实现了创buildXMPPRoom并邀请用户。 现在,我正在寻找一种方法来存储这些组(我创build的或我被邀请参加的组),以便在需要时可以轻松地将其重新找回。 我遇到了书签XEP-0048但是,我找不到任何在线使用的例子。 有没有人用过这个? 你能分享一些例子吗?

http://www.xmpp.org/extensions/attic/xep-0048-1.0.html

艾哈迈德

根据XEP-0048:书签 ,要将书签上传到服务器,您必须发送如下的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&apos;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&apos;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创build完成之后,就可以把它发送到服务器上了

 [xmppStream sendElement:iq]; 

这是书签发送到服务器的方式。 您在XMPPStream委托中监听服务器响应- (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"]); } } } 

现在,基于上面的示例创build用于xml的client-c代码,其中clinet向服务器请求书签( XEP-0048:Bookmarks 3.3 Retrieving Data ):

 <iq from='juliet@capulet.lit/randomID' type='get' id='retrieve1'> <pubsub xmlns='http://jabber.org/protocol/pubsub'> <items node='storage:bookmarks'/> </pubsub> </iq> 

目标代码:

 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&apos;s the Thing' autojoin='true' jid='theplay@conference.shakespeare.lit'> <nick>JC</nick> </conference> </storage> </item> </items> </pubsub> </iq> 

或客观的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); } } } 

无论您何时创build一个组或接受一个聊天室邀请,都将该组存储到本地数据库并提供必要的信息。 退出组时从数据库中删除它。

从jabber服务器获取用户组。

  XMPPIQ *iq = [[XMPPIQ alloc]init]; [iq addAttributeWithName:@"type" stringValue:@"get"]; NSString *from = [NSString stringWithFormat:@"%@/ResouseName",[[AppDelegate instance] xmppStream].myJID.bare]; [iq addAttributeWithName:@"from" stringValue:from]; NSXMLElement *query =[NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:private"]; NSXMLElement *storage = [NSXMLElement elementWithName:@"storage" xmlns:@"storage:bookmarks"]; [query addChild:storage]; [iq addChild:query]; [xmppStream sendElement:iq]; 

你很容易这样做。 请试试这个。 您可以使用此方法添加到服务器中的书签。

 -(void)bookMark :(NSString *)roomName{ XMPPIQ *iq = [[XMPPIQ alloc]init]; [iq addAttributeWithName:@"type" stringValue:@"set"]; NSString *from = [NSString stringWithFormat:@"%@/ResouseName",[[AppDelegate instance] xmppStream].myJID.bare]; [iq addAttributeWithName:@"from" stringValue: from]; NSXMLElement *query =[NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:private"]; NSXMLElement *storage = [NSXMLElement elementWithName:@"storage" xmlns:@"storage:bookmarks"]; NSXMLElement *conference_s = [NSXMLElement elementWithName:@"conference"]; [conference_s addAttributeWithName:@"autojoin" stringValue:@"true"]; [conference_s addAttributeWithName:@"jid" stringValue:roomName]; [storage addChild:conference_s]; [query addChild:storage]; [iq addChild:query]; NSLog(@"print eml log %@:",iq); [xmppStream sendElement:iq]; } 

最后你可以得到你的组列表。

 - (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq { NSXMLElement *pubsub = [iq elementForName:@"query"]; NSXMLElement *storage = [pubsub elementForName:@"storage"]; NSArray *conferenceName = [storage elementsForName:@"conference"]; for (NSXMLElement *conference in conferenceName) { NSString *jid = [[conference attributeForName:@"jid"]stringValue]; NSLog(@"print conference jid=====%@",jid); } NSLog(@"Bookmarks for id are: %@", conferenceName);