2012-04-29 20 views
5

Tôi đang phát triển ứng dụng trò chuyện XMPP trên iOS sử dụng XMPPFramework của Robbie Hanson.MUC Cách thực hiện với XMPPFramework

Các chức năng quan trọng nhất đã được triển khai - gửi và nhận tin nhắn. Về cơ bản, tôi đã xây dựng một ứng dụng trò chuyện chức năng cơ bản, với một chút kẹo mắt tất nhiên.

Bây giờ, vấn đề tôi gặp phải liên quan đến MUC. Các mã tôi thấy từ các trang web khác cho thấy có một phương pháp initWithRoomName trong XMPPRoom. Tuy nhiên, phương pháp này là vắng mặt trong repo git tôi nhân bản. Vì vậy, thay thế cho điều này là gì? Hoặc, nếu không có, tôi làm cách nào để tạo phòng bằng cách sử dụng XMPPFramework?

Cảm ơn.

+0

bạn có thể liên kết qn với các trang web khác mà bạn đã sắp xếp không ?? –

+0

@LithuThiruvathira Bạn có thể lấy khuôn khổ từ đây: https://github.com/robbiehanson/XMPPFramework –

+0

Hãy xem câu trả lời của tôi cho câu hỏi tương tự http: // stackoverflow.com/questions/11791022/trouble-create-xmpp-muc-room-code-503-service-available/14708653 # 14708653 –

Trả lời

11

Dưới đây là làm thế nào tôi có vấn đề của riêng tôi giải quyết. Lưu ý rằng giải pháp này không liên quan đến XMPPRoom. Đầu tiên, tôi tạo ra một phương thức, tùy thuộc vào tình huống, hoặc tạo ra hoặc đi vào một căn phòng. (Theo tài liệu XMPP, yêu cầu tạo XML giống như tài liệu bạn gửi để vào phòng, nghĩa là nếu phòng chưa tồn tại khi bạn nhập, dịch vụ sẽ tạo nó cho bạn .)

Đây rồi. Đây là phương thức tạo/vào phòng. Những gì phương pháp này làm là gửi một sự hiện diện cho căn phòng mà bạn dự định tạo/nhập. Nếu bạn là người đầu tiên vào phòng và phòng chưa được tạo, bạn sẽ tự động trở thành chủ sở hữu và người kiểm duyệt của nó.

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

Tiếp theo, trong appdelegate nơi phương pháp XMPPStream được khai báo chúng tôi lọc phản ứng XML chúng tôi nhận được trong phương pháp didReceivePresence bằng cách kiểm tra mã trạng thái gửi bởi máy chủ. Nếu mã trạng thái là 201, bingo! Việc tạo phòng đã đi tốt. Mã trạng thái khác với 201 có nghĩa là những thứ khác nhau, nhưng hãy tập trung vào 201 cho mục đích của chúng tôi.

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

Sau đó, chúng tôi nói với máy chủ rằng chúng tôi đang tạo phòng loại "tức thì" có nghĩa là chúng tôi sẽ gửi phần tử IQ cho biết mặc định phòng. notifyRoomCreationOk là một phương thức được gọi trong một khung nhìn khác khi tạo phòng thành công, sau khi tất cả tôi phải ghi lại phòng trong một tệp văn bản để làm cho nó liên tục để lần sau tôi mở ứng dụng, phòng tôi đã tạo trước đó sẽ hiển thị. Trong phương thức notifyRoomCreationOk của tôi, tôi đã gửiDefaultRoomConfig, về cơ bản, mô tả những gì được nêu trong câu đầu tiên của đoạn này.

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

Đảm bảo rằng bạn đã bật XMPPStream trên chế độ xem gọi các phương thức trên, nếu không, các tính năng này sẽ không hoạt động. Thats tất cả để có nó. Vui chơi XMPP-ing!

+0

hey @Ten Go, bạn có thể chia sẻ một số mã ví dụ cho điều này không? nó rất cấp bách đối với tôi ... Cảm ơn trước –

+0

@ Suresh.D, bạn có đang tạo phòng không? Tôi có một gợi ý: đọc tài liệu được tìm thấy trong http://xmpp.org/extensions/xep-0045.html để bạn có ý tưởng về cách toàn bộ quá trình tạo phòng diễn ra. Nó rất khó khăn lúc đầu nhưng một khi bạn hiểu được trình tự tạo phòng, bạn sẽ thấy nó rất đơn giản. Sau đó, cắm mã ở trên tôi đã viết ở trên trong ứng dụng của bạn. –

+0

Vâng, tôi đã làm hài lòng những gì bạn nói, nhưng trạng thái mã sẽ trả về luôn 0.but khi tôi sử dụng một cuộc trò chuyện, trạng thái mã sẽ trả về 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"]; 

người dùng [email protected] nên nhận lời mời nhắn

+0

cảm ơn bạn đã trả lời nhưng đây là mã tương tự mà tôi đã thử. Phương thức 'initWithRoomName' không có trong nhánh chính hiện tại của XMPPFramework. Tôi đã tìm phương pháp đặc biệt này ở khắp mọi nơi để không có kết quả. Hãy cầu nguyện cho bạn biết cách bạn quản lý phương pháp này và bạn đang sử dụng phiên bản nào của khung công tác? Bạn có thể chỉ cho tôi một liên kết mà tôi có thể lấy nó (khung) từ đâu không? Nếu tôi có chi nhánh chính xác, tôi có thể quản lý nó từ đó. Cảm ơn bạn. –

+0

@TenGo r u bilding ứng dụng trò chuyện cho kết nối khu vực địa phương hoặc từ xa? – freelancer

+0

Ứng dụng Tôi đang xây dựng các công trình trên Internet vì nó sẽ được sử dụng bởi các đồng đội ở phía bên kia của thế giới. –

0

Bài đăng của bạn là cũ, tuy nhiên bây giờ tôi sẽ làm điều đó như thế này:

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

Tạo phòng chat bằng cách đưa ra dưới đây mã sử dụng 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

Vui lòng chỉnh sửa thêm thông tin . Các câu trả lời chỉ có mã và "dùng thử" này không được khuyến khích, bởi vì chúng không chứa nội dung có thể tìm kiếm được và không giải thích tại sao một người nào đó nên "thử cái này". Chúng tôi nỗ lực ở đây để trở thành một nguồn lực cho kiến ​​thức. – abarisone