【问题标题】:xmpp_messenger_ios Swift MUC swiftxmpp_messenger_ios Swift MUC swift
【发布时间】:2017-01-16 11:51:54
【问题描述】:

我正在尝试使用 xmpp_messenger_ios 和 XMPPFramework 在 iOS 上做一个 MUC

这是加入房间的代码。

   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。我已经搜索了,但没有找到任何解决方案。

谢谢

【问题讨论】:

  • 致命错误发生在哪一行?
  • if !OneChats.knownUserForJid(jidStr: user.jidStr) { 这是给出错误的行。
  • OneChats.knownUserForJid的返回值是什么类型?
  • 我没有。
  • 嗨@ramitwadhwa .. 我正在使用你在帖子中提到的相同的 pod 文件.. bt 不能进行 muc 聊天.....希望你已经做到了.. 如果你有它的演示项目发送给我的朋友..我卡在粘液中..没有关于这个的参考帖子..帮助我..

标签: swift xmpp xmppframework multiuserchat


【解决方案1】:

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

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 之前,这是可以做到的。

【讨论】:

  • 如果有人找到更好的解决方案,请在此处发布。
  • 但是这样做会影响单次聊天。如果您在单聊中发送消息,则该消息只有在刷新单聊后才能看到
  • 在 xmpp-messenger-ios 中已经有 oneroom 类了。我怎样才能将它用于我的目的。我无法使用该课程。如果您有任何想法,请告诉我..
【解决方案2】:

导致 nil 的展开发生在:

  • useruserForJID方法的返回值为XMPPUserCoreDataStorageObject!

  • jidStr(类型为String!

调查哪一个恰好是 nil。

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

要找出哪个是 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") }

【讨论】:

  • 用户变量为零
  • 然后,弄清楚为什么用户变量为nil。我已经解释了可能性。只需对 jidmanagedObjectContext 执行相同操作
【解决方案3】:

我认为你需要先了解 XMPP MUC,阅读此doc

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

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

这就是为什么您尝试从名册中获得的usernil

【讨论】:

    猜你喜欢
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多