在 XMPP 花名册中添加多个用户
Add multiple users in XMPP roster
如何在我的花名册中添加多个用户?现在我一次可以添加一个用户。但现在我必须使用 XMPP 同步设备联系人。使用后端 API 我可以过滤掉在应用程序中注册的联系人。现在将他们一个一个地添加到名册中太花时间了。
那么有没有更快捷的方式将多个联系人添加到名册中?
我已经回答了很多类似this的问题,但它们没有帮助。
过滤设备与后端的联系 API 是一个好方法,还是我应该做其他事情?
XMPP 是一个完整的基于 XML 的协议,即使库没有一些方法,我们也可以根据需要扩展库。因此,正如您所说,您想要添加多个花名册,有两种方法可以实现:
1. 将一些方法添加到您的 XMPP 客户端库或您的应用程序中,并添加多个名册项,如下所示:
- (void)addUsers:(NSArray<XMPPJID *> *)jids withNickname:(NSArray<NSString *> *)optionalNames groups:(NSArray *)groups {
if (jids == nil) return;
XMPPJID *myJID = xmppStream.myJID;
// Add the buddy to our roster
//
// <iq type="set">
// <query xmlns="jabber:iq:roster">
// <item jid="bareJID" name="optionalName">
// <group>family</group>
// </item>
// </query>
// </iq>
XMPPIQ *iq = [XMPPIQ iqWithType:@"set"];
for (int i = 0; i < jids.count; i++) {
XMPPJID *jid = jids[0];
if ([myJID isEqualToJID:jid options:XMPPJIDCompareBare])
{
// You don't need to add yourself to the roster.
// XMPP will automatically send you presence from all resources signed in under your username.
//
// E.g. If you sign in with robbiehanson@deusty.com/home you'll automatically
// receive presence from robbiehanson@deusty.com/work
XMPPLogInfo(@"%@: %@ - Ignoring request to add myself to my own roster", [self class], THIS_METHOD);
continue;
}
NSXMLElement *item = [NSXMLElement elementWithName:@"item"];
[item addAttributeWithName:@"jid" stringValue:[jid bare]];
NSString *optionalName = optionalNames[i];
if(optionalName)
{
[item addAttributeWithName:@"name" stringValue:optionalName];
}
for (NSString *group in groups) {
NSXMLElement *groupElement = [NSXMLElement elementWithName:@"group"];
[groupElement setStringValue:group];
[item addChild:groupElement];
}
NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];
[query addChild:item];
[iq addChild:query];
}
[xmppStream sendElement:iq];
}
- 在服务器端用一些 rabbitmq 服务编写一些服务 api,它会为一个用户插入多个花名册,XMPP 服务器会更新你的花名册更新。我希望这个答案能帮助你。
我试过发送这个节:
<iq type="set" id="15-47" to="940588870@localhost">
<query xmlns="jabber:iq:roster" ver="1116247190">
<item jid="1234@localhost" name="user1" subscription="both">
<group>acceptance</group>
</item>
<item jid="7663@localhost" name="user2" subscription="both">
<group>acceptance</group>
</item>
<item jid="9876@localhost" name="user3" subscription="both">
<group>acceptance</group>
</item>
<item jid="1111@localhost" name="user4" subscription="both">
<group>acceptance</group>
</item>
</query>
</iq>
我收到了
this error : 00:32:03.163 [Smack Cached Executor] WARN org.jivesoftware.smack.roster.Roster.handleIQRequest(1739) - - Ignoring roster push with not exactly one entry. size=4
在进一步检查时,XMPP 指南说它将具有命名空间 "jabber:IQ:roster" 的数据包和查询元素内超过 1 个项目元素视为错误情况。
如何在我的花名册中添加多个用户?现在我一次可以添加一个用户。但现在我必须使用 XMPP 同步设备联系人。使用后端 API 我可以过滤掉在应用程序中注册的联系人。现在将他们一个一个地添加到名册中太花时间了。
那么有没有更快捷的方式将多个联系人添加到名册中?
我已经回答了很多类似this的问题,但它们没有帮助。
过滤设备与后端的联系 API 是一个好方法,还是我应该做其他事情?
XMPP 是一个完整的基于 XML 的协议,即使库没有一些方法,我们也可以根据需要扩展库。因此,正如您所说,您想要添加多个花名册,有两种方法可以实现: 1. 将一些方法添加到您的 XMPP 客户端库或您的应用程序中,并添加多个名册项,如下所示:
- (void)addUsers:(NSArray<XMPPJID *> *)jids withNickname:(NSArray<NSString *> *)optionalNames groups:(NSArray *)groups {
if (jids == nil) return;
XMPPJID *myJID = xmppStream.myJID;
// Add the buddy to our roster
//
// <iq type="set">
// <query xmlns="jabber:iq:roster">
// <item jid="bareJID" name="optionalName">
// <group>family</group>
// </item>
// </query>
// </iq>
XMPPIQ *iq = [XMPPIQ iqWithType:@"set"];
for (int i = 0; i < jids.count; i++) {
XMPPJID *jid = jids[0];
if ([myJID isEqualToJID:jid options:XMPPJIDCompareBare])
{
// You don't need to add yourself to the roster.
// XMPP will automatically send you presence from all resources signed in under your username.
//
// E.g. If you sign in with robbiehanson@deusty.com/home you'll automatically
// receive presence from robbiehanson@deusty.com/work
XMPPLogInfo(@"%@: %@ - Ignoring request to add myself to my own roster", [self class], THIS_METHOD);
continue;
}
NSXMLElement *item = [NSXMLElement elementWithName:@"item"];
[item addAttributeWithName:@"jid" stringValue:[jid bare]];
NSString *optionalName = optionalNames[i];
if(optionalName)
{
[item addAttributeWithName:@"name" stringValue:optionalName];
}
for (NSString *group in groups) {
NSXMLElement *groupElement = [NSXMLElement elementWithName:@"group"];
[groupElement setStringValue:group];
[item addChild:groupElement];
}
NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];
[query addChild:item];
[iq addChild:query];
}
[xmppStream sendElement:iq];
}
- 在服务器端用一些 rabbitmq 服务编写一些服务 api,它会为一个用户插入多个花名册,XMPP 服务器会更新你的花名册更新。我希望这个答案能帮助你。
我试过发送这个节:
<iq type="set" id="15-47" to="940588870@localhost">
<query xmlns="jabber:iq:roster" ver="1116247190">
<item jid="1234@localhost" name="user1" subscription="both">
<group>acceptance</group>
</item>
<item jid="7663@localhost" name="user2" subscription="both">
<group>acceptance</group>
</item>
<item jid="9876@localhost" name="user3" subscription="both">
<group>acceptance</group>
</item>
<item jid="1111@localhost" name="user4" subscription="both">
<group>acceptance</group>
</item>
</query>
</iq>
我收到了
this error : 00:32:03.163 [Smack Cached Executor] WARN org.jivesoftware.smack.roster.Roster.handleIQRequest(1739) - - Ignoring roster push with not exactly one entry. size=4
在进一步检查时,XMPP 指南说它将具有命名空间 "jabber:IQ:roster" 的数据包和查询元素内超过 1 个项目元素视为错误情况。