2012-04-29 20 views
5

मैं एक आईओएस एक्सएमपीपी चैट ऐप विकसित कर रहा हूं जो रोबी हैंनसन के एक्सएमपीपी फ्रेमवर्क का उपयोग करता है।एमयूसी एक्सएमपीपी फ्रेमवर्क के साथ कैसे करें

सबसे महत्वपूर्ण कार्यक्षमताओं को लागू किया गया है - संदेश भेजना और प्राप्त करना। असल में, मैंने पाठ्यक्रम की थोड़ी सी आंख कैंडी के साथ पहले से ही एक बुनियादी कार्यात्मक चैट ऐप बनाया है।

अब, मेरी समस्या एमयूसी के संबंध में है। अन्य वेबसाइटों से मैंने जो कोड देखे हैं, वे दिखाते हैं कि initWithRoomNameXMPPRoom में एक विधि है। हालांकि, यह विधि गिट रेपो I क्लोन में अनुपस्थित है। तो, इसका क्या विकल्प है? या, यदि कोई नहीं है, तो मैं XMPPFramework का उपयोग करके कमरे बनाने के बारे में कैसे जा सकता हूं?

धन्यवाद।

+0

क्या आप क्यूएन को अन्य साइटों से जोड़ने के लिए लिंक कर सकते हैं ?? –

+0

@LithuThiruvathira आप यहां से ढांचा प्राप्त कर सकते हैं: https://github.com/robbiehanson/XMPPFramework –

+0

इसी तरह के प्रश्न http: // stackoverflow के उत्तर पर एक नज़र डालें।कॉम/प्रश्न/11791022/परेशानी बनाने-xmpp-muc-room-code-503-service-अनुपलब्ध/14708653 # 14708653 –

उत्तर

11

नीचे कैसे मैं अपने ही समस्या हल हो गई है। ध्यान दें कि इस समाधान में XMPPRoom बिल्कुल शामिल नहीं है। सबसे पहले, मैंने एक विधि बनाई है, स्थिति के आधार पर, या तो एक कमरा बनाता है या प्रवेश करता है। (प्रति एक्सएमपीपी दस्तावेज, बनाने के लिए एक्सएमएल अनुरोध वही है जैसा कि आप एक कमरे में प्रवेश करने के लिए भेजते हैं; यानी, यदि कमरा प्रवेश करने के बाद भी मौजूद नहीं है, तो सेवा आपके लिए इसे तैयार करेगी ।)

यहां हम जाते हैं। यह वह तरीका है जो कमरे में बनाता है/प्रवेश करता है। यह विधि क्या करती है वह उस कमरे में उपस्थिति भेजती है जिसे आप बनाना/दर्ज करना चाहते हैं। यदि आप कमरे में प्रवेश करने वाले पहले व्यक्ति हैं और कमरा अभी तक नहीं बनाया गया है, तो आप स्वचालित रूप से इसके मालिक और मॉडरेटर बन जाते हैं।

- (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]; 
} 

इसके बाद, AppDelegate में जहां XMPPStream तरीकों हम XML प्रतिक्रिया हम सर्वर द्वारा भेजे गए स्थिति कोड की जाँच करके didReceivePresence विधि में प्राप्त फ़िल्टर कर घोषित कर रहे हैं। यदि स्थिति कोड 201 है, बिंगो! कमरे का निर्माण बस ठीक हो गया। 201 के अलावा स्टेटस कोड अलग-अलग चीजें हैं, लेकिन चलिए अपने उद्देश्य के लिए 201 पर ध्यान केंद्रित करते हैं।

- (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]; 
     } 
    } 
} 

फिर, हम सर्वर है कि हम क्या प्रकार "तत्काल" जिसका अर्थ है कि हम इसे कमरे चूक बता एक बुद्धि तत्व भेज देंगे के एक कमरे का निर्माण कर रहे बताओ। अधिसूचना RoomCreationOk एक अलग दृश्य में बुलाया गया एक प्रतिनिधि तरीका है जब कमरे का निर्माण सफल होता है, इसके बाद मुझे इसे लगातार फ़ाइल बनाने के लिए एक टेक्स्ट फ़ाइल में कमरा रिकॉर्ड करना होता है ताकि अगली बार जब मैं ऐप खोलूं तो पहले जो कमरा मैंने बनाया था, वह दिखाई देगा। मेरी अधिसूचना RoomCreationOk विधि में, मैंने भेजा है DefaultRoomConfig जो मूल रूप से वर्णन करता है कि इस पैराग्राफ की पहली वाक्य में क्या कहा गया है।

-(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]; 
} 

सुनिश्चित करें कि आप XMPPStream बार देखा गया है कि उपरोक्त विधियों फोन पर सक्षम किया हुआ है, अन्यथा, ये काम नहीं करेगा बनाओ। यही सब है इसके लिए। मजा करो XMPP-ing!

+0

हे @ टेन गो, क्या आप इसके लिए कुछ उदाहरण कोड साझा कर सकते हैं? यह मेरे लिए बहुत जरूरी है ... अग्रिम धन्यवाद –

+0

@ सुरेश.डी, क्या आप एक कमरा बना रहे हैं? मेरे पास एक सुझाव है: http://xmpp.org/extensions/xep-0045.html में मिले दस्तावेज़ों को पढ़ें ताकि आपको पता चल सके कि पूरे कमरे की निर्माण प्रक्रिया कैसे चलती है। यह पहली बार बहुत मुश्किल है लेकिन एक बार जब आप कमरे निर्माण अनुक्रम को समझते हैं तो आपको यह बहुत आसान लगेगा। इसके बाद, उपरोक्त कोड को ऊपर प्लग करें जिसे मैंने आपके ऐप में लिखा था। –

+0

हाँ, मैंने जो कुछ कहा है, मैंने समझा है, लेकिन कोड स्थिति हमेशा वापस आ जाएगी। लेकिन जब मैं एक से एक चैट का उपयोग करता हूं, तो कोड स्थिति वापस आ जाएगी 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"]; 

उपयोगकर्ता [email protected] को आमंत्रित संदेश प्राप्त करना चाहिए

+0

उत्तर के लिए धन्यवाद लेकिन यह वही कोड है जिसे मैंने आजमाया था। विधि 'initWithRoomName' XMPPFramework की वर्तमान मास्टर शाखा में अनुपस्थित है। मैंने हर जगह इस विशेष विधि को देखने के लिए नहीं देखा। प्रार्थना करें कि आप इस विधि को कैसे प्रबंधित करते हैं और ढांचे का कौन सा संस्करण आप उपयोग कर रहे हैं? क्या आप मुझे एक लिंक पर इंगित कर सकते हैं जहां से मैं इसे (ढांचा) प्राप्त कर सकता हूं? अगर मेरे पास सही शाखा है तो मैं इसे वहां से प्रबंधित कर सकता हूं। धन्यवाद। –

+0

@TenGo आप स्थानीय क्षेत्र कनेक्शन के लिए या रिमोट के लिए चैट ऐप बिल्डिंग कर रहे हैं? – freelancer

+0

जिस ऐप का निर्माण मैं कर रहा हूं वह इंटरनेट पर काम करता है क्योंकि इसका इस्तेमाल दुनिया के दूसरी तरफ टीम के साथी द्वारा किया जाएगा। –

0

आपका पोस्ट पुरानी है, लेकिन अब मैं इसे इस तरह करना होगा:

- (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

कोड नीचे दिए गए 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

क्या करना है कृपया अधिक जानकारी के साथ संपादित करें । केवल कोड और "इसे आज़माएं" उत्तर निराश हैं, क्योंकि उनमें कोई खोज योग्य सामग्री नहीं है, और यह समझाएं कि किसी को "इसे आजमाएं" क्यों चाहिए। हम ज्ञान के लिए संसाधन बनने के लिए यहां एक प्रयास करते हैं। – abarisone