代码之家  ›  专栏  ›  技术社区  ›  ramit wadhwa

xmpp_messenger_ios Swift MUC Swift

  •  0
  • ramit wadhwa  · 技术社区  · 10 年前

    我正在尝试使用xmpp_messenger_iOS&在iOS上执行MUC;XMPP框架

    这是加入房间的密码。

       func createOrJoinRoomOnXMPP(){
        // location has named array of lat and long
    
        NSLog("Creating room on XMPP")
    
        let roomJID: XMPPJID = XMPPJID.jidWithString(self.roomID + "@conference.ip-172-31-41-100")
    
        let roomData: XMPPRoomCoreDataStorage = XMPPRoomCoreDataStorage.sharedInstance()
    
        let chatRoom = XMPPRoom.init(roomStorage: roomData, jid: roomJID, dispatchQueue: dispatch_get_main_queue())
    
        chatRoom.activate(OneChat.sharedInstance.xmppStream)
        chatRoom.addDelegate(self, delegateQueue: dispatch_get_main_queue())
    
        //        let history = DDXMLElement.elementWithName("history")
        //        // Get lst messegs of the room
        //        history.addAttributeWithName("maxstanzas", stringValue: "10")
    
        chatRoom.joinRoomUsingNickname(OneChat.sharedInstance.xmppStream!.myJID.user, history: nil)
    }
    

    一旦执行此块,我就会在该代码中得到一个错误:

    扩展名OneMessage:XMPPStreamDelegate{

    public func xmppStream(sender: XMPPStream, didSendMessage message: XMPPMessage) {
        if let completion = OneMessage.sharedInstance.didSendMessageCompletionBlock {
            completion(stream: sender, message: message)
        }
        //OneMessage.sharedInstance.didSendMessageCompletionBlock!(stream: sender, message: message)
    }
    
    public func xmppStream(sender: XMPPStream, didReceiveMessage message: XMPPMessage) {
        let user = OneChat.sharedInstance.xmppRosterStorage.userForJID(message.from(), xmppStream: OneChat.sharedInstance.xmppStream, managedObjectContext: OneRoster.sharedInstance.managedObjectContext_roster())
    
        if !OneChats.knownUserForJid(jidStr: user.jidStr) { // <<< ERROR LINE
            OneChats.addUserToChatList(jidStr: user.jidStr)
        }
    
        if message.isChatMessageWithBody() {
            OneMessage.sharedInstance.delegate?.oneStream(sender, didReceiveMessage: message, from: user)
        } else {
            //was composing
            if let _ = message.elementForName("composing") {
                OneMessage.sharedInstance.delegate?.oneStream(sender, userIsComposing: user)
            }
        }
    }
    

    }

    致命错误:在展开可选值时意外找到nil

    我注意到,一旦连接到聊天室,它就会获取以前的消息,从而执行上面的代码。

    请帮我在ios上做一个房间聊天的MUC。我已经搜索过了,但没有找到任何解决方案。

    3 回复  |  直到 10 年前
        1
  •  0
  •   ramit wadhwa    10 年前

    我用这个临时解决方案解决了这个问题。

    extension OneMessage: XMPPStreamDelegate {
    
        public func xmppStream(sender: XMPPStream, didSendMessage message: XMPPMessage) {
            if let completion = OneMessage.sharedInstance.didSendMessageCompletionBlock {
                completion(stream: sender, message: message)
            }
            //OneMessage.sharedInstance.didSendMessageCompletionBlock!(stream: sender, message: message)
        }
    
        public func xmppStream(sender: XMPPStream, didReceiveMessage message: XMPPMessage) {
            NSLog("This is blocked")
    
    //      let user = OneChat.sharedInstance.xmppRosterStorage.userForJID(message.from(), xmppStream: OneChat.sharedInstance.xmppStream, managedObjectContext: OneRoster.sharedInstance.managedObjectContext_roster())
    //      
    //      if !OneChats.knownUserForJid(jidStr: user.jidStr) {
    //          OneChats.addUserToChatList(jidStr: user.jidStr)
    //      }
    //      
    //      if message.isChatMessageWithBody() {
    //          OneMessage.sharedInstance.delegate?.oneStream(sender, didReceiveMessage: message, from: user)
    //      } else {
    //          //was composing
    //          if let _ = message.elementForName("composing") {
    //              OneMessage.sharedInstance.delegate?.oneStream(sender, userIsComposing: user)
    //          }
    //      }
        }
    }
    

    以及在ViewController中处理传入消息。

    这不是正确的方法。但在ProcessOne为MUC提供支持之前,这是可以做到的。

        2
  •  0
  •   Fredric Ketan    10 年前

    导致零的拆解发生在:

    • user (返回值为 userForJID 方法是 XMPPUserCoreDataStorageObject! )

    • jidStr (类型为 String! )

    调查哪一个恰好为零。

    可能的原因 使用者 为零 -的零值 jid 或 managedObjectContext 用于userForJID(:xmppStream:managedObjectContext)`

    要找出哪一个为零,只需执行以下操作:

    guard let user = OneChat.sharedInstance.xmppRosterStorage.userForJID(message.from(), xmppStream: OneChat.sharedInstance.xmppStream, managedObjectContext: OneRoster.sharedInstance.managedObjectContext_roster())
    else { fatalError("user is nil") }
    
    guard let userJIDStr = user.jidStr
    else { fatalError("jidStr is nil") }
    
        3
  •  0
  •   dichen    9 年前

    我认为您需要先了解XMPP MUC,请阅读以下内容 doc .

    当您向MUCRoom发送消息时,服务将向所有成员(包括您自己)广播消息。

    在这里 message.from() = room.jid 但不是 user.jid .

    这就是为什么 user 你想从花名册上得到的是 nil .