Poniżej jest jak mam mój własny problem rozwiązany. Zauważ, że to rozwiązanie w ogóle nie wymaga XMPPRoom. Najpierw stworzyłem metodę, która w zależności od sytuacji tworzy lub wchodzi do pokoju. (Na dokumentację XMPP żądanie XML tworzenia jest takie samo jak to, które wysłałeś by wejść do pokoju, to znaczy, jeśli pokój nie istnieje jeszcze, gdy go wprowadzisz, usługa utworzy go dla ciebie .)
Tutaj idziemy. Jest to metoda, która tworzy/wchodzi do pokoju. To, co robi ta metoda, to wysłanie obecności do pokoju, który chcesz utworzyć/wprowadzić. Jeśli pierwszy raz wchodzisz do pokoju, a pokój nie został jeszcze utworzony, automatycznie stajesz się jego właścicielem i moderatorem.
- (void)createOrEnterRoom:(NSString *)roomName
{
//here we enter a room, or if the room does not yet exist, this method creates it
//per XMPP documentation: "If the room does not yet exist, the service SHOULD create the room"
//this method accepts an argument which is what you would baptize the room you wish created
NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"];
NSString *room = [roomName stringByAppendingString:@"@conference.jabber.com/iMac"];
[presence addAttributeWithName:@"to" stringValue:room];
NSXMLElement *x = [NSXMLElement elementWithName:@"x" xmlns:@"http://jabber.org/protocol/muc"];
NSXMLElement *history = [NSXMLElement elementWithName:@"history"];
[history addAttributeWithName:@"maxstanzas" stringValue:@"50"];
[x addChild:history];
[presence addChild:x];
[[self xmppStream] sendElement:presence];
}
Następnie w AppDelegate gdzie metody XMPPStream są zadeklarowane filtrujemy odpowiedź XML, które otrzymujemy w metodzie didReceivePresence sprawdzając kod statusu wysłanego przez serwer. Jeśli kod statusu wynosi 201, bingo! Tworzenie pokoju poszło dobrze. Kody statusu inne niż 201 oznaczają różne rzeczy, ale skupmy się na 201 dla naszego celu.
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
{
NSXMLElement *x = [presence elementForName:@"x" xmlns:@"http://jabber.org/protocol/muc#user"];
for (NSXMLElement *status in [x elementsForName:@"status"])
{
switch ([status attributeIntValueForName:@"code"])
{
case 201: [self notifyRoomCreationOk:room];
}
}
}
Następnie powiemy serwerowi że to co tworzysz pokój typu „instant”, co oznacza, że wyślemy element IQ mówiąc to domyślne nocleg. notifyRoomCreationOk to metoda delegowana wywoływana w innym widoku, gdy tworzenie pokoju powiedzie się, w końcu muszę nagrać pokój w pliku tekstowym, aby był trwały, aby następnym razem, gdy otworzyłem aplikację, pokój, który wcześniej utworzyłem, będzie widoczny. W mojej metoda notifyRoomCreationOk, mam sendDefaultRoomConfig, który, zasadniczo, opisuje to, co jest określone w pierwszym zdaniu tego akapitu.
-(void)sendDefaultRoomConfig:(NSString *)room
{
NSXMLElement *x = [NSXMLElement elementWithName:@"x" xmlns:@"jabber:x:data"];
[x addAttributeWithName:@"type" stringValue:@"submit"];
NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"http://jabber.org/protocol/muc#owner"];
[query addChild:x];
XMPPIQ *iq = [XMPPIQ iq];
[iq addAttributeWithName:@"id" stringValue:[NSString stringWithFormat:@"inroom-cr%@", room]];
[iq addAttributeWithName:@"to" stringValue:room];
[iq addAttributeWithName:@"type" stringValue:@"set"];
[iq addChild:query];
[[self xmppStream ] sendElement:iq];
}
Upewnij się, że masz włączone XMPPStream widoków, które wymagają powyższych metod, w przeciwnym razie, to nie będzie działać. To wszystko. Baw się dobrze XMPP!
czy możesz połączyć qn z innymi stronami, do których się zwracałeś? –
@LithuThiruvathira Możesz pobrać framework tutaj: https://github.com/robbiehanson/XMPPFramework –
Spójrz na moją odpowiedź na podobne pytanie http: // stackoverflow.com/questions/11791022/trouble-creating-xmpp-muc-room-code-503-service-unavailable/14708653 # 14708653 –