2016-09-08 2 views
0

내가 xmpp_messenger_ios & xmpp_messenger_ios 스위프트 MUC는 신속

XMPPFramework

를 사용하여 아이폰 OS에 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) 
     } 
    } 
} 

}

치명적인 오류 : 예기치 않게 풀기 동안 전무 발견 옵션 값

나는 곧 그 점을 알아 챘다. 채팅방에 접속하면 이전 메시지를 가져 오므로 위의 코드가 실행됩니다.

ios에서 방 채팅을 위해 MUC를하고 있습니다. 도와주세요. 나는 수색했고 어떤 해결책도 찾지 못했다.

감사합니다.

+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

하지만 이렇게하면 단일 채팅에 영향을 미칩니다. 단일 채팅으로 메시지를 보내면 단일 채팅을 새로 고침 한 후에 만 ​​볼 수있는 메시지 –

+0

xmpp-messenger-ios 이미 oneroom 클래스에 있습니다. 어떻게 내 용도로 사용할 수 있습니까? 나는 그 수업을 사용할 수 없다. 만약 당신이 내게 알려주는 어떤 생각이있어 .. –

0

언 래핑은에서 발생 :

  • user (반환 값 userForJID 방법 XMPPUserCoreDataStorageObject!된다)

조사

  • jidStr (유형 String! 임) 어느 아무 일도 없다. user

    원인이 전무로 - userForJID에 사용되는 jid 또는 managedObjectContext의 무기 호 값 (: 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

    사용자 변수가 022 –

    +0

    그럼, 왜 사용자 변수가 없는지 알아 내. 나는 가능성을 설명했다. 'jid'와'managedObjectContext'에 대해서도 똑같이하십시오. –

    0

    먼저 XMPP MUC를 이해해야한다고 생각합니다.이 부분은 doc입니다.

    MUCRoom에 메시지를 보내면 서브가 자신을 포함한 모든 구성원에게 브로드 캐스트합니다.

    그리고 여기 message.from() = room.jid이 (가) user.jid이 아닙니다.

    그래서 user 로스터에서 가져 오려고 시도한 이유는 nil입니다.