xmpp_messenger_ios雨燕SWIFT MUC
我试图做一个MUC使用xmpp_messenger_ios & XMPPFrameworkxmpp_messenger_ios雨燕SWIFT MUC
的iOS这里是加入聊天室的代码。
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)
}
}
}
}
致命错误:意外发现零,同时展开一个可选值
我注意到尽快当连接到聊天室时,它会获取以前的消息,从而执行上面的代码。
请帮我出去做一个MUC聊天室的ios。我已经搜索并没有找到任何解决方案。
谢谢
我解决了这个临时解决方案。
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类已存在。如何将其用于我的目的。我无法使用该课程。如果你有任何想法让我知道.. –
解缠,导致零发生在:
user
(返回值的userForJID
方法XMPPUserCoreDataStorageObject!
)jidStr
(类型是String!
)
调查哪一个恰好是零。的user
可能的原因是零 - 的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") }
用户变量是零 –
然后,只要找出为什么用户变量为零。我已经解释了这些可能性。对'jid'和'managedObjectContext'做同样的事情 –
我想你需要首先了解XMPP MUC,请阅读。
当您向MUCRoom发送消息时,服务器会将消息广播给所有成员,包括您自己。
而这里message.from() = room.jid
但不是user.jid
。
这就是为什么user
你试图从名册中获得nil
。
致命错误在哪一行? –
if!OneChats.knownUserForJid(jidStr:user.jidStr){这是给出错误的那一行。 –
“OneChats.knownUserForJid”的返回值是什么类型? –