투케이2K

549. (ios/swift5) [URLSession] [2] Websocket 웹 소켓 receive 실시간 메시지 수신 받기 처리 본문

IOS

549. (ios/swift5) [URLSession] [2] Websocket 웹 소켓 receive 실시간 메시지 수신 받기 처리

투케이2K 2024. 9. 13. 15:55

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT5

 

[소스 코드]

    // -----------------------------------------------------------------------------------------
    // [웹 소켓 통신 연결 및 ping 체크 참고 사이트]
    // -----------------------------------------------------------------------------------------
    https://blog.naver.com/kkh0977/223583023595





    // -----------------------------------------------------------------------------------------
    // [사용 방법 예시]
    // -----------------------------------------------------------------------------------------

                 C_WebSocket_Urlsession_Client_Module().onReceive(){(result, response) in
                     
                     S_Log._F_(description: "웹 소켓 실시간 메시지 수신 대기 결과", data: [response])
                     
                     if result == false {
                         
                         C_WebSocket_Urlsession_Client_Module().closeWebSocket(){(result, response) in
                             
                             S_Log._F_(description: "웹 소켓 종료 결과", data: [response])
                             
                         }
                         
                     }
                     else {
                         
                         // MARK: [실시간 메시지 수신 처리]
                         
                     }
                     
                 }





    // -----------------------------------------------------------------------------------------
    // MARK: - [SEARCH FAST] : WebSocket onReceive
    // -----------------------------------------------------------------------------------------
    func onReceive(callback: @escaping (Bool, String)->()) {
        S_Log._D_(description: self.ACTIVITY_NAME + " :: [onReceive] :: WebSocket onReceive [메시지 수신] 구독 수행", data: nil)
        
        // -----------------------------------------
        // [사전 방어 로직 작성]
        // -----------------------------------------
        if C_WebSocket_Urlsession_Client_Module.webSocketOpenFlag == false || C_WebSocket_Urlsession_Client_Module.webSocketTask == nil {
            
            // [콜백 반환]
            callback(false, self.ACTIVITY_NAME + " :: [onReceive] :: [ERROR] :: oepn false || socketTask is nil")
            return
        }
        // -----------------------------------------
        
        
        // -----------------------------------------
        // [웹소켓 메시지 수신 상태 확인]
        // -----------------------------------------
        C_WebSocket_Urlsession_Client_Module.webSocketTask!.receive { result in
            switch result {
            case .failure(let error):
                S_Log._E_(description: self.ACTIVITY_NAME + " :: [onReceive] :: webSocketTask.failure :: [메시지 수신] 구독 실패", data: ["Failed to receive message :: \(error)"])
                
                callback(false, self.ACTIVITY_NAME + " :: [onReceive] :: [ERROR] :: " + "Failed to receive message :: \(error)")
                return
            case .success(let message):
                
                switch message {
                case .string(let text):
                    S_Log._D_(description: self.ACTIVITY_NAME + " :: [onReceive] :: webSocketTask.receive :: [메시지 수신] :: string", data: [text])
                    
                    // [콜백 반환]
                    callback(true, text) // MARK: [콜백 반환]
                    
                    // MARK: [중요] : [실시간 메시지 감지 위해 이벤트 재등록]
                    self.onReceive(){(result, response) in
                        callback(result, response) // [콜백 반환]
                    }
                    
                case .data(let data):
                    S_Log._D_(description: self.ACTIVITY_NAME + " :: [onReceive] :: webSocketTask.receive :: [메시지 수신] :: data", data: nil)
                @unknown default:
                    S_Log._D_(description: self.ACTIVITY_NAME + " :: [onReceive] :: webSocketTask.receive :: [메시지 수신] :: @unknown", data: nil)
                }
                
            }
        }
        
    }
 

[결과 출력]

 

 

반응형
Comments