我是XMPP新手,我实施了ejabberd。我的本地主机名是
'Orange.local'
有三个用户。一个是从我的simmulator以admin@orange.local登录的,另一个是来自iMessanger的mihir@orange.local。
我正在创建一个组
@IBAction func CreateGroupBtn(sender: UIButton)
{
var roomJID = XMPPJID.jidWithString("testRoom@conference.orange.local")
var roomMemoryStorage = XMPPRoomMemoryStorage()
var xmppRoom = XMPPRoom(roomStorage: roomMemoryStorage, jid: roomJID, dispatchQueue: dispatch_get_main_queue())
xmppRoom.activate(xmppStream())
xmppRoom.addDelegate(self, delegateQueue: dispatch_get_main_queue())
xmppRoom.joinRoomUsingNickname("admin", history: nil);
}
func xmppRoomDidCreate(sender: XMPPRoom!)
{
println("room created \(sender.description)");
}
func xmppRoomDidJoin(sender: XMPPRoom!) {
println("romm joined")
sender.fetchConfigurationForm()
sender.configureRoomUsingOptions(nil)
sender.fetchMembersList();
sender.sendMessageWithBody("null");
var strInvitedUserName = XMPPJID.jidWithString("mihir@orange.local");
sender.inviteUser(strInvitedUserName, withMessage: "greetings");
}
房间已创建,我可以在群组中与mihir@orange.local聊天。 现在我想得到admin@orange.local的所有组名,我的意思是admin@orange.local是组成员的所有组(房间)。
我正在应用此代码获取组列表:
override func viewDidLoad()
{
super.viewDidLoad()
var server = "conference.orange.local";
var id = xmppStream().generateUUID();
var serverJID = XMPPJID.jidWithString(server)
var iq = XMPPIQ.iqWithType("get", to: serverJID, elementID: id)
iq.addAttributeWithName("from", stringValue: "admin@orange.local")
var query = DDXMLElement.elementWithName("query") as! DDXMLElement;
query.addAttributeWithName("xmlns", stringValue: "http://jabber.org/protocol/disco#items" )
iq.addChild(query);
xmppStream().addDelegate(self, delegateQueue: dispatch_get_main_queue())
xmppStream().sendElement(iq);
}
但是我得到了这样的名单响应:
<iq xmlns="jabber:client" from="admin@orange.local"
to="admin@orange.local/35441594471443421711351344"
id="3F9B0234-0233-4DF0-9174-34CC82FF6B70" type="result">
<query xmlns="jabber:iq:roster">
<item subscription="both" jid="mihir@orange.local">
<group>Buddies</group>
</item>
<item subscription="both" jid="kalpesh@orange.local">
</item>
</query>
</iq>
我的第二个问题是当我获取所有组成员时它返回空数组这里是代码:
func xmppRoom(sender: XMPPRoom!, didFetchMembersList items: [AnyObject]!) {
println("members= \(items)");
}
请帮助我获得所有团体和特定群体的成员。 提前谢谢,抱歉我的英语不好。
答案 0 :(得分:0)
XMPP中的成员列表MUC不是当前可用用户的列表,它只是房间管理员用于不同房间权限/角色/附属关系的“访问控制列表”之一:房间所有者可以授予“成员”,“管理员” “,”所有者“对特定JID的骄傲,禁止他与”被抛弃“的关系,等等。
您需要跟踪发送到会议jid的presence
个数据包,以获得实际的用户列表:XMPPRoom
界面具有xmppRoomDidJoin
和xmppRoomDidLeave
方法。
答案 1 :(得分:0)
我遇到了同样的问题,但我注意到即使我没有尝试查询房间列表,我收到的名单iq也到了。所以我想也许这是时间问题。 当我试图以5秒的小延迟发送房间查询时,它突然起作用。所以我假设在完成一些设置或连接过程后需要发送查询。