Я пытаюсь сделать MUC на iOS, используя xmpp_messenger_ios и 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)
}

Как только этот блок запускается, я получаю ошибку в этом коде:

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

}

Фатальная ошибка: неожиданно найденное ноль при разворачивании факультативного значения

Я заметил, что как только устанавливается соединение с комнатой чата, он извлекает предыдущие сообщения, и, таким образом, выполняется приведенный выше код.

Пожалуйста, помогите мне сделать MUC для чат-комнаты на ios. Я искал и не нашел решения.

Благодарность

0
ramit wadhwa 8 Сен 2016 в 16:50

3 ответа

Лучший ответ

Я решил это временным решением.

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, это можно сделать.

0
ramit wadhwa 9 Сен 2016 в 04:43

Я думаю, вам нужно сначала понять XMPP MUC, прочтите этот документ.

Когда вы отправляете сообщение в MUCRoom, сервер будет транслировать сообщение всем участникам, включая вас.

А здесь message.from() = room.jid НО НЕ user.jid.

Вот почему user, который вы пытались получить из списка, это nil.

0
dichen 11 Ноя 2016 в 23:39

Распаковка, приводящая к нулю, происходит:

  • user (возвращаемое значение метода userForJID: XMPPUserCoreDataStorageObject!)

  • jidStr (тип String!)

Выясните, какой из них равен нулю.

Возможные причины, по которым user равен нулю - Значение Nil 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") }
0
Fredric Sanjaya 13 Окт 2016 в 12:03