2012-04-29 5 views
5

Pracuję nad aplikacją do czatowania iOS XMPP, która wykorzystuje XMPPFramework Robbie Hanson.MUC z XMPPFramework

Zaimplementowano najważniejsze funkcje - wysyłanie i odbieranie wiadomości. Zasadniczo zbudowałem już podstawową funkcjonalną aplikację do czatu, oczywiście z odrobiną słodyczy.

Teraz mam problem dotyczący MUC. Kody, które zobaczyłem na innych stronach internetowych, pokazują, że istnieje metoda initWithRoomName w XMPPRoom. Jednak ta metoda jest nieobecna w repozytorium git, które sklonowałem. Czym więc jest alternatywa? Lub, jeśli go nie ma, w jaki sposób mogę tworzyć pokoje przy użyciu XMPPFramework?

Dzięki.

+0

czy możesz połączyć qn z innymi stronami, do których się zwracałeś? –

+0

@LithuThiruvathira Możesz pobrać framework tutaj: https://github.com/robbiehanson/XMPPFramework –

+0

Spójrz na moją odpowiedź na podobne pytanie http: // stackoverflow.com/questions/11791022/trouble-creating-xmpp-muc-room-code-503-service-unavailable/14708653 # 14708653 –

Odpowiedz

11

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!

+0

hej @Ten Go, możesz udostępnić przykładowy kod do tego? to dla mnie bardzo pilne ... Z góry dziękuję –

+0

@ Suresh.D, tworzysz pokój? Mam jedną sugestię: przeczytaj dokumentację znajdującą się na http://xmpp.org/extensions/xep-0045.html, aby dowiedzieć się, jak przebiega proces tworzenia całego pokoju. Na początku jest to bardzo trudne, ale gdy zrozumiesz sekwencję tworzenia pomieszczenia, okaże się to bardzo proste. Następnie podłącz kod powyżej, który napisałem powyżej w twojej aplikacji. –

+0

Tak, zrobiłem samething, co powiedziałeś, ale stan kodu powróci zawsze 0. Ale kiedy używam jeden do jednego czatu, stan kodu powróci 12. –

2
XMPPRoom *room = [[XMPPRoom alloc] initWithRoomName:@"[email protected]/room" nickName:@"room"]; 
    [room createOrJoinRoom]; 
    [room sendInstantRoomConfig]; 
    [room setInvitedUser:@"[email protected]"]; 
    [room activate:[self xmppStream]];  
    [room inviteUser:jid1 withMessage:@"hello please join."]; 
    [room sendMessage:@"HELLO"]; 

użytkownik [email protected] powinien otrzymać wiadomość Zaproś

+0

dziękuję za odpowiedź, ale jest to ten sam kod, który próbowałem. Metoda "initWithRoomName" jest nieobecna w bieżącej głównej gałęzi XMPPFramework. Szukałem tej konkretnej metody wszędzie, bez skutku. Módl się, w jaki sposób udało ci się uzyskać tę metodę i której wersji tej struktury używasz? Czy możesz wskazać mi łącze, skąd mogę je pobrać (framework)? Jeśli mam właściwy oddział, mogę nim zarządzać. Dziękuję Ci. –

+0

@ Aplikacja do bildowania czatu dla połączenia lokalnego lub zdalnego? – freelancer

+0

Aplikacja, którą buduję działa przez Internet, ponieważ będzie używana przez kolegów z zespołu po drugiej stronie świata. –

0

Twój post jest stary, jednak teraz chciałbym zrobić to tak:

- (void)createRoomWithJid:(XMPPJID*)roomJID 
{ 
    XMPPRoom *xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:self.xmppRoomHybridStorage 
                  jid:roomJID 
               dispatchQueue:dispatch_get_main_queue()]; 
    [xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()]; 
    [xmppRoom activate:self.xmppStream]; 

    [xmppRoom joinRoomUsingNickname:self.xmppStream.myJID.user 
          history:nil 
          password:nil]; 
} 
0

Tworzenie czacie przez podane poniżej kodu za pomocą XMPPFRAMWORK.

let roomStorage: XMPPRoomMemoryStorage = XMPPRoomMemoryStorage() 
    /** 
    * Remember to add 'conference' in your JID like this: 
    * e.g. [email protected] 
    */ 
    let roomJID: XMPPJID = XMPPJID.jidWithString("[email protected]") 
    let xmppRoom: XMPPRoom = XMPPRoom(roomStorage: roomStorage, 
     jid: roomJID, 
     dispatchQueue: dispatch_get_main_queue()) 
    xmppRoom.activate(SKxmpp.manager().xmppStream) 
    xmppRoom.addDelegate(self, delegateQueue: dispatch_get_main_queue()) 
    xmppRoom.joinRoomUsingNickname(SKxmpp.manager().xmppStream.myJID.user, history: nil, password: nil) 
    xmppRoom.fetchConfigurationForm() 
+0

Edytuj za pomocą więcej informacji . Tylko kod i odpowiedź "spróbuj tego" są odradzane, ponieważ nie zawierają treści do wyszukiwania i nie wyjaśniają, dlaczego ktoś powinien "spróbować tego". Staramy się być źródłem wiedzy. – abarisone