xmpp_messenger_ios Swift MUC迅速

时间:2016-09-08 13:50:49

标签: swift xmpp xmppframework multiuserchat

我正在尝试使用xmpp_messenger_ios&在iOS上进行MUC XMPPFramework

这是加入房间的代码。

   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 个答案:

答案 0 :(得分:0)

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

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)
//          }
//      }
    }
}

阻止OneMessage.swift代码。

并在我的ViewController中处理传入的消息。

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

答案 1 :(得分:0)

解缠导致nil发生在:

  • useruserForJID方法的返回值为XMPPUserCoreDataStorageObject!

  • jidStr(类型为String!

调查哪一个恰好是零。

user为零的可能原因 - 在userForJID(:xmppStream:managedObjectContext)中使用了jidmanagedObjectContext的Nil值`

要找出哪一个是零,只需这样做:

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") }

答案 2 :(得分:0)

我认为您需要首先了解XMPP MUC,请阅读此doc

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

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

这就是为什么你试图从名册中获得的usernil