在 XMPP 框架 iOS 中阻止用户
Posted
技术标签:
【中文标题】在 XMPP 框架 iOS 中阻止用户【英文标题】:Blocking user in XMPP Framework iOS 【发布时间】:2012-04-03 11:50:55 【问题描述】:我正在为 ios 开发一个基于 XMPP 的聊天应用程序。该应用程序的功能之一是我需要阻止一些用户进入我的公鸡。在 XMPP 框架中是否有任何可用的方法?如果没有,是否有一些解决方法可以做到这一点?
还有人可以帮助我使用 XMPP 将图像从一个用户发送到另一个用户吗?
【问题讨论】:
【参考方案1】:您可能需要考虑许多事项:
您的用户很可能订阅了联系人的状态,反之亦然。他将取消订阅联系人的状态(因此他将不再收到来自他的状态通知),方法是发送:
<presence to='contact@example.com' type='unsubscribe'/>
他将通过发送以下信息撤销联系人对他自己的存在的订阅:
<presence to='contact@example.com' type='unsubscribed'/>
最后,您可以从您的花名册中删除该项目。
<iq from='user@example.com/home' type='set' id='roster'>
<query xmlns='jabber:iq:roster'>
<item jid='contact@example.com' subscription='remove'/>
</query>
</iq>
事实上,如果你发送上面的节,即如果你想取消两个订阅,你不需要发送出席节,它们将由服务器处理。
最后,您现在可以通过jabber:iq:privacy
API 阻止与用户的进一步交互。这个有详细解释here。
一般的出席/名册管理在同一个 rfc 中进行了解释,最好是here。
【讨论】:
【参考方案2】:请检查此代码以实现用户阻止:
-(void)blockUser
XMPPIQ *iq = [[XMPPIQ alloc]init];
NSString *from = [NSString stringWithFormat:@"from@mail.com/resources"];
[iq addAttributeWithName:@"from" stringValue: from];
[iq addAttributeWithName:@"type" stringValue:@"set"];
NSXMLElement *block =[NSXMLElement elementWithName:@"block" xmlns:@"urn:xmpp:blocking"];
NSXMLElement *item = [NSXMLElement elementWithName:@"item"];
[item addAttributeWithName:@"jid" stringValue:@"to@mail.com/resources"];
[block addChild:item];
[iq addChild:block];
[xmppStream sendElement:iq];
【讨论】:
@Preetha 您正在使用哪个 XMPP 服务器?这段代码对我不起作用,我使用的是 Openfire 4.1.1。 我用的是ejabberd聊天服务器 @Preetha 你有任何解决方案来阻止和解除阻止用户吗?请帮助找到它。 ***.com/q/46155095/2910061【参考方案3】: - (void)setupXMPPPrivacy
NSLog((@"%s [Line %d] "), __PRETTY_FUNCTION__, __LINE__);
//Init XMPPPrivacy List
//xmppPrivacy = [[XMPPPrivacy alloc] init];
xmppPrivacy = [[XMPPPrivacy alloc] initWithDispatchQueue:dispatch_get_main_queue()];
//Activate xmpp modules
[xmppPrivacy activate:[[self appDelegate] xmppStream]];
//Delegate XMPPPrivacy
[xmppPrivacy addDelegate:self delegateQueue:dispatch_get_main_queue()];
[xmppPrivacy retrieveListWithName :@"Block_List"];
-(void)privacyblock
[xmppPrivacy retrieveListWithName:@"Block_List"];
[xmppPrivacy setActiveListName:@"Block_List"];
NSXMLElement *privacyElement = [XMPPPrivacy privacyItemWithType:@"jid" value:xmpp_jid action:@"deny" order:1];
[XMPPPrivacy blockIQs:privacyElement];
[XMPPPrivacy blockMessages:privacyElement];
[XMPPPrivacy blockPresenceIn:privacyElement];
[XMPPPrivacy blockPresenceOut:privacyElement];
NSLog(@"-------> PRIVACY ELEMENT: %@", privacyElement);
[arrayPrivacy addObject:privacyElement];
[xmppPrivacy setListWithName:@"Block_List" items:arrayPrivacy];
【讨论】:
纯代码答案不是很好,建议您解释一下。 只需导入 xmppprivacy.h 文件。使用此代码创建隐私 Block_list 并发送 iq 以使用 [xmppPrivacy retrieveListWithName :@"Block_List"] 获取该阻止列表;这个方法。 一旦执行此代码,用户不会收到来自被阻止用户的消息,但是当我重新连接我的 xmppstream 时,我会收到来自被阻止用户的消息。以上是关于在 XMPP 框架 iOS 中阻止用户的主要内容,如果未能解决你的问题,请参考以下文章
使用 Openfire 中的用户服务通过 iOS 的 xmpp 框架注册新用户
使用 xmpp 框架登录 ios 应用程序时面临断言失败错误:ios