2016-09-08 5 views
0

はルームに参加するためのコードです。xmpp_messenger_iosスウィフトMUCは、私がここでxmpp_messenger_ios & XMPPFramework</p> <p>を使用して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を見出さオプションの値

私はすぐにそれに気付きましたチャットルームに接続すると前のメッセージがフェッチされ、上記のコードが実行されます。

私はルームチャットのためのMUCをiosで行っています。私は検索し、解決策を見つけていない。

ありがとう

+0

致命的なエラーはどの行にありますか? –

+0

if!OneChats.knownUserForJid(jidStr:user.jidStr){これはエラーを返す行です。 –

+0

'OneChats.knownUserForJid'の戻り値はどんな型ですか? –

答えて

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をサポートするまで、これを行うことができます。

+0

もし誰かがより良い解決策を見つけたら、ここに投稿してください。 –

+0

ですが、これを行うことでシングルチャットに影響します。あなたが1つのチャットでメッセージを送信した場合、そのメッセージは1つのチャットをリフレッシュした後に見ることができます –

+0

xmpp-messenger-iosで既にoneroomクラスにあります。私はそのクラスを使用することができません。もしあなたが私に知らせてくれたら.. –

0

ゼロがで発生させるアンラッピング:

  • useruserForJIDメソッドの戻り値がXMPPUserCoreDataStorageObject!である)

  • jidStr(タイプString!である)

どちらを調査起こらない。 user

考えられる原因は nilをする - userForJIDに使用されているjidまたはmanagedObjectContextのnilの値(:xmppStream:managedObjectContextを) `

は1が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") } 
+0

ユーザー変数はnil –

+0

です。次に、なぜユーザー変数がnilであるのかを理解してください。私は可能性について説明しました。 'jid'と' managedObjectContext'に対しても同じことをしてください –

0

まずXMPP MUCを理解する必要があると思いますが、これは​​です。

メッセージをMUCRoomに送信すると、メッセージは自分自身を含むすべてのメンバーにメッセージをブロードキャストします。

そしてここにmessage.from() = room.jidしかし、user.jidです。

だから、userあなたがロスターから取得しようとしたのはnilです。

関連する問題